2017-08-15 4 views
0

en essayant de dessiner une forme avec pygame.draw.rect() quand j'appuie sur une touche, mais la forme ne restera pas quand une autre touche ou un événement se produit et aussi la forme se déplace où jamais navire se déplace, mais je veux seulement de se déplacer quand je l'ai tourné et rester à cet endroit et la forme restent coutume à la surface après que je relâche cette touchecoincé sur pygame.draw.rect()

import pygame 

pygame.init() 

display_width = 800 
display_hight = 600 
colors = {"black": (0, 0, 0), "white": (255, 255, 255), "green": (0, 255, 0), "red": (255, 0, 0), "blue": (0, 0, 255)} 
ship_width = 75 
ship_hight = 72 
gameDisplay = pygame.display.set_mode((display_width, display_hight)) 
pygame.display.set_caption('test') 
clock = pygame.time.Clock() 

shipimg = pygame.image.load('D:\\index.png') 

def ship(x, y): 
    gameDisplay.blit(shipimg, (x, y)) 



def Game_Loop(): 
    x = (display_width * 0.41) 
    y = (display_hight * 0.8) 
    x_change = 0 
    fire_start_y = y - ship_hight 
    fire_start_x = x + (ship_width/2) 

    GameExit = False 


    while not GameExit: 
     if fire_start_y < 0: 
      fire_start_y = y - 30 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       GameExit = True 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        x_change = -5 
       if event.key == pygame.K_RIGHT: 
        x_change = 5 

      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 
     x += x_change 

     gameDisplay.fill(colors["white"]) 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_x: 
       pygame.draw.rect(gameDisplay, colors["green"], [fire_start_x, fire_start_y, 2, 10]) 

     ship(x, y) 
     if x <= 0 or x >= display_width - ship_width: 
      x -= x_change 
     fire_start_y -= 5 
     fire_start_x = x + (ship_width/2) 


     pygame.display.flip() 
     clock.tick(60) 


Game_Loop() 
pygame.quit() 

J'ai essayé ce code pour gérer le problème disparaissant, mais il a fait pire que jamais élaguer après pression de la touche une fois

 if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_x: 
       pygame.draw.rect(gameDisplay, colors["green"], [fire_start_x, fire_start_y, 2, 10]) 
       fire_start_x = x + (ship_width/2) 
     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_x: 
       pygame.draw.rect(gameDisplay, colors["green"], [fire_start_x, fire_start_y, 2, 10]) 
       fire_start_x = x + (ship_width/2) 
+0

Si vous voulez juste tirer des balles, puis créer une liste et ajoutez 'pygame.Rect's (qui représentent les balles) quand vous tirez. Pour déplacer les rects vers le haut, utilisez une boucle 'for' et diminuez leurs valeurs' y'. – skrx

+0

Je peux vous montrer un exemple, mais ce n'est pas vraiment clair si vous voulez vraiment tirer quelques balles.S'il vous plaît décrire vos objectifs en détail. – skrx

Répondre

0

Si vous voulez tirer beaucoup de balles quand un bouton est enfoncé utilisez ce code.

if pygame.key.get_pressed[pygame.K_x] != 0: 
    # Add code to add Rect objects to a list. 
    # Add in code to add the Rect objects in intervals. 

Dans le code ci-dessus, vous devez ajouter du code afin que vous ne pas ajouter dans un objet rect lors de chaque itération de la boucle de jeu. Si vous ne le faites pas, vous tirerez 60 balles dans une seconde ou 1 balle par image, ce qui peut être ou ne pas être trop.

Si vous voulez tirer une balle pour chaque événement de clavier, utilisez ce code. Pendant le rendu de votre boucle de jeu, vous devez rendre les objets rect.

for bullet in bullets: 
    # Blit the bullet to the screen 
    # Increment/Decrement the x/y values so they move. 

Bien sûr, vous devez gérer cette fonction pour supprimer les puces de cette liste. Vous devrez également coder dans la détection de collision.

Si vous expliquez plus et plus en détail, je vais ajouter à la réponse. J'espère que cela a aidé!

EDIT: D'accord, vous devez utiliser le premier bloc de code pour déclencher le tir des balles. Ajoutez ces objets rect à une liste.

if pygame.key.get_pressed[pygame.K_x] != 0: 
    bullets.append(pygame.Rect(x, y, 10, 3)) 
    # Add in a time delay. 

Assurez-vous de créer la liste des puces. Les valeurs x et y seront là où vous voulez que les balles tirent par rapport au vaisseau.

Rendez-les maintenant.

for bullet in bullets: 
    window.blit(bullet, [bullet.x, bullet.y]) 
    bullet.x += 3 # This will make the bullet go EAST. 

Enlever les balles qui ont disparu de l'écran.

for bullet in bullets: 
    if bullet.x < 0 or bullet.x + bullet.width > window_width: 
     bullets.remove(bullet) 
    # Add in some collision detection with other ships here. 

Espérons que cela a aidé!

+0

ok voici mes objectifs je veux tirer des balles tant que j'appuie sur une touche spécifique supposer que la clé est x et je veux que la balle commence à partir d'un autre objet laisse dire que l'objet est un navire tant que la balle est tirée direction de balle ne changera que son changement de direction de tir J'espère que cela vous donne plus de détails –

+0

Juste vu votre réponse. Nevermid. –

0

merci les gars mais j'ai trouvé la réponse que je cherche dans ce How to create bullets in pygame?

créer une liste de balles, puis utiliser la méthode append pour ajouter direction fo chaque balle i tourné quand j'appuyez sur la touche x et les removeing ​​de la liste si elles sont hors de ma surface de jeu

voici ce que mon code ressemble maintenant

bullets = [] 
bullet_width = 2 
bullet_hight = 10 
def Game_Loop(): 
    x = (display_width * 0.41) 
    y = (display_hight * 0.8) 
    x_change = 0 
    bullet_y = y - (ship_hight/2) 

    GameExit = False 

    while not GameExit: 
     bullet_x = x + (ship_width/2) 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       GameExit = True 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        x_change = -5 
       if event.key == pygame.K_RIGHT: 
        x_change = 5 
       if event.key == pygame.K_x: 
        bullets.append([bullet_x,bullet_y]) 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 
     x += x_change 

     gameDisplay.fill(colors["white"]) 

     for bullet in bullets: 
      pygame.draw.rect(gameDisplay, colors["green"], (bullet[0], bullet[1], bullet_width, bullet_hight)) 

     ship(x, y) 
     if x <= 0 or x >= display_width - ship_width: 
      x -= x_change 
     for bullet in bullets: 
      bullet[1] -= 5 
      if bullet[1] < 0: 
       bullets.remove(bullet) 
     pygame.display.flip() 
     clock.tick(60) 
+0

Ne modifiez jamais une liste pendant que vous l'itérez. Cela conduit à des résultats inattendus et tous les éléments souhaités ne seront pas supprimés. Soit créer une nouvelle liste ou itérer sur une copie 'pour bullet dans les balles [:]:'. – skrx