2015-09-24 62 views
0

我正在嘗試做一個pong遊戲,並且首先我想要做移動......的球。 因此,它的工作方向是朝一個方向發展,但轉彎有點波動。當你走向正確,然後堅持,然後釋放權利,它停止向上或向右。試着去一圈,你會看到。 我該如何解決這個問題,還有什麼其他的東西特別吸引這件作品?在pygame中發現一個轉折點

import pygame 
import sys 
from pygame.locals import * 

white = (255, 255, 255) 
black = (0, 0, 0) 
block_size = (32, 185) 
pong_size = 20, 20 
pong_pos_x = 390 
pong_pos_y = 280 

pygame.init() 

clock = pygame.time.Clock() 
pygame.display.set_caption("aa")   
display = pygame.display.set_mode((800, 600)) 


while True: 

    for event in pygame.event.get(): 
      if event.type == QUIT: 
        pygame.quit() 
        sys.exit() 

    display.fill(black) 
    rekt = pygame.draw.rect(display, white, ((pong_pos_x, pong_pos_y), pong_size)) 
    pygame.display.update() 
    h_move = 'none' 
    if event.type == pygame.KEYDOWN: 
      if event.key == K_RIGHT: 
        h_move = 'right' 
      elif event.key == K_LEFT: 
        h_move= 'left' 
      elif event.key == K_UP: 
        h_move = 'up' 
      elif event.key == K_DOWN: 
        h_move = 'down' 

    if h_move == 'right': 
      pong_pos_x += 2 
    elif h_move == 'left': 
      pong_pos_x -= 2 
    elif h_move == 'up': 
      pong_pos_y -= 2 
    elif h_move == 'down': 
      pong_pos_y += 2 


pygame.display.update() 
+0

您應該使用'lerp'或'slerp'進行旋轉插值以獲得更加平滑的動作和動畫,請參閱:https://www.pygame.org/docs/ref/math.html#pygame.math.Vector2.lerp –

回答

2

你應該處理循環中的所有事件。現在它依賴於某些事件退出循環底部的事實。任何時候,如果您還有其他事件KEYDOWNQUIT您正在停止您的移動。這種停頓導致了這種急躁(尤其是KEYUP事件)。

如果你考慮事件序列...你在K_UP的位置上漲,那麼你「轉向」。如果在按K_LEFT之前釋放K_UP,它可能會好起來(一段時間)。但如果在發佈K_UP之前按K_LEFT,則會得到KEWDOWNK_LEFT,然後KEYUPK_UP,並且您的移動已停止。

也許嘗試這樣的事:

... 
h_move = None 

while True: 
    # Event Loop 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type == pygame.KEYDOWN: 
      if event.key in (K_RIGHT, K_LEFT, K_UP, K_DOWN): 
       h_move = event.key 
     if event.type == pygame.KEYUP: 
      if h_move == event.key: 
       h_move = None 

    # Update State 
    if h_move == K_RIGHT: 
     pong_pos_x += 2 
    elif h_move == K_LEFT: 
     pong_pos_x -= 2 
    elif h_move == K_UP: 
     pong_pos_y -= 2 
    elif h_move == K_DOWN: 
     pong_pos_y += 2 

    # Draw 
    display.fill(black) 
    rekt = pygame.draw.rect(display, white, ((pong_pos_x, pong_pos_y), pong_size)) 
    pygame.display.update() 

你應該做的另一件事是限制你的FPS一定數量的幀。由於你正在改變位置而不是時間,這可能成爲一個重要因素。我可能會切換到位置變化的速度和時間,而不是每幀的靜態數字。