2016-01-21 47 views
6

我剛剛開始玩pygame,剛剛遇到了一個問題 - 當我爲2名球員製作比賽時,第二個角色總是滯後。這是我的代碼。Pygame落後於兩名球員

import pygame, sys 
from pygame.locals import * 

pygame.init() 

clock = pygame.time.Clock() 

background_img = pygame.image.load('Data/background.jpg') 
size = background_img.get_size() 

pygame.mixer.init()       
pygame.mixer.music.load('Data/song.wav') 
pygame.mixer.music.set_volume(0.7)   
pygame.mixer.music.play(-1)  

dot_img = pygame.image.load('Data/dot.png') 
dotx = 0 
doty = 0 
dotx_speed = 0 
doty_speed = 0 

circle_img = pygame.image.load('Data/circle.png') 
circlex = 0 
circley = 0 
circlex_speed = 0 
circley_speed = 0 

display = pygame.display.set_mode(size) 

pygame.display.set_caption('Game') 

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

     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
      dotx_speed = -10 
      elif event.key == pygame.K_RIGHT: 
      dotx_speed = 10 
      elif event.key == pygame.K_UP: 
      doty_speed = -10 
      elif event.key == pygame.K_DOWN: 
      doty_speed = 10 
      elif event.key == pygame.K_a: 
      circlex_speed = -10 
      elif event.key == pygame.K_d: 
      circlex_speed = 10 
      elif event.key == pygame.K_w: 
      circley_speed = -10 
      elif event.key == pygame.L.s: 
      circley_speed = 10    

    elif event.type == pygame.KEYUP: 
     if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
      dotx_speed = 0 
     elif event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
      doty_speed = 0 
     elif event.key == pygame.K_a or event.key == pygame.K_d: 
      circlex_speed = 0 
     elif event.key == pygame.K_w or event.key == pygame.K_s: 
      circley_speed = 0    

    dotx += dotx_speed 
    doty += doty_speed 

    circlex += circlex_speed 
    circley += circley_speed  

    display.blit(background_img,(0,0)) 
    display.blit(dot_img,(dotx,doty)) 
    display.blit(circle_img,(circlex,circley)) 

    pygame.display.update() 
    clock.tick(100) 

我對pygame或者python不是很瞭解,所以請原諒我的草率代碼。任何幫助表示讚賞。

+0

我傾向於說,這是因爲(我假設是第一個玩家)'dot'在'elif event.type == pygame.KEYDOWN'部分中具有優先權。因此,只有當沒有任何'dot'控制鍵被按下時,'circle'才能被輸入。 – SiHa

+0

不知道你會如何解決這個問題,因爲我非常確定無法檢測到同時按鍵(忽略像SHIFT等修飾符)。如果將.. elif'改爲if .. if可能會稍微改善一些事情,因爲可以在同一個循環中檢測多個鍵。 – SiHa

+0

'if ... if'不應該改變它,因爲'event.key'只能有一個值。代碼看起來不錯。 – furas

回答

2

所有事件處理程序和一個流程中的計算都是不好的做法。因爲您的計算可能不如您想要的那麼快(在您的示例中爲100 fps)例如,檢查圖像的分辨率。

你也有太多if - else陳述(這不是你的錯誤)。你可以用字典替換它。

使您的幀率更真實(60)。

閱讀A Newbie Guide to pygame,也有一些錯誤在你的代碼,例如使用pygame.image.load('foo.png').convert()法「得到任何樣的速度從你的blit的」。

+0

感謝您的所有輸入。我改變了幀頻,似乎效果更好一些,但過了一段時間,圓圈停止了,整個程序變得沒有反應。 (我必須強制退出應用程序。)作爲對您之前的評論的迴應,第二個字符只是一個圖像,即使我沒有移動小圓點,但在移動它之後圓形仍然滯後。我會閱讀Pygame的新手指南。非常感謝。 –

+0

@JamieLin - 代碼看起來不錯。也許問題在於硬件(鍵盤)或操作系統。 – furas

+1

您可能的意思是「*使用pygame.image.load('foo.png')*與* .convert()... *」;) – elegent