2012-07-06 54 views
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() 

进入这个代码在游戏运行后,但我仍然无法左右移动桨。 我该怎么做?

+0

你的'if event.type == QUIT'部分似乎对齐错了。它不应该与'if event.type == KEYDOWN'处于同一级别吗? – 2012-07-06 15:34:25

+0

我已发布解决您的问题的完整工作代码。看到我的答案。 – 2012-07-06 15:58:18

+0

对于pygame,您可以通过两种方法获得输入** [1]键事件**或** [2]键轮询** - 您正在使用第一种(事件)方法。为此,你需要第二种方法。有关代码,请参阅http://stackoverflow.com/a/11365418/341744。 - 如果这是一个FPS,你想要投票WASD运动,并为mousedown事件。 – ninMonkey 2012-07-07 17:59:06

回答

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.leftp1Paddle.right是什么 - 我希望你不介意)。

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(每秒帧数)。

请尝试这两种方法。