我遇到Python和pygame的问题:我不知道如何左右移动一个简单的桨。基本上我正在为我的第一个项目开发乒乓球游戏。
在网上阅读了几篇文章后,我想到了一种如何做到这一点的方法。我到目前为止的代码是:
PADDLE_WIDTH = 50
PADDLE_HEIGHT = 10
paddleSpeedX = 0
p1Paddle = pygame.Rect(10, 430, PADDLE_WIDTH, PADDLE_HEIGHT)
PADDLE_COLOR = pygame.color.Color("red")
while True:
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_LEFT:
p1Paddle.right = p1Paddle.left + paddleSpeedX - 10
if event.key == K_RIGHT:
p1Paddle.left = p1Paddle.left + paddleSpeedX + 10
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
pygame.display.update()
输入此代码后游戏运行但我仍然无法左右移动球拍。 我怎么能这样做?
答案 0 :(得分:2)
当你第一次按键时,Pygame只会举起一次KEYDOWN
事件。
不幸的是,它不会继续引发KEYDOWN
事件,所以发生的事情是你的球拍只有一次抽搐,除非你继续发送左右键的垃圾邮件,否则不会再次移动。< / p>
相反,您可以做的是在收到KEYDOWN
事件时设置速度,并在获得KEYUP
时将其设置为零,如下所示:
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
p1Paddle.x_velocity = -10
elif event.key == pygame.K_RIGHT:
p1Paddle.x_velocity = 10
if event.type == pygame.KEYUP:
if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
# if either the left or right arrow keys are released
p1Paddle.x_velocity = 0
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
p1Paddle.x_distance += p1Paddle.x_velocity
# other stuff here
# drawing code here
pygame.display.update()
(我还更改了一些变量名称,因为我无法弄清楚p1Paddle.left
和p1Paddle.right
是什么 - 我希望你不介意。)
答案 1 :(得分:1)
我做了一些补充和修改,以使您的代码有效。 在每个帧(循环迭代)中,您必须擦除屏幕并重绘桨。这是为了确保在按下左/右箭头时用新坐标重绘桨。 请注意,当按下LEFT时,我更改了p1Paddle.left而不是p1Paddle.right。
import pygame, sys
from pygame import *
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Paddle Movement')
PADDLE_WIDTH = 50
PADDLE_HEIGHT = 10
paddleSpeedX = 0
p1Paddle = pygame.Rect(10, 430, PADDLE_WIDTH, PADDLE_HEIGHT)
PADDLE_COLOR = pygame.color.Color("red")
while True:
# clear screen with black color
screen.fill( (0,0,0) )
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_LEFT:
p1Paddle.left = p1Paddle.left + paddleSpeedX - 10
if event.key == K_RIGHT:
p1Paddle.left = p1Paddle.left + paddleSpeedX + 10
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
# draw the paddle
screen.fill( PADDLE_COLOR, p1Paddle );
pygame.display.update()
更优雅的解决方案是
import pygame, sys
from pygame import *
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Paddle Movement')
PADDLE_WIDTH = 50
PADDLE_HEIGHT = 10
paddleSpeedX = 0
p1Paddle = pygame.Rect(10, 430, PADDLE_WIDTH, PADDLE_HEIGHT)
PADDLE_COLOR = pygame.color.Color("red")
# clock object that will be used to make the game
# have the same speed on all machines regardless
# of the actual machine speed.
clock = pygame.time.Clock()
while True:
# limit the demo to 50 frames per second
clock.tick( 50 );
# clear screen with black color
screen.fill( (0,0,0) )
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
p1Paddle.left = p1Paddle.left + paddleSpeedX - 5
if keys[K_RIGHT]:
p1Paddle.left = p1Paddle.left + paddleSpeedX + 5
# draw the paddle
screen.fill( PADDLE_COLOR, p1Paddle );
pygame.display.update()
请注意,我使用pygame.key.get_pressed()
检查按键操作。当我们检查键状态并且不等待事件发生时,它允许平稳移动。
我添加了一个时钟对象来将帧速率限制为50 FPS(每秒帧数)。
请尝试两种方法。