你好,我只是想用 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()
我尝试将代码移到 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 方法不会更新实际的矩形碰撞框。