2017-09-24 4 views
1

Je fais un jeu et je me demandais comment faire de mon «joueur» ou de ma pièce verte pour me déplacer dans les deux sens. Chaque fois que je clique sur l'une des flèches, il se déplace juste parce que c'est tout ce que je peux comprendre. Le code d'animation se trouve sur les lignes 27 et 28. J'ai besoin du cercle vert pour pouvoir déplacer 5 pixels à droite et à gauche chaque fois que l'on clique sur l'une des flèches. EDIT: J'ai aussi besoin de la collision quand elle frappe n'importe où sur les balles rouges parce que dans mon code actuel les balles doivent frapper les coordonnées exactes du joueur.Je ne peux pas amener mon 'joueur' à bouger de deux manières dans pygame, comment je le fais?

import pygame 
import random 
BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 
BLUE = (0,0,255) 
pygame.init() 
size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Dodger") 
done = False 
clock = pygame.time.Clock() 

def resetpositions(): 
    global bulletrect1, bulletrect2, bulletrect3, bulletrect4, bulletrect5, circlerect 
    bulletrect1 = pygame.rect.Rect((350, 0, 20, 20)) 
    bulletrect2 = pygame.rect.Rect((175, 0, 20, 20)) 
    bulletrect3 = pygame.rect.Rect((525, 0, 20, 20)) 
    bulletrect4 = pygame.rect.Rect((525, 0, 20, 20)) 
    bulletrect5 = pygame.rect.Rect((525, 0, 20, 20)) 

circlerect = pygame.rect.Rect((350, 600, 20, 20)) 

resetpositions() 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == pygame.KEYDOWN: 
      circlerect.x += 5 
    bulletrect1.y += 1 
    bulletrect2.y += 2 
    bulletrect3.y += 3 
    bulletrect4.y += 4 
    bulletrect5.y += 5 
    screen.fill(BLACK) 
    pygame.draw.circle(screen, GREEN, (circlerect.center), 15) 
    pygame.draw.circle(screen, RED, (bulletrect1.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect2.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect3.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect4.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect5.center), 20) 
    if bulletrect1.y == 800: 
     bulletrect1.y = 0 
     bulletrect1.x = random.randint(20,680) 
    if bulletrect2.y == 800: 
     bulletrect2.y = 0 
     bulletrect2.x = random.randint(20,680) 
    if bulletrect3.y == 800: 
     bulletrect3.y = 0 
     bulletrect3.x = random.randint(20,680) 
    if bulletrect4.y == 800: 
     bulletrect4.y = 0 
     bulletrect4.x = random.randint(20,680) 
    if bulletrect5.y == 800: 
     bulletrect5.y = 0 
     bulletrect5.x = random.randint(20,680) 
    if circlerect.x == 685: 
     circlerect.x = 15 
    if circlerect.collidelist((bulletrect1, bulletrect2, bulletrect3, bulletrect4, bulletrect5)) == 0: 
     screen.fill(BLACK) 
     font = pygame.font.SysFont('Calibri',40,True,False) 
     text = font.render("GAME OVER",True,RED) 
     screen.blit(text,[250,350]) 
     pygame.display.update() 
     pygame.time.delay(3000) 
     resetpositions() 
    pygame.display.flip() 
    clock.tick(300) 
pygame.quit() 
+0

Vous devez remplacer l'instruction: 'circlerect.x + = 5' par du code qui détectera différentes touches et fera des choses différentes. Tel quel, il ajoute toujours 5 à 'circleerect.x'. Avez-vous essayé quelque chose comme 'if event.key == pygame.K_RIGHT: ...' – Bill

Répondre

1

lignes 30 et 31 sont les suivants:

if event.type == pygame.KEYDOWN: 
      circlerect.x += 5 

Ce code détecte quand une touche est enfoncée et ensuite déplacer l'objet circlerect 5 unités vers la droite (toujours à droite parce qu'il est toujours + =).

Si vous voulez vous déplacer dans les deux sens, vous devrez détecter plus que simplement KEYDOWN. Vous devez détecter quand la touche est enfoncée (et soustraire 5) et quand elle est droite (et ajouter 5).

1

Comme Isaac l'a mentionné, vous devez vérifier quel key a été pressé par l'utilisateur et déplacer à gauche -= 5 ou à droite += 5 en conséquence.

if event.type == pygame.KEYDOWN: 
    if event.key == pygame.K_LEFT: 
     circlerect.x -= 5 
    elif event.key == pygame.K_RIGHT: 
     circlerect.x += 5 

Le problème est que cela ne déplace le lecteur une fois par appuyer sur la touche et que vous auriez à ajouter des variables comme moving_left pour obtenir un mouvement continu. Dans votre cas, il est plus facile d'utiliser pygame.key.get_pressed au lieu de gérer les événements dans la boucle d'événements, car vous pouvez l'utiliser pour vérifier si une touche est maintenue enfoncée.

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     done = True 

# A list of the pressed keys. 
keys = pygame.key.get_pressed() 
# If the key at index `K_LEFT` is held. 
if keys[pygame.K_LEFT]: 
    circlerect.x -= 5 
elif keys[pygame.K_RIGHT]: 
    circlerect.x += 5 

Note latérale: clock.tick(300) est trop élevé. Mieux vaut limiter votre jeu à 30 ou 60 fps et augmenter la vitesse des cercles.