Я понятия не имею, почему функция коллизии работает только тогда, когда было удалено четное количество плиток
Я пробовал складывать плитки в два ряда, так что 2 уничтожаются каждый раз, но из-за этого сложно контролировать x, y движение Также попытался переместить плитки в новый массив, а затем удалить эти плитки по 2 за раз, но затем игрок должен дождаться, пока 2 плитки не будут поражены, прежде чем они исчезнут
Было удалено много кода, чтобы сделать это более читабельный. Если вам все это нужно, спрашивайте.
class Ball:
WIDTH = BALL_IMG.get_width()
HEIGHT = BALL_IMG.get_height()
def collide_paddle(self, paddle):
ball_mask = pygame.mask.from_surface(self.IMG)
paddle_mask = paddle.get_mask()
paddle_offset = (paddle.x - self.x, paddle.y - round(self.y))
p_point = ball_mask.overlap(paddle_mask, paddle_offset)
if p_point:
return True
return False
def collide_tile(self, tile):
ball_mask = pygame.mask.from_surface(self.IMG)
tile_mask = tile.get_mask()
tile_offset = (tile.x - self.x, tile.y - round(self.y))
t_point = ball_mask.overlap(tile_mask, tile_offset)
if t_point:
return True
return False
class Paddle:
WIDTH = PADDLE_IMG.get_width()
HEIGHT = PADDLE_IMG.get_height()
def get_mask(self):
return pygame.mask.from_surface(self.IMG)
class Tile:
WIDTH = TILE_IMG.get_width()
HEIGHT = TILE_IMG.get_height()
def get_mask(self):
return pygame.mask.from_surface(self.img)
def main():
ball = Ball(625, 635)
paddle = Paddle(600, 665)
tiles = []
for i in range(17):
for j in range(7):
tiles.append(Tile(12 + (70 * i), 40 + (40 * j)))
run = True
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
quit()
rem = []
for tile in tiles:
if ball.collide_paddle(paddle) and (ball.x + ball.WIDTH) < paddle.x - 1:
ball.X_VEL = ball.X_VEL * -1
elif ball.collide_paddle(paddle) and ball.x > (paddle.x + paddle.WIDTH - 1):
ball.X_VEL = ball.X_VEL * -1
elif ball.collide_paddle(paddle):
ball.Y_VEL = ball.Y_VEL * -1
if ball.collide_tile(tile) and (ball.x + ball.WIDTH) < tile.x + 1:
ball.X_VEL = ball.X_VEL * -1
score += 1
tile.density -= 1
elif ball.collide_tile(tile) and ball.x > (tile.x + tile.WIDTH - 1):
ball.X_VEL = ball.X_VEL * -1
score += 1
tile.density -= 1
elif ball.collide_tile(tile):
ball.Y_VEL = ball.Y_VEL * -1
score += 1
tile.density -= 1
if tile.density < 1:
rem.append(tile)
for r in rem:
tiles.remove(r)
paddle.move()
ball.move()
draw_window(win, score, ball, ROUND, paddle, tiles)
main()