1

我对 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()

输入此代码后,游戏运行,但我仍然无法左右移动桨。我怎样才能做到这一点?

4

2 回答 2

2

Pygame 只引发一次KEYDOWN事件,当你第一次按下一个键时。

不幸的是,它不会继续引发KEYDOWN事件,所以发生的事情是你的桨只抽动一次,除非你继续向左或向右键发送垃圾邮件,否则不会再次移动。

相反,您可以做的是在收到事件时设置速度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我希望您不介意)。

于 2012-07-06T15:39:28.180 回答
1

我做了一些添加和修改以使您的代码正常工作。在每一帧(循环的迭代)中,您必须擦除屏幕并重新绘制桨。这是为了确保在按下 LEFT/RIGHT 箭头时使用新坐标重新绘制桨叶。请注意,当按下 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(每秒帧数)。

请尝试这两种方法。

于 2012-07-06T15:42:22.593 回答