Pygame 碰撞盒不随矩形移动

问题描述 投票:0回答:0

你好,我只是想用 pygame 作为一个项目重新创建 pong。

出于某种原因,当我使用当前代码移动任一桨时,实际矩形不会随图像一起移动。

这是我的代码

import pygame
import sys
import random

# Objects
class Player1(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('paddle.png')
        self.rect = self.image.get_rect(center = (200, 360))

    def player_input(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_w]:
            self.rect.y += -5
            if self.rect.top < 0:
                self.rect.top = 0
        if key[pygame.K_s]:
            self.rect.y += 5
            if self.rect.bottom > 720:
                self.rect.bottom = 720

    def update(self):
        self.player_input()

class Player2(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('paddle.png')
        self.rect = self.image.get_rect(center = (1080, 360))

    def player_input(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_UP]:
            self.rect.y -= 5
            if self.rect.top < 0:
                self.rect.top = 0
        if key[pygame.K_DOWN]:
            self.rect.y += 5
            if self.rect.bottom > 720:
                self.rect.bottom = 720

    def update(self):
        self.player_input()

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('ball.png')
        self.rect = self.image.get_rect(center = (640, random.randint(10, 710)))

        direction = [-1, 1]
        self.x_direction = random.choice(direction)
        self.y_direction = random.choice(direction)
        self.speed = 5
        self.collision_tolerance = 10

    def move(self):
        self.rect.x += self.x_direction * self.speed
        self.rect.y += self.y_direction * self.speed

        if self.rect.top < 0:
            self.rect.top = 0
            self.y_direction *= -1
        if self.rect.bottom > 720:
            self.rect.bottom = 720
            self.y_direction *= -1
        if self.rect.left < 0:
            self.rect.left = 0
            self.x_direction *= -1
        if self.rect.right > 1280:
            self.rect.right = 1280
            self.x_direction *= -1

        if pygame.Rect.colliderect(self.rect, Player1().rect):
            print(abs(self.rect.left - Player1().rect.right))
            if abs(self.rect.left - Player1().rect.right) < self.collision_tolerance:
                self.x_direction *= -1
        if pygame.Rect.colliderect(self.rect, Player2().rect):
            print(abs(self.rect.right - Player2().rect.left))
            if abs(self.rect.right - Player2().rect.left) < self.collision_tolerance:
                self.x_direction *= -1

    def update(self):
        self.move()

# pygame setup
pygame.init()
height, width = 1280, 720
screen = pygame.display.set_mode((height, width))
clock = pygame.time.Clock()
running = True
black = (0, 0, 0)

# Groups
players = pygame.sprite.Group()
players.add(Player1(), Player2())

ball = pygame.sprite.GroupSingle()
ball.add(Ball())

while running:
    # poll for events
    # pygame.QUIT event means the user clicked X to close your window
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # fill the screen with a color to wipe away anything from last frame
    screen.fill(black)

    # RENDER YOUR GAME HERE
    players.draw(screen)
    players.update()

    ball.draw(screen)
    ball.update()

    # flip() the display to put your work on screen
    pygame.display.update()

    clock.tick(60)  # limits FPS to 60

pygame.quit()

Example of The hitbox not moving.

我尝试将代码移到 sprite 之外并移到它自己的函数中,但这完全阻止了碰撞工作

def collision():
        if pygame.Rect.colliderect(Ball().rect, Player1().rect):
            print(abs(Ball().rect.left - Player1().rect.right))
            if abs(Ball().rect.left - Player1().rect.right) < Ball().collision_tolerance:
                Ball().x_direction *= -1
        if pygame.Rect.colliderect(Ball().rect, Player2().rect):
            print(abs(Ball().rect.right - Player2().rect.left))
            if abs(Ball().rect.right - Player2().rect.left) < Ball().collision_tolerance:
                Ball().x_direction *= -1

改变玩家精灵中的这条线会将矩形放在其他地方

self.rect = self.image.get_rect(center = (200, 360))

我仍然不明白为什么 player_input 方法不会更新实际的矩形碰撞框。

python-3.x pygame collision
© www.soinside.com 2019 - 2024. All rights reserved.