太空入侵者克隆问题

时间:2014-01-16 21:00:05

标签: pygame sprite

我正在研究Space Invaders这样的东西,因为我刚开始学习编程我试图保持简单,我想要的是敌人的船只从屏幕顶部出来然后安顿在一条线上。我设法让它们来了从某个速度的顶部,但我不知道如何使它们停在一条线上,例如在y = 40处。代码如下:

# Sprites vjezba.py
import pygame

# Define colors
black = (0,0,0)

white = (255,255,255)

red = (255,0,0)

green = (0,0,255)

# Define screen size

SCREEN_WIDTH = 420

SCREEN_HEIGHT = 400

# Classes

class Square(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([20,20])

        self.image.fill(red)

        self.rect = self.image.get_rect()

    def update(self):

        pos = pygame.mouse.get_pos()

        self.rect.x = pos[0]

        self.rect.y = pos[1]

class Enemies(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([20,20])

        self.image.fill(black)

        self.rect = self.image.get_rect()



    def update(self):

        speed_y = 1

        self.rect.y += speed_y


# Initialize pygame        

pygame.init()

# Initialize screen

screen = pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])

# Set the clock

clock = pygame.time.Clock()

# Create sprites lists

square_list = pygame.sprite.Group()

enemies_list = pygame.sprite.Group()

all_sprites_list = pygame.sprite.Group()

# Create sprites

#--- Enemies sprites

diff_x = 0

diff_y = 0

for i in range(10):

    enemies = Enemies()

    enemies.rect.x = 20 + diff_x

    diff_x += 40

    enemies.rect.y = 20 - diff_y

    diff_y += 20

    enemies_list.add(enemies)

    all_sprites_list.add(enemies)

# --- Square sprite

square = Square()

square.rect.x = 200

square.rect.y = 370

square_list.add(square)

all_sprites_list.add(square)

# -------Main Loop----------

done = False

while not done:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            done = True



    all_sprites_list.update()


    screen.fill(white)

    all_sprites_list.draw(screen)


    pygame.display.flip()

    clock.tick(40)

pygame.quit()

1 个答案:

答案 0 :(得分:2)

目前,update()的{​​{1}}看起来像这样:

Enemies

这有两个明显的缺陷:

  1. 速度在本地设置,然后在方法结束时再次丢弃;和
  2. 它对位置一无所知。
  3. 要解决此问题,我建议将def update(self): speed_y = 1 self.rect.y += speed_y 设为实例属性

    speed_y

    允许设置目标位置

    def __init__(self):
        ...
        self.speed_y = 1
    

    并在def set_target(y_pos): self.y_target = y_pos 中使用此信息,例如:

    update

    这是一个非常基本的例子,它只停留在目标def update(self): self.rect.y += self.speed_y if self.rect.y >= self.y_target: self.speed_y = 0 上(并且仅适用于一个维度),但希望能让您了解如何控制y的移动。< / p>