2016-06-04 2 views
-1

Я делаю Space Invaders на pygame, но в настоящее время я застрял в организации инопланетян в линии рядом друг с другом. Пришельцы в списке (60 из них) Мне нужна помощь, чтобы получить их в линию. Вот то, что я до сих пор:список объектов рядом друг с другом?

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

Что вы пробовали? Как вы думаете, что это может сработать? Подсказка: используйте «прямые» инопланетян. Некоторые быстрые заметки: не загружайте изображения в классы. Каждый раз, когда вы создаете экземпляр класса, Pygame должен снова загрузить изображение. Вы можете оставить изображения в виде глобальных констант. Почему вы устанавливаете мышь видимым внутри метода '__init__'' Player'? В следующий раз замените свои изображения на простые «pygame.Surfaces» перед отправкой кода, затем мы можем просто скопировать и вставить его. Также http://codereview.stackexchange.com/ – skrx

ответ

1

Вы помещаете ваши иностранцев в случайных позициях

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) 

Чтобы получить их в линии, попробуйте следующее

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) 

Однако, поскольку у вас их 60, некоторые из них будут вне экрана.

+0

Большое вам спасибо, я уменьшил количество инопланетян, чтобы они могли поместиться на экране. Еще раз спасибо за помощь !! – user108

+1

user108: Пожалуйста, прочитайте [_Что делать, если кто-то отвечает на мой вопрос? _] (Http://stackoverflow.com/help/someone-answers) – martineau

Смежные вопросы