Нужно заставить работать черную дыру, должен столкнуться с мячом - PullRequest
0 голосов
/ 09 ноября 2019

Мне нужно получить черную дыру посередине, чтобы она могла столкнуться с мячом и закончить игру, но я не уверен, как это сделать.

Пробовал несколько вещей в прошлом,но я забыл, что делать, я возвращаюсь к этой задаче в конце года.

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

Несколько месяцев назад я пробовал несколько вещей, но возвращаюсь кэто задание в конце года, и ему нужна помощь в его завершении.

import random
import sys

import pygame

hole = pygame.image.load('hole.png')

class Paddle(pygame.Rect):
    def __init__(self, velocity, up_key, down_key, *args, **kwargs):
        self.velocity = velocity
        self.up_key = up_key
        self.down_key = down_key
        super().__init__(*args, **kwargs)

    def move_paddle(self, board_height):
        keys_pressed = pygame.key.get_pressed()

        if keys_pressed[self.up_key]:
            if self.y - self.velocity > 0:
                self.y -= self.velocity

        if keys_pressed[self.down_key]:
            if self.y + self.velocity < board_height - self.height:
                self.y += self.velocity


class Ball(pygame.Rect):
    def __init__(self, velocity, *args, **kwargs):
        self.velocity = velocity
        self.angle = 0
        super().__init__(*args, **kwargs)

    def move_ball(self):
        self.x += self.velocity
        self.y += self.angle


class Pong:
    HEIGHT = 400
    WIDTH = 600

    PADDLE_WIDTH = 10
    PADDLE_HEIGHT = 100

    BALL_WIDTH = 10
    BALL_VELOCITY = 10
    BALL_ANGLE = 0

    COLOUR = (255, 255, 255)

    def __init__(self):
        pygame.init()  # Start the pygame instance.

        # Setup the screen
        self.screen = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        self.clock = pygame.time.Clock()

        # Create the player objects.

        self.paddles = []
        self.balls = []
        self.paddles.append(Paddle(  # The left paddle
            self.BALL_VELOCITY,
            pygame.K_w,
            pygame.K_s,
            0,
            self.HEIGHT / 2 - self.PADDLE_HEIGHT / 2,
            self.PADDLE_WIDTH,
            self.PADDLE_HEIGHT
        ))

        self.paddles.append(Paddle(  # The right paddle
            self.BALL_VELOCITY,
            pygame.K_UP,
            pygame.K_DOWN,
            self.WIDTH - self.PADDLE_WIDTH,
            self.HEIGHT / 2 - self.PADDLE_HEIGHT / 2,
            self.PADDLE_WIDTH,
            self.PADDLE_HEIGHT
        ))

        self.balls.append(Ball(
            self.BALL_VELOCITY,
            self.WIDTH / 2 - self.BALL_WIDTH / 2,
            self.HEIGHT / 2 - self.BALL_WIDTH / 2,
            self.BALL_WIDTH,
            self.BALL_WIDTH
         ))

        self.central_line = pygame.Rect(self.WIDTH/2, 0, 1, self.HEIGHT)

    def check_ball_hits_wall(self):
        for ball in self.balls:
            if ball.x > self.WIDTH or ball.x < 0:
                sys.exit(1)

            if ball.y > self.HEIGHT - self.BALL_WIDTH or ball.y < 0:
                ball.angle = -ball.angle

    def check_ball_hits_paddle(self):
        for ball in self.balls:
            for paddle in self.paddles:
                if ball.colliderect(paddle):
                    ball.velocity = -ball.velocity
                    ball.angle = random.randint(-10, 10)
                    break


    def game_loop(self):
        while True:
            for event in pygame.event.get():
                # Add some extra ways to exit the game.
                if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                    return

            self.check_ball_hits_paddle()
            self.check_ball_hits_wall()

            # Redraw the screen.
            self.screen.fill((0, 0, 0))
            self.screen.blit(hole,(235, 150))

            for paddle in self.paddles:
                paddle.move_paddle(self.HEIGHT)
                pygame.draw.rect(self.screen, self.COLOUR, paddle)

            # We know we're not ending the game so lets move the ball here.
            for ball in self.balls:
                ball.move_ball()
                pygame.draw.rect(self.screen, self.COLOUR, ball)

            pygame.draw.rect(self.screen, self.COLOUR, self.central_line)

            pygame.display.flip()
            self.clock.tick(60)


if __name__ == '__main__':
    pong = Pong()
    pong.game_loop()

Ожидаемый результат состоит в том, что, когда мяч сталкивается с черной дырой в середине, игра заканчивается либо замораживанием, либо закрытием. игра. Черная дыра используется в качестве изображения. named hole.png

1 Ответ

0 голосов
/ 09 ноября 2019

Вы должны создать pygame.mask из изображения «дыры» и прямоугольника шара и проверить, перекрываются ли маски на .overlap().

Создание маски «дыры»:

hole = pygame.image.load('hole.png')
hole_mask = pygame.mask.from_surface(hole.convert_alpha())

Создание маски «шара» внутри конструктора класса Ball. Обратите внимание, что маска полностью установлена, потому что шар представляет собой прямоугольник, но, возможно, позже он станет круглой.

class Ball(pygame.Rect):
    def __init__(self, velocity, *args, **kwargs):
        self.velocity = velocity
        self.angle = 0
        super().__init__(*args, **kwargs)

        self.image = pygame.Surface(self.size)
        #pygame.draw.rect(self.image, 255, (0, 0, *self.size))
        self.image.fill(255)
        self.mask = pygame.mask.from_surface(self.image.convert_alpha())

Добавьте метод к классу Pong, который проверяет, перекрывается ли шар сдыра. Для этого вам необходимо рассчитать смещение шарика к лунке:

class Pong:

    # [...]

    def check_ball_hits_hole(self):

        hole_rect = hole.get_rect(topleft=(235, 150))
        for ball in self.balls:
            offset = (ball.x - hole_rect.x), (ball.y - hole_rect.y)
            if hole_mask.overlap(ball.mask, offset):
                # hit is detected
                # [...]

    def game_loop(self):
        while True:

            # [...]

            self.check_ball_hits_paddle()
            self.check_ball_hits_wall()
            self.check_ball_hits_hole()

            # [...]
...