2016-06-04 24 views
-1

Ich mache Space Invaders auf Pygame, aber ich bin derzeit daran fest, die Aliens in einer Linie nebeneinander zu arrangieren. Die Aliens sind in einer Liste (60 von ihnen) Ich brauche Hilfe, um sie in einer Linie zu bekommen. Hier ist, was ich bisher:Liste von Objekten nebeneinander?

import pygame, random, sys 
from time import sleep 
from pygame.locals import * 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
RED = (255, 0, 0) 
BLUE = (0, 0, 255) 
NAVYBLUE = (0,0,45) 
GREY = (128,128,128) 

pygame.init() 
screen_width = 700 
screen_height = 400 
screen = pygame.display.set_mode([screen_width, screen_height]) 

class Block(pygame.sprite.Sprite): 
    def __init__(self, image): 
     aliens = pygame.image.load('aliens.png') 
     aliens = pygame.transform.scale(aliens, (20,20)) 
     super(Block, self).__init__() 

     self.image = aliens 

     self.rect = self.image.get_rect() 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.mouse.set_visible(0) 
     ship = pygame.image.load('spaceship.png') 
     ship = pygame.transform.scale(ship, (20,30)) 
     super(Player, self).__init__() 

     self.image = ship 
     self.rect = self.image.get_rect() 
    def update(self): 
     pos = pygame.mouse.get_pos() 
     self.rect.x = pos[0] 

class Bullet(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Bullet, self).__init__() 
     self.image = pygame.Surface([4, 10]) 
     self.image.fill(WHITE) 
     self.rect = self.image.get_rect() 

    def update(self): 
     self.rect.y -= 3 

all_sprites_list = pygame.sprite.Group() 
block_list = pygame.sprite.Group() 
bullet_list = pygame.sprite.Group() 

for i in range(60): 
    block = Block(BLUE) 
    block.rect.x = random.randrange(screen_width) 
    block.rect.y = random.randrange(350) 
    block_list.add(block) 
    all_sprites_list.add(block) 

player = Player() 
all_sprites_list.add(player) 
done = False 
clock = pygame.time.Clock() 
score = 0 
time = 1500 
player.rect.y = 370 
font = pygame.font.SysFont(None, 30) 

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

     elif event.type == pygame.MOUSEBUTTONDOWN: 
      bullet = Bullet() 
      bullet.rect.x = player.rect.x + 9.5 
      bullet.rect.y = player.rect.y 
      all_sprites_list.add(bullet) 
      bullet_list.add(bullet) 

    all_sprites_list.update() 



    for bullet in bullet_list: 


     block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) 


     for block in block_hit_list: 
      bullet_list.remove(bullet) 
      all_sprites_list.remove(bullet) 
      score += 1 


     if bullet.rect.y < -10: 
      bullet_list.remove(bullet) 
      all_sprites_list.remove(bullet) 

    screen.fill(NAVYBLUE) 
    scoredisplay = font.render("Score {0}".format(score), 1, (WHITE)) 
    screen.blit(scoredisplay, (5, 10)) 
    all_sprites_list.draw(screen) 
    timedisplay = font.render("Time {0}".format(time), 1, (WHITE)) 
    screen.blit(timedisplay, (5, 30)) 

    pygame.display.flip() 


    clock.tick(60) 

    time -= 1 
    pygame.time.delay(10) 

    if time == 0: 
     done = True 
     screen.fill(WHITE) 
     display = font.render("YOU RAN OUT OF TIME!! :(Your final score was {}".format(score), 1, (BLACK)) 
     screen.blit(display, (35, screen_height/2)) 
     pygame.display.flip() 
     sleep(3) 


pygame.quit() 
+0

Was haben Sie versucht? Wie denkst du könnte es funktionieren? Tipp: Benutze die 'Rect's der Aliens. Einige schnelle Hinweise: Laden Sie die Bilder nicht in Ihre Klassen. Jedes Mal, wenn Sie eine Klasse instanziieren, muss Pygame das Bild erneut laden. Sie können die Bilder als globale Konstanten belassen. Warum setzen Sie die Maus innerhalb der '__init__' Methode des' Players' auf sichtbar? Nächstes Mal ersetzen Sie Ihre Bilder mit einfachen 'pygame.Surfaces', bevor Sie Ihren Code veröffentlichen, dann können wir einfach kopieren und einfügen. Auch http://codereview.stackexchange.com/ – skrx

Antwort

1

Sie Ihre Aliens in zufälligen Positionen

for i in range(60): 
    block = Block(BLUE) 
    block.rect.x = random.randrange(screen_width) 
    block.rect.y = random.randrange(350) 
    block_list.add(block) 
    all_sprites_list.add(block) 

platzieren, um sie in einer Linie zu bekommen, versuchen Sie die folgenden

for i in range(60): 
    block = Block(BLUE) 
    block.rect.x = 30 * i 
    block.rect.y = 120 
    block_list.add(block) 
    all_sprites_list.add(block) 

Da jedoch Sie haben 60 von ihnen, einige werden aus dem Bildschirm sein.

+0

Vielen Dank, ich reduzierte die Anzahl der Aliens, so dass sie alle auf dem Bildschirm passen konnten. Nochmals vielen Dank für die Hilfe !! – user108

+1

user108: Bitte lesen [_Was soll ich tun, wenn jemand meine Frage beantwortet? _] (Http://stackoverflow.com/help/someone-answers) – martineau

Verwandte Themen