我正在使用名为 Pixel 的简单渲染框架在我的 Go 游戏中实现圆形碰撞。
碰撞适用于形状,例如绘制的圆
但是当我尝试将它用于图像而不是渲染形状时,它认为它在到达图像之前会发生轻微碰撞。图片越大,误差越大。
这是它在图像上发生碰撞的地方:
碰撞是这样完成的:
[s 是太阳能电池板,在“小图”中看到,p 是播放器。]
math.Pow(math.Pow(s.center.X-p.center.X, 2)+math.Pow(s.center.Y-p.center.Y, 2), 0.5) <= s.size.X
每张图片的size.X和size.Y都是一样的,因为都是圆
中心计算正确,这条线适用于形状 [您可以在第一张图片中看到黄色轮廓,这就是它适用的形状。]
我做错了什么吗?在计算与图像本身无关的情况下,为什么会出现这样的错误?
这是图像的渲染方式,我认为问题出在某种程度上:
[g 是生成器,见“大图”
func (g Generator) render(win *pixelgl.Window, imd *imdraw.IMDraw) {
mat := pixel.IM.
Moved(g.center)
g.sprite.Draw(win, mat)
}
形状也是基于它的中心绘制的。
最佳答案
如果两个碰撞物体都是半径为R1和R2的圆,则碰撞发生在
math.Pow(math.Pow(s.center.X-p.center.X, 2)+math.Pow(s.center.Y-p.center.Y, 2), 0.5) <=
s.radius + p.radius
什么是 s.size
- 图片正方形?在这种情况下,您必须使用 size/2
来获取半径。
为什么忽略 p
的大小/半径?
这两个原因一起可能会导致所描述的行为(当中心距离变得等于 s
边大小时碰撞条件触发)
关于go - 我游戏中的圆形碰撞比图像略大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56161334/