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()
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