Когда я удаляю нечетное количество объектов из плиток [], функция коллизии в pygame не работает для моего весла. - PullRequest
0 голосов
/ 04 августа 2020

Я понятия не имею, почему функция коллизии работает только тогда, когда было удалено четное количество плиток

Я пробовал складывать плитки в два ряда, так что 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()
...