2017-05-09 2 views
1

Ich versuche ein Spiel zu erstellen, in dem mein Xwing die Tieffighter erschießt und tötet. Ich kann das Aufnahmebild einfach nicht aus dem xwing herauskommen lassen, wenn ich die Leertaste drücke. Ich weiß, dass diese Frage schon einmal gestellt wurde, aber ich kann es einfach nicht verstehen. Ich bin etwas neu in Python und Pygame. Vielen Dank!Wie mache ich einen Charakter in Pygame schießen?

import sys 
import random 
import pygame as pg 


pg.init() 
screen = pg.display.set_mode((1280, 800)) 
display_width = 1280 
display_height= 800 

black= (0,0,0) 
white= (255,255,255) 
red = (255,0,0) 
blue_violet = (138,43,226) 

bullets= [] 

xwingImg = pg.image.load('X-Wing.bmp').convert() 
tieImg= pg.image.load('tiefighter.png').convert() 
space=pg.image.load('space.jpg').convert() 
xbullet = pg.image.load('bullet.png').convert() 

BG_image = pg.image.load('space.jpg').convert() 

def rot_center(image, angle): 
    """rotate a Surface, maintaining position.""" 
    loc = image.get_rect().center #rot_image is not defined 
    rot_sprite = pg.transform.rotate(image, angle) 
    rot_sprite.get_rect().center = loc 
    return rot_sprite 

    # or return tuple: (Surface, Rect) 
     # return rot_sprite, rot_sprite.get_rect() 

def main(): 
    clock = pg.time.Clock() 
    # Surfaces/images have a `get_rect` method which 
    # returns a rect with the dimensions of the image. 
    player_rect = xwingImg.get_rect() 
    player_rect.center = (640,400) 
    change_x = 0 
    change_y = 0 
    enemies = [] 
    spawn_counter = 30 


    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == space: 
       shot.play() 
      for b in range(len(bullets)) : 
       bullets [b] [0] -=10 
      for bullet in bullets: 
       if bullet [0] <0: 
        bullet.remove(bullet) 
       bullets.append ([event.pos[0], 500]) 

      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_d: 
        change_x = 5 
       if event.key == pg.K_w: 
        change_y = -5 
       if event.key == pg.K_s: 
        change_y= 5 
       if event.key == pg.K_a: 
        change_x = -5 
      if event.type == pg.KEYUP: 
       if event.key == pg.K_d and change_x > 0: 
        change_x = 0 
       if event.key == pg.K_a and change_x < 0: 
        change_x = 0 
       if event.key == pg.K_w and change_y<0: 
        change_y=0 
       if event.key == pg.K_s and change_y>0: 
        change_y=0 



     # Spawn enemies if counter <= 0 then reset it. 
     spawn_counter -= 1 
     if spawn_counter <= 0: 
      # Append an enemy rect. You can pass the position directly as an argument. 
      enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -800))) 
      spawn_counter = 30 


     # Update player_rect and enemies. 
     player_rect.x += change_x 
     player_rect.y += change_y 
     for enemy_rect in enemies: 
      enemy_rect.y += 5 
      # Collision detection with pygame.Rect.colliderect. 
      if player_rect.colliderect(enemy_rect): 
       done = True 

     # Draw everything. 
     screen.blit(BG_image, (0,0)) 
     for bullet in bullets: 
      screen.blit(xbullet, pg.Rect (bullet[0], bullet [1], 0, 0)) 

     for enemy_rect in enemies: 
      screen.blit(tieImg, enemy_rect) 
     screen.blit(xwingImg, player_rect) 
     if player_rect.x >display_width: 
      player_rect.x = 0 
     if player_rect.x < 0: 
      player_rect.x= 1280 
     if player_rect.y>display_height: 
      player_rect.y = 0 
     if player_rect.y < 0: 
      player_rect.y= 800 


     pg.display.flip() 
     clock.tick(40) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 

Antwort

2

zugewiesen haben denke ich, es wäre besser, pygame sprites und Sprite-Gruppen zu verwenden, anstatt von Listen von Rects. (In Kapitel 12 wird erklärt, wie Klassen funktionieren.) Um mit Rezepten zu schießen, müssen Sie selbst etwas mehr tun.

Zuerst schießen Sie einzelne Kugel rectures (fügen Sie sie an die bullets Liste) durch Drücken der Leertaste. Fügen Sie diese drei Zeilen in der Ereignisschleife:

if event.type == pg.KEYDOWN: 
    if event.key == pg.K_SPACE: 
     bullets.append(xbullet.get_rect(center=player_rect.midtop)) 

