在pygame中创建两个动态图像

时间:2015-10-08 05:58:58

标签: python pygame

我有一条垂直线的图像,想要创建其中两条。我希望它们随机分开并缩小间隙(同时保持最小和最大距离 - 我等待先修复它),同时沿x轴移动。 y coords不动。

有许多使用pygame创建更复杂的精灵和游戏的例子,但是我找不到一个足够简单来确定我应该做的事情,所以任何帮助都会受到赞赏。此代码基于找到here.

的简单示例

这是我到目前为止的最基本的代码。

class Squeeze(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.img_load()

    def update(self):
        self.rect.x += random.randint(-1, 1)
        if self.rect.x >= 1920:
            self.rect.x += -1
        if self.rect.x <= 0:
            self.rect.x += 1

    def img_load(self):
        self.image = pygame.Surface([SCREEN_WIDTH, SCREEN_HEIGHT])
        self.image.fill(BLACK)
        self.rect = self.image.get_rect()


pygame.init()

SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
FPS = 60
wall = pygame.image.load('wall.png')
wall_list = pygame.sprite.Group()

BLACK = (0, 0, 0)
for i in range(2):
    wall = Squeeze()
    wall.rect.x = random.randrange(SCREEN_WIDTH)
    wall.rect.y = random.randrange(SCREEN_HEIGHT)
    wall_list.add(wall)

done = False
clock = pygame.time.Clock()

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

    screen.fill(BLACK)
    wall_list.update()
    wall_list.draw(screen)

    clock.tick(60)
    pygame.display.flip()

pygame.quit()

我对pygame.sprite.Group()交易感到困惑。如何分别加载和操作这两个图像?任何其他建议也值得赞赏。

1 个答案:

答案 0 :(得分:1)

基本上“精灵”是游戏中的可见游戏对象。 Pygames pygame.sprite.Sprite类被称为所有这些对象的“基类”。

每次创建Squeeze类时,派生形式的Pygames内置精灵基类:

class Squeeze(pygame.sprite.Sprite):
    def __init__(self):
        ...

pygame.sprite.Sprite类的每个对象(或实例)都包含

  • .update()方法和
  • .image
  • .rect属性。

正如documentation所述,“* ...派生类将要覆盖Sprite.update()并指定Sprite.imageSprite.rect属性。*”
您是通过在img_load()课程的__init__()方法中调用Squeeze方法来完成此操作的。

问题是,您的.rect被指定为与屏幕相同的尺寸(self.image = pygame.Surface([SCREEN_WIDTH, SCREEN_HEIGHT])),而.image属性与您的显示屏幕颜色相同,所以您可以看到了。

尝试将img_load()方法修改为

def img_load(self, img):
    self.image = img
    self.rect = self.image.get_rect()

如您所见,修改后的img_load()方法需要一个图像对象 - 它将传递给img参数。因此,您还需要更改__init__()方法:

def __init__(self, img):
    pygame.sprite.Sprite.__init__(self)
    self.img_load(img)

当现在实例化(例如创建类的对象)Squeeze对象时,需要将图像(在我们的例子中为wall_img)传递给构造函数:

#... main programm

wall_img = pygame.image.load('wall.png') #load an image
wall_list = pygame.sprite.Group() #create a sprite group

BLACK = (0, 0, 0)
for i in range(2):
    wall = Squeeze(wall_img) #create a sprite
    wall.rect.x = random.randrange(SCREEN_WIDTH)
    wall.rect.y = random.randrange(SCREEN_HEIGHT)

    wall_list.add(wall) #add the sprite to the sprite group

您使用的第二个内置类是pygame.sprite.Group类 - 一个容器,可以容纳和管理(修改)它包含的精灵。

调用精灵组实例的.update()方法,Pygame 会自动调用此组中所有精灵的update()方法。这意味着您可以通过实现其update()方法来控制精灵行为,如下所示:

#update method of the Squeeze class
def update(self):
    #any logic which changes sprite
    self.rect.x += random.randint(-1, 1)
    if self.rect.x >= 1920:
        self.rect.x += -1
    if self.rect.x <= 0:
        self.rect.x += 1

致电

wall_list.draw(screen)

使用源表面的screen属性以及位置.image,您的spites将被置于.rect曲面上。

如果您现在不想拥有不同的图像,只需将其他图像(或曲面)传递给Squeeze构造函数:

#... main programm

wall_imgs = [pygame.image.load('wall.png'),
             pygame.image.load('other_wall.png')] #load images in list
wall_list = pygame.sprite.Group() #create a sprite group

BLACK = (0, 0, 0)
for i in range(2):
    wall = Squeeze(wall_imgs[i]) #create a sprite
    wall.rect.x = random.randrange(SCREEN_WIDTH)
    wall.rect.y = random.randrange(SCREEN_HEIGHT)

    wall_list.add(wall) #add the sprite to the sprite group

我希望这会对你有所帮助:)。