Python 使用Pygame,在不同位置绘制图像的副本

Python 使用Pygame,在不同位置绘制图像的副本,python,list,class,pygame,sprite,Python,List,Class,Pygame,Sprite,这是一种后续行动: 注意:这是在python中使用pygame库实现的 我想对这一声明进行澄清,这是对上述问题的评论: 另一件重要的事,不要使用相同的Sprite()或相同的 不同位置的矩形。如果你想再画一份 在新位置的相同图像复制矩形,然后 创建一个新的Sprite()对象 我有一组游戏资产,我想随机挑选一个来添加我的资产 雪碧集团。我目前正在这样做: class TestSprite(pygame.sprite.Sprite): def __init__(self, strFolde

这是一种后续行动:

注意:这是在python中使用pygame库实现的

我想对这一声明进行澄清,这是对上述问题的评论:

另一件重要的事,不要使用相同的Sprite()或相同的 不同位置的矩形。如果你想再画一份 在新位置的相同图像复制矩形,然后 创建一个新的Sprite()对象

我有一组游戏资产,我想随机挑选一个来添加我的资产 雪碧集团。我目前正在这样做:

class TestSprite(pygame.sprite.Sprite):
    def __init__(self, strFolder):
        super(TestSprite, self).__init__()
        self.image = load_image(strFolder + 'x.png'))
        #....

def GetRandomAsset():
    rnd = random.randrange(1, 4)
    if rnd == 1:
        return TestSprite('assets/A/')
    elif rnd == 2:
        return TestSprite('assets/B/')
    elif rnd == 3:
        return TestSprite('assets/C/')
    else:
        return TestSprite('assets/D/')
    #....

my_group = pygame.sprite.Group()
my_group.add(GetRandomAsset())
#.....
#Control FPS
#Check Events
#Update State
#Clear Screen
#Draw Current State
#Update Display
一切正常;每次运行上述代码时,屏幕上都会显示一个新的精灵。我的问题是每次我添加一个精灵,我必须从磁盘加载它,即使我一遍又一遍地使用相同的4个图像

我想,将我所有的资产存储在一个名为PreloedAssets的全局列表中会更明智。然后,每当我需要一个时,只需执行:
my_group.add(prepreedassets[x])
但当我尝试这样做时,我只能拥有我的每个资产的一个副本

如何预加载所有资产,然后在需要时获取存储的数据

谢谢

另一件重要的事情是,不要在不同的位置使用相同的Sprite()或相同的矩形。如果要在新位置绘制同一图像的另一个副本,请复制矩形,然后创建一个新的Sprite()对象

在这种情况下,这是一个有效的建议。当然,多次将曲面blit到不同的位置(例如使用不同的
Rect
s)是没有问题的,但是如果使用
组来处理/简化图形,则每个要绘制图像的位置都需要一个对象


要回答您的实际问题:

您不需要缓存
Sprite
实例。只需缓存
曲面
实例

这样,您就可以拥有不同的
Sprite
对象,将相同的图像绘制到不同的位置

一个简单的缓存实现可能如下所示:

images = {'a': load_image('assets/A/x.png'),
          'b': load_image('assets/B/x.png'),
          'c': load_image('assets/C/x.png'),
          'd': load_image('assets/D/x.png')}
...
class TestSprite(pygame.sprite.Sprite):
    def __init__(self, image_key):
        super(TestSprite, self).__init__()
        self.image = images[image_key]
...
def GetRandomAsset():
    image_key = random.choice(images.keys())
    return TestSprite(image_key)
这将预先加载所有图像(可能不是您想要的);添加惰性很容易,但您可能不希望出现可能的延迟(最好的情况取决于您实际加载的图像数量和时间)

你甚至可以浏览游戏目录中的所有文件夹,自动检测并加载所有图像,但这样的狂热超出了这个答案的范围