bewegen sich die Kugeln in der while-Schleife:

for bullet in bullets: 
    bullet.y -= 4 

Und blitten sie:

for bullet in bullets: 
    screen.blit(xbullet, bullet) 

nun den schwierigen Teil kommt. Wir müssen prüfen, welcher Gegner mit einer Kugel kollidiert ist und dann die enemies Liste filtern, so dass sie nur die überlebenden Feinde enthält.

Sie müssen das gleiche für die Kugeln tun, um sie zu entfernen. Außerdem sollten die Feinde und Kugeln herausgefiltert werden, wenn sie den Bildschirm verlassen, sonst wachsen die Listen die ganze Zeit.

ist das komplette Beispiel:

import sys 
import random 
import pygame as pg 


pg.init() 
screen = pg.display.set_mode((1280, 800)) 
display_width = 1280 
display_height = 800 

xwingImg = pg.image.load('X-Wing.bmp').convert() 
tieImg= pg.image.load('tiefighter.png').convert() 
space=pg.image.load('space.jpg').convert() 
xbullet = pg.image.load('bullet.png').convert() 
BG_image = pg.image.load('space.jpg').convert() 


def main(): 
    clock = pg.time.Clock() 
    player_rect = xwingImg.get_rect() 
    player_rect.center = (640, 400) 
    change_x = 0 
    change_y = 0 
    enemies = [] 
    bullets = [] 
    spawn_counter = 30 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_SPACE: 
        bullets.append(xbullet.get_rect(center=player_rect.midtop)) 
       if event.key == pg.K_d: 
        change_x = 5 
       if event.key == pg.K_w: 
        change_y = -5 
       if event.key == pg.K_s: 
        change_y= 5 
       if event.key == pg.K_a: 
        change_x = -5 
      if event.type == pg.KEYUP: 
       if event.key == pg.K_d and change_x > 0: 
        change_x = 0 
       if event.key == pg.K_a and change_x < 0: 
        change_x = 0 
       if event.key == pg.K_w and change_y<0: 
        change_y=0 
       if event.key == pg.K_s and change_y>0: 
        change_y=0 

     # Spawn enemies if counter <= 0 then reset it. 
     spawn_counter -= 1 
     if spawn_counter <= 0: 
      # Append an enemy rect. You can pass the position directly as an argument. 
      enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -100))) 
      spawn_counter = 30 

     # Update player_rect. 
     player_rect.x += change_x 
     player_rect.y += change_y 

     # Update bullets. 
     for bullet in bullets: 
      bullet.y -= 4 

     # Detect collisions and move the enemies. 
     hit_enemies = [] 
     for enemy_rect in enemies: 
      enemy_rect.y += 5 
      # Collision detection with pygame.Rect.colliderect. 
      if player_rect.colliderect(enemy_rect): 
       done = True 
      # Collision detection with bullets. 
      for bullet in bullets: 
       if bullet.colliderect(enemy_rect): 
        hit_enemies.append(enemy_rect) 

     # Filter the destroyed enemies out. 
     survivors = [] 
     for enemy in enemies: 
      if enemy not in hit_enemies: 
       survivors.append(enemy) 
     enemies = survivors # Now `enemies` is the list of survivors. 

     # Draw everything. 
     screen.blit(BG_image, (0,0)) 
     for bullet in bullets: 
      screen.blit(xbullet, bullet) 

     for enemy_rect in enemies: 
      screen.blit(tieImg, enemy_rect) 
     screen.blit(xwingImg, player_rect) 
     if player_rect.x >display_width: 
      player_rect.x = 0 
     if player_rect.x < 0: 
      player_rect.x= 1280 
     if player_rect.y>display_height: 
      player_rect.y = 0 
     if player_rect.y < 0: 
      player_rect.y= 800 

     pg.display.flip() 
     clock.tick(40) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 
1

Sie testen diese

if event.type == space: 

aber

space = pg.image.load('space.jpg').convert() 

so die event.type wird, dass nie übereinstimmen.

Sie brauchen etwas wie folgt aus:

if event.type == pg.KEYUP: 
    if event.key == pg.K_SPACE: 

wie Sie die anderen Tasten testen.

Ihr nächstes Problem ist, dass Sie nicht shot überall

+0

ich das tat, aber ich bin sehr neu in Python und pygame. Ich weiß nicht, was ich machen soll. Könnten Sie mir ein Beispiel dafür geben, wie das geht? – joe

Verwandte Themen