首页 > 解决方案 > 使用循环创建同一图像的多个实例,我可以独立移动图像的每个实例吗?

问题描述

我在 pygame 中有一个图像,其中有多个在 for 循环中调用的图像实例。有没有一种方法可以独立移动图像的每个实例,而无需按原样使用代码移动其他实例?还是我必须单独加载图像的单独实例?

def pawn(self): 
    y_pos = 100
    self.image = pygame.transform.scale(pygame.image.load('pawn.png'), (100,100))
    for x_pos in range(0,8,1):
        pieceNum = x_pos
        screen.blit(self.image, (x_pos*100, y_pos))

标签: pythonpygame

解决方案


我建议使用pygame.sprite.Spriteand pygame.sprite.Group

创建一个派生自的类pygame.sprite.Sprite

class MySprite(pygame.sprite.Sprite):

    def __init__(self, image, pos_x, pos_y):
        super().__init__() 
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.topleft = (pos_x, pos_y)

加载图像

image = pygame.transform.scale(pygame.image.load('pawn.png'), (100,100))

创建精灵列表

imageList = [MySprite(image, x_pos*100, 100) for x_pos in range(0,8,1)]

并创建一个精灵组:

group = pygame.sprite.Group(imageList)

可以通过.drawscreen是由创建的表面pygame.display.set_mode())绘制组的精灵:

group.draw(screen)

可以通过更改.rect属性的位置来更改精灵的位置(请参阅 参考资料pygame.Rect)。

例如

imageList[0].rect = imageList[0].rect.move(move_x, move_y)

当然,移动可以在类的方法中完成MySprite

例如

class MySprite(pygame.sprite.Sprite):

    # [...]

    def move(self, move_x, move_y):
        self.rect = self.rect.move(move_x, move_y)
imageList[1].move(0, 100)

推荐阅读