2017-06-05 3 views
1

Ich lerne Python und auch Pygame, und ich möchte wissen, warum die Kugeln nicht angezeigt wird, ich hart, dass möglicherweise die screen.update_screen() stören kann, aber nein, das ist nicht der Fall Ich brauche Hilfe, um zu verstehen, wie Bullets in Python funktionieren, weil meine Methode offensichtlich nicht funktioniert, ich habe viele Methoden in anderen Posts gesehen, und sie benutzen eine begrenzte Menge von Kugeln um zu schießen (weiß nicht warum, in meinem Fall Ich möchte hinzufügen, dass die Kugeln, ich weiß, dass ich einen Entferner für die Suche nach einer "Bewegung" in der Anzeige hinzufügen muss, aber ich weiß nicht, wie, jede Hilfe wird geschätzt.Understanding & Making unendliche Kugeln in Pygame zu schießen

# -*- coding: utf-8 -*- 
import pygame 

class Screen(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     pygame.display.set_caption("Space Game") 
     self.screen_width = 800 
     self.screen_heigh = 600 
     self.picture = pygame.image.load("screen.png") 
     self.screen = pygame.display.set_mode((self.screen_width, self.screen_heigh)) 

    def update_screen(self): 
     self.screen.blit(self.picture, (0, 0)) 

    def update_obj(self, object): 
     self.screen.blit(object.picture, object.rect) 

    def update_shoot(self, object): 
     for y in range(object.rect.centery, 600, 10): 
      self.screen.blit(object.picture, (object.rect.centerx, object.rect.centery + y)) 

class Ship(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.picture = pygame.image.load("ship.png") 
     self.rect = self.picture.get_rect() 
     self.rect.centerx = 400 
     self.rect.centery = 500 

class Bullet(pygame.sprite.Sprite): 
    def __init__(self, object): 
     pygame.sprite.Sprite.__init__(self) 
     self.picture = pygame.image.load("shoot.png") 
     self.rect = self.picture.get_rect() 
     self.rect.centerx = object.rect.centerx 
     self.rect.centery = (object.rect.centery + 25) 

def main(): 
    pygame.init() 
    done = False 
    clock = pygame.time.Clock() 
    screen = Screen() 
    ship = Ship() 
    bullet = Bullet(ship) 

    while not done: 
     keys = pygame.key.get_pressed() 

     if keys[pygame.K_LEFT]: 
      ship.rect.centerx -= 5 
     if keys[pygame.K_RIGHT]: 
      ship.rect.centerx += 5 
     if keys[pygame.K_UP]: 
      ship.rect.centery -= 5 
     if keys[pygame.K_DOWN]: 
      ship.rect.centery += 5 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       done = True 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        done = True 
       if event.key == pygame.K_SPACE: 
        print ("shoot") 
        #for some weird reason the bullet doesn't display 
        screen.update_shoot(bullet) 

     screen.update_screen() 
     screen.update_obj(ship) 
     pygame.display.update() 
     clock.tick(10) 

    pygame.quit() 

if __name__ == "__main__": 
    main() 

Antwort

1

Kugeln schießen Sie in der Regel Instanzen einer Bullet Klasse erstellen und diese in einer Liste, pygame.sprite.Group oder einen anderen Behälter. Dann iterieren Sie über diesen Container und rufen die update Methode des Geschosses auf, in dem seine Position geändert wird. Um die Bilder der Sprites/Objekte zu blitten, iteriert man erneut über den Container und blittiert die Bilder einfach auf den Bildschirm. Mit Sprite-Gruppen können Sie einfach sprite_group.update() und sprite_group.draw(screen) aufrufen, anstatt sich selbst zu wiederholen. BTW, pygame Sprites müssen ein self.image Attribut haben kein self.picture, um mit Sprite-Gruppen zu arbeiten (werfen Sie einen Blick auf Program Arcade Games für weitere Informationen).

Ich begann ein paar Dinge in Ihrem Beispiel zu ändern, um Ihnen zu zeigen, wie Sprite-Gruppen zu verwenden, aber am Ende änderte Ihre gesamte Screen Klasse in eine Game Klasse (die ich in der Zukunft zu verwenden empfehlen).

import sys 
import pygame 


class Game: 

    def __init__(self): 
     self.done = False 
     self.screen_width = 800 
     self.screen_height = 600 
     self.image = pygame.Surface((800, 600)) 
     self.image.fill((30, 40, 50)) 
     self.screen = pygame.display.set_mode(
      (self.screen_width, self.screen_height)) 

     # all_sprites is used to update and draw all sprites together. 
     self.all_sprites = pygame.sprite.Group() 
     # You'll probably need a separate bullet_group 
     # later for collision detection with enemies. 
     self.bullet_group = pygame.sprite.Group() 

     self.ship = Ship() 
     self.all_sprites.add(self.ship) 

     bullet = Bullet(self.ship) 
     self.bullet_group.add(bullet) 
     self.all_sprites.add(bullet) 

    def handle_events(self): 
     keys = pygame.key.get_pressed() 

     if keys[pygame.K_LEFT]: 
      self.ship.rect.centerx -= 5 
     if keys[pygame.K_RIGHT]: 
      self.ship.rect.centerx += 5 
     if keys[pygame.K_UP]: 
      self.ship.rect.centery -= 5 
     if keys[pygame.K_DOWN]: 
      self.ship.rect.centery += 5 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       self.done = True 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        self.done = True 
       if event.key == pygame.K_SPACE: 
        bullet = Bullet(self.ship) 
        self.bullet_group.add(bullet) 
        self.all_sprites.add(bullet) 

    def update(self): 
     # Calls `update` methods of all contained sprites. 
     self.all_sprites.update() 

    def draw(self): 
     self.screen.blit(self.image, (0, 0)) 
     self.all_sprites.draw(self.screen) # Draw the contained sprites. 
     pygame.display.update() 


class Ship(pygame.sprite.Sprite): 

    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((20, 30)) 
     self.image.fill((50, 170, 230)) 
     # A nicer way to set the start pos with `get_rect`. 
     self.rect = self.image.get_rect(center=(400, 500)) 


class Bullet(pygame.sprite.Sprite): 

    def __init__(self, ship): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((7, 7)) 
     self.image.fill((230, 140, 30)) 
     self.rect = self.image.get_rect() 
     self.rect.centerx = ship.rect.centerx 
     self.rect.centery = ship.rect.centery - 25 

    def update(self): 
     self.rect.y -= 5 # Move up 5 pixels per frame. 


def main(): 
    pygame.init() 
    pygame.display.set_caption('Space Game') 
    clock = pygame.time.Clock() 
    game = Game() 

    while not game.done: 
     game.handle_events() 
     game.update() 
     game.draw() 
     clock.tick(30) 


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

dude ein lebensretter –

+0

Mein Vergnügen! Sie müssen immer noch Code hinzufügen, um die Kugeln zu entfernen, wenn sie den Bildschirm verlassen, sonst wird Ihnen der Speicher ausgehen ... schließlich. ;) Prüfe einfach, ob ihre 'rect.y <0 'ist und rufe' self.kill() 'auf, um das Sprite zu beenden. – skrx