PyGame碰撞工作但精灵被重置 - 动作不能继续。

时间:2015-07-13 09:44:22

标签: python pygame

我的PyGame实验游戏出了问题 - 我正在学习如何使用精灵。

我一直试图在精灵(球和桨)之间编码'碰撞'检测,并设法使碰撞检测工作,但我的球精灵似乎重置了它的位置而不是继续。任何人都可以看看我的错误在哪里?

这是我的代码:

import pygame

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)

#variables, constants, functions
x = 1
y = 1
x_vel = 10
y_vel = 10

bat_x = 1
bat_y = 1
bat_x_vel = 0
bat_y_vel = 0

score = 0

class Ball(pygame.sprite.Sprite):
    """
    This class represents the ball.
    It derives from the "Sprite" class in Pygame.
    """
    def __init__(self, width, height):
        """ Constructor. Pass in the color of the block,
        and its x and y position. """
        # Call the parent class (Sprite) constructor
        super().__init__()
        # Set the background color and set it to be transparent
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)

        # Draw the ellipse
        pygame.draw.ellipse(self.image, (255,0,0), [0,0,width,height], 10)

        # Fetch the rectangle object that has the dimensions of the image
        # image.
        # Update the position of this object by setting the values
        # of rect.x and rect.y
        self.rect = self.image.get_rect()

        # Instance variables that control the edges of where we bounce
        self.left_boundary = 0
        self.right_boundary = 0
        self.top_boundary = 0
        self.bottom_boundary = 0

        # Instance variables for our current speed and direction
        self.vel_x = 5
        self.vel_y = 5

    def update(self):
        """ Called each frame. """
        self.rect.x += self.vel_x
        self.rect.y += self.vel_y

        if self.rect.right >= self.right_boundary or self.rect.left <= self.left_boundary:
            self.vel_x *= -1

        if self.rect.bottom >= self.bottom_boundary or self.rect.top <= self.top_boundary:
            self.vel_y *= -1


class Paddle(pygame.sprite.Sprite):
    """
    This class represents the ball.
    It derives from the "Sprite" class in Pygame.
    """
    def __init__(self, width, height):
        """ Constructor. Pass in the color of the block,
        and its x and y position. """
        # Call the parent class (Sprite) constructor
        super().__init__()
        # Set the background color and set it to be transparent
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)

        # Draw the rectangle
        pygame.draw.rect(self.image, (0, 255, 0), [0, 0, width, height], 0)

        # Fetch the rectangle object that has the dimensions of the image
        # image.
        # Update the position of this object by setting the values
        # of rect.x and rect.y
        self.rect = self.image.get_rect()

        # Instance variables for our current speed and direction
        self.x_vel = 0
        self.y_vel = 0

    def update(self):
        # Get the current mouse position. This returns the position
        # as a list of two numbers.
        self.rect.x = self.rect.x + self.x_vel
        self.rect.y = self.rect.y + self.y_vel


#initialise ball and paddle
paddle = Paddle(20, 100)
ball = Ball(100,100)

# This is a list of every sprite.
# All blocks and the player block as well.
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(ball)
all_sprites_list.add(paddle)
ball_sprites_list = pygame.sprite.Group()
ball_sprites_list.add(ball)

# Initialize Pygame
pygame.init()

# Set the height and width of the screen
screen_width = 700
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))

# Used to manage how fast the screen updates
clock = pygame.time.Clock()

# Loop until the user clicks the close button.
done = False

# -------- Main Program Loop -----------
while not done:
    # --- Events code goes here (mouse clicks, key hits etc)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                paddle.y_vel = -3
            if event.key == pygame.K_DOWN:
                paddle.y_vel = 3

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                paddle.y_vel = 0
            if event.key == pygame.K_DOWN:
                paddle.y_vel = 0

    # --- Game logic should go here
    # Calls update() method on every sprite in the list
    all_sprites_list.update()

    # collision check
    ball_hit_list = pygame.sprite.spritecollide(paddle, ball_sprites_list, False)

    # Check the list of collisions.
    for ball in ball_hit_list:
        score +=1
        print(score)

    # --- Clear the screen
    screen.fill((255,255,255))

    # --- Draw all the objects
    all_sprites_list.draw(screen)

    # render text
    myfont = pygame.font.SysFont("monospace", 15)
    label = myfont.render(str(score), 1, (0,0,0))
    screen.blit(label, (100, 100))

    # --- Update the screen with what we've drawn.
    pygame.display.flip()

    # --- Limit to 60 frames per second
    clock.tick(60)

pygame.quit()

1 个答案:

答案 0 :(得分:-1)

对不起,

找到了错误。

没有正确设置窗口的边界。

# Instance variables that control the edges of where we bounce
self.left_boundary = 0
self.right_boundary = 700
self.top_boundary = 0
self.bottom_boundary = 400