此问题再次出现在PyParticles4上 Link to last question for reference
评论如果不清楚......
我正在制作一个射击游戏,就像this一样,但是在一个平坦的土地上,每一个转弯都会改变它的高度(游戏中有趣的东西)和2个玩家,每个都有一个可以在每个转弯处移动一些距离(有一个限制,并且它们不能从其起始位置移动超过一定量)的加农炮(玩家决定他是否希望移动)。
到目前为止我的代码(对于子弹和射手)
class Bullet(PyParticles.Particle):
def hit(self,shooterlist):
for shoot in shooterlist:
#confusion
dist = math.hypot(dx,dy)
# other funcs to added
class Shooter:
def __init__(self,pos,size):
self.rect = pygame.Rect(pos,size)
# other funcs to added
子弹与射手的碰撞。关于如何知道子弹与矩形碰撞的任何想法?
有人建议我查看矩形边缘的所有点,看看它是否在圆圈内,但看起来很慢。
我认为更快的东西会更好..
..
..
的更新
圆圈周围可以有一个矩形,如果与矩形相撞,我现在知道矩形接近圆圈,甚至可能触摸它。我如何向前移动?(Thx to PygameNerd)
答案 0 :(得分:1)
我不确定你的问题是什么意思,但我认为你需要colliderect
函数。
rect.colliderect(rect): Return bool
将它放在某处的代码中,如果它返回true,则让球爆炸。
答案 1 :(得分:1)
每次colliderect
返回true时,您都可以运行另一个测试。该测试可以有几种选择。一个类似于你已经收到的建议但是墙壁和圆圈已经切换。检查圆周上的点,看看是否有一个点使用Rect.collidepoint
与墙碰撞。在pygame中,您可以通过从圆形表面创建Mask
并运行Mask.outline
来获取圆周点列表。你可能不需要每一点,所以你可以得到每一个点。实际上,您可能只需要圆的rect的边缘的中点,您可以从Rect
对象本身获得。
您要求进行精确碰撞,这样可以在圆形和矩形之间进行像素完美碰撞检测。但是,你可能不需要在游戏中使用它,所以我建议先尝试colliderect
。如果您对pygame中的碰撞检测感兴趣,那么有很多选项可以直接在Mask
和Sprite
文档中描述的函数中实现或基于这些函数。
答案 2 :(得分:0)
您可以将Rect.collidepoint与圆心一起使用,但使矩形更大
collide_rect = Rect(x - p.radius,y - p.radius,w + 2 * p.radius,h + 2 * p.radius)
if collide_rect.collide_point(p.pos):
# Collision Resolution