python - pygame 不使用按键更新 draw.rect,即使 x 和 y 值正在更新
问题描述
我对编程很陌生,我正在构建 Pong 只是一个初学者项目。我编写了以下代码来尝试移动两个桨,但是当按下 up/down/w/s 键时它们都不会移动。但是,在尝试自己调试时,我将其设置为将 x 和 y 值打印到控制台,以查看是否是问题所在,并且 x 和 y 值正在更新,但我的矩形坐标没有。我确信这是一个相当简单的修复,但我对编程很陌生,只是不知道出了什么问题。这是我的代码:
import time
pygame.init()
screenW = 800
screenH = 600
win = pygame.display.set_mode((screenW, screenH))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.SysFont("comicsans", 20)
paddleW = 20
paddleH = 100
ballSpeed = 15
class paddle(object):
def __init__(self, x, y, width, height):
self.x = x
self.y = y
self.width = width
self.height = height
self.pad = (self.x, self.y, self.width, self.height)
def draw(self, win):
pygame.draw.rect(win, (255,255,255), self.pad)
class ball(object):
def __init__(self, x, y, side):
self.x = x
self.y = y
self.side = side
self.pad = (self.x, self.y, self.side, self.side)
def draw(self, win):
pygame.draw.rect(win, (255,255,255), self.pad)
def redrawGameWindow():
win.fill((0,0,0))
paddleLeft.draw(win)
paddleRight.draw(win)
theBall.draw(win)
pygame.display.update()
#Main Loop:
paddleLeft = paddle(10, screenH//2, paddleW, paddleH)
paddleRight = paddle(screenW - 10 - paddleW, screenH//2, paddleW, paddleH)
theBall = ball(screenW//2, screenH//2, 30)
run = True
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
print("left up")
print(paddleRight.y)
paddleRight.y -= ballSpeed
elif keys[pygame.K_DOWN]:
print("left down")
print(paddleRight.y)
paddleRight.y += ballSpeed
elif keys[pygame.K_w]:
print("right up")
print(paddleLeft.y)
paddleLeft.y -= ballSpeed
elif keys[pygame.K_s]:
print("right down")
print(paddleLeft.y)
paddleLeft.y += ballSpeed
redrawGameWindow()
pygame.quit()
解决方案
当您更改属性x
和y
时,列表的内容pad
不会神奇地改变。
.pad
在绘图之前,您必须更新。例如:
class paddle(object):
# [...]
def draw(self, win):
self.pad = (self.x, self.y, self.width, self.height)
pygame.draw.rect(win, (255,255,255), self.pad)
无论如何,我建议使用对象而pygame.Rect
不是属性x
、y
和:width
height
class paddle(object):
def __init__(self, x, y, width, height):
self.rect = pygame.Rect(x, y, width, height)
def draw(self, win):
pygame.draw.rect(win, (255,255,255), self.rect)
class ball(object):
def __init__(self, x, y, side):
self.rect = pygame.Rect(x, y, side, side)
def draw(self, win):
pygame.draw.rect(win, (255,255,255), self.rect)
完整示例:
import pygame
import time
pygame.init()
screenW = 800
screenH = 600
win = pygame.display.set_mode((screenW, screenH))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.SysFont("comicsans", 20)
paddleW = 20
paddleH = 100
ballSpeed = 15
class paddle(object):
def __init__(self, x, y, width, height):
self.rect = pygame.Rect(x, y, width, height)
def draw(self, win):
pygame.draw.rect(win, (255,255,255), self.rect)
class ball(object):
def __init__(self, x, y, side):
self.rect = pygame.Rect(x, y, side, side)
def draw(self, win):
pygame.draw.rect(win, (255,255,255), self.rect)
def redrawGameWindow():
win.fill((0,0,0))
paddleLeft.draw(win)
paddleRight.draw(win)
theBall.draw(win)
pygame.display.update()
#Main Loop:
paddleLeft = paddle(10, screenH//2, paddleW, paddleH)
paddleRight = paddle(screenW - 10 - paddleW, screenH//2, paddleW, paddleH)
theBall = ball(screenW//2, screenH//2, 30)
run = True
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
print("left up")
print(paddleRight.rect.y)
paddleRight.rect.y -= ballSpeed
elif keys[pygame.K_DOWN]:
print("left down")
print(paddleRight.rect.y)
paddleRight.rect.y += ballSpeed
elif keys[pygame.K_w]:
print("right up")
print(paddleLeft.rect.y)
paddleLeft.rect.y -= ballSpeed
elif keys[pygame.K_s]:
print("right down")
print(paddleLeft.rect.y)
paddleLeft.rect.y += ballSpeed
redrawGameWindow()
pygame.quit()
推荐阅读
- swift - dyld:库未加载:@rpath/RxSwift.framework/RxSwift
- powershell - System.DayOfWeek 不包含 op_Addition
- google-apps-script - 如何将列的大小从最小宽度调整为自动调整大小
- javascript - 无法在 jQuery 中获取 data.success,为什么?
- mysql - 在 MySQL 中,我们什么时候应该使用 IF() 而不是 CASE...WHEN,反之亦然?
- deep-learning - 构建自动编码器时收到错误
- webpack - Quasar preFetch 几分钟后抛出错误
- django - 如何在 django 中创建视图以编辑数据库中的现有模型?
- ios - 从应用程序以编程方式调用 siri 快捷方式
- javascript - 单击开始录制按钮时出现“无法读取属性”错误