2012-07-06 51 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(每秒幀數)。

請嘗試這兩種方法。