2016-01-21 27 views
6

Ho appena iniziato a giocare con pygame e ho appena incontrato un problema: quando realizzo il mio gioco per 2 giocatori, il secondo personaggio è sempre in ritardo. Ecco il mio codice.Pygame ritarda quando vengono implementati due giocatori

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) 

Io non sono che ben versati con pygame, o pitone è per questo, quindi ti prego di perdonare il mio codice sciatta. Qualsiasi aiuto è apprezzato.

+0

Sarei incline a dire che è perché (quello che sto assumendo è il primo giocatore) il 'punto' ha priorità nella sezione' elif event.type == pygame.KEYDOWN'. Quindi il 'cerchio' può essere immesso solo quando nessuno dei tasti di controllo' punto' viene tenuto premuto. – SiHa

+0

Non sai come sistemare questo, dato che sono abbastanza sicuro che i tasti premuti simultaneamente (ignorando i modificatori come 'SHIFT' ecc.) Non possano essere rilevati. Cambiare "if .. elif" in "if .. if" potrebbe migliorare leggermente perché potresti rilevare più chiavi nello stesso loop. – SiHa

+0

'if ... if' non dovrebbe cambiarlo perché' event.key' può avere solo un valore. Il codice sembra OK. – furas

risposta

2

Gli abeti di tutti i gestori di eventi e calcoli in un flusso sono una cattiva pratica. Perché i tuoi calcoli potrebbero non essere veloci quanto vuoi (100 fps nel tuo esempio) Ad esempio, controlla la risoluzione delle tue immagini.

Anche tu hai troppe dichiarazioni if - else (non è un errore nel tuo caso). Puoi sostituirlo con dicts.

Aumenta la frequenza dei fotogrammi (60).

Leggi A Newbie Guide to pygame, ci sono alcuni errori nel codice, ad esempio utilizzando pygame.image.load('foo.png') con il metodo .convert() a "per ottenere qualsiasi tipo di velocità dai vostri Blits".

+0

Grazie per tutto l'input. Ho cambiato la frequenza dei fotogrammi e sembra funzionare un po 'meglio, ma dopo un po' il cerchio si ferma e l'intero programma non risponde. (Devo forzare l'uscita dell'applicazione.) In risposta al tuo commento precedente, il secondo carattere è solo un'immagine, e anche se non ho spostato il punto, il cerchio si ritarda dopo che l'ho spostato. Leggerò la Guida per principianti a Pygame. Molte grazie. –

+0

@JamieLin: il codice sembra OK. forse il problema è nell'hardware (tastiera) o nel sistema operativo. – furas

+1

Probabilmente vuoi dire "* usando pygame.image.load ('foo.png') * con * .convert() ... *";) – elegent