私はPygameを学ぶために簡単なBreakout/Arkanoidゲームを作っています。私はパドルとボールの長方形が適切に衝突していない問題にぶつかっています。ボールスプライトとブリックが視覚的に重なっていても、2本のブリックの間でボールを撃つと、ボールがブリックに衝突しないことに気付きました。このスニペットはボールの.update
メソッドで、パドルとレンガのリストを渡します。Pygame rect.contains衝突が検出されない
new_pos = self.__calc_pos()
# Check for collision with walls
if not self.area.contains(new_pos):
self.angle = -self.angle
new_pos = self.__calc_pos()
else:
# Check for collision with paddle
if paddle.rect.contains(new_pos):
self.angle = -self.angle
new_pos = self.__calc_pos()
# Check for collision with bricks
for brick in bricks:
if brick.rect.contains(new_pos):
self.angle = -self.angle
new_pos = self.__calc_pos()
brick.kill()
bricks.remove(brick)
self.rect = new_pos
.__calc_pos
方法:
def __calc_pos(self):
new_x = int(math.cos(math.radians(self.angle))) * self.speed
new_y = -int(math.sin(math.radians(self.angle))) * self.speed
return self.rect.move(new_x, new_y)
あなたの '.contains()'メソッドはどのように見えますか? – ospahiu
'contains'は、あるrectが完全に別のrectの内側にある場合にチェックします。一方のオブジェクトが他のオブジェクトに部分的にしか接触しない場合はtrueになりません。 'colliderect()'を使用してください。 – furas