2010-12-13 5 views
3

J'utilise la bibliothèque pygame. Ce qui suit est un code pseudo pour ma gestion d'événements pour le joueur:Mouvement fluide du lecteur dans pygame

#generates multiple events for keys that are held down 
pygame.key.set_repeat(30,30) 

for event in pygame.event.get() 

    nextPos = currentPos 

    if(keyUp): 
     if event.key == w : 
     key_w = false 
     #do the same for s, a and d 

    if(keyDown): 
     if event.key == w: 
     key_w = true 
     #same for s,a and d 

    if(key_w): 
     #update nextPos 

    #do same for key_s, key_a and key_d 

    currentPos = nextPos 

Le problème est que, parfois, quand je déplace ma souris sur l'écran, et je suis appuyé sur une touche en même temps, lors du traitement des événements de la souris, les événements de la touche sont mis en file d'attente, et ces multiples pressions de touches sont exécutées ensemble, de sorte que le joueur semble sauter d'une grande distance.

Ce problème n'est pas causé si je ne bouge pas du tout la souris.

Répondre

0

Peut-être qu'une file d'attente d'événements n'est pas la meilleure solution ici, et que, par exemple, l'interrogation une fois par trame serait meilleure?

+0

même si j'interroge une fois par image, cela fonctionne bien jusqu'à ce que je bouge la souris. Quand je commence à bouger la souris et à appuyer sur la touche en même temps, le joueur reste bloqué à la même position. Après 4-5 secondes, il recommence à se déplacer selon les touches que j'avais appuyées précédemment. – Karan

+0

Ok, c'est partiellement résolu. J'ai retiré mousemotion de la file d'attente des événements en utilisant pngame.event.set_blocked. Mais maintenant je veux utiliser mouseclick pour tirer des balles (c'est un jeu de tir). Cela provoque le même problème, bien que dans ce cas, comme le nombre d'événements provoqués par les touches de souris est faible, le joueur saute une petite distance – Karan

1

Mise à jour ma réponse:

J'ai vérifié mon code de jeu pour voir comment je gère les clés chaque image et il semble que je ne reçois pas les informations clés des événements, mais l'utilisation pygame.key.get_pressed(): Cela signifie que je traite uniquement chaque clé pertinente une fois par trame. La souris peut être lue comme je le décris ci-dessous. N'oubliez pas d'utiliser le temps delta dans le calcul du vecteur de mouvement si votre jeu n'a pas de fréquence d'images fixe.


Peut-être la meilleure idée est de au cours de chaque processus tout événement de clavier d'abord et construire votre propre représentation d'état clé, à savoir une structure qui vous dire quelles clés importantes pour vous (par exemple WSAD) sont en hausse ou vers le bas. Lorsque tous les événements ont été traités dans cette image, exécutez votre code de mouvement à l'aide de vos données d'état de clé. N'utilisez pas les événements mousemotion pour suivre votre souris mais lisez directement la position et les boutons à l'aide de pygame.mouse.get_pos() et de pygame.mouse.get_pressed(). Votre code de mouvement doit également prendre en compte le fait que votre jeu fonctionne à débit d'image variable (sauf si vous avez forcé pygame à maintenir la fréquence d'images constante) et utilisez le delta temporel dans vos calculs vectoriels de déplacement.

1

J'utilise la méthode suivante ...

I initialiser les variables cooridinate ...

x = 300 
y = 300 
pX = 0 
pY = 0 

Dans ce cas, x et y sont les coordonnées réelles utilisées par l'image-objet de joueur, et pX et pY sont utilisés par le gestionnaire d'événements.

Puis-je utiliser le code suivant dans le gestionnaire d'événements ...

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

    if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: 
     pX -= 2 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: 
     pX += 2 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_UP: 
     pY -= 2 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN: 
     pY += 2  

    if event.type == pygame.KEYUP and event.key == pygame.K_LEFT: 
     pX += 2 
    if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT: 
     pX -= 2 
    if event.type == pygame.KEYUP and event.key == pygame.K_UP: 
     pY += 2 
    if event.type == pygame.KEYUP and event.key == pygame.K_DOWN: 
     pY -= 2 

Enfin, dans la boucle principale de jeu où sont traitées les coordonnées du joueur, je mets ...

x += pX 
y += pY 
0

I À mon avis, la meilleure entrée pour le mouvement du joueur pygame.key.get_pressed()

Je formate comme ça:

while True: 
    keys = pygame.key.get_pressed() 
    if keys[K_a]: 
     player.pos.x -= 10 
    if keys[K_d]: 
     player.pos.x += 10 
    if keys[K_w]: 
     player.pos.y -= 10 
    if keys[K_s]: 
     player.pos.y += 10 

De cette façon, le système vérifie les touches enfoncées vers le bas sur chaque image.