如何复制包含pygame。表面?

2024-05-15 01:48:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pygame编写一个2D游戏引擎,我一直在写产卵类。 我想要实现的是一种创建产卵器的简单方法,比如:

bullet = Bullet()
spawner = Spawner()
spawner.set_spawn_object(bullet)

我正在使用复制.deepcopy内部集合\u生成\u对象

基本上我想传递一个对象到产卵器,它应该复制那个对象并保存那个副本。然后每n秒它将通过复制到游戏对象的全局列表来产生该对象,这些对象被渲染、碰撞等。我需要一个deepcopy,因为我想以后单独修改它们(例如位置、名称、纹理)。问题是曲面不能以这种方式复制。你知道吗

现在,我的游戏引擎中的每个对象都有自己的曲面,我计划做的是将所有曲面保存在一个单独的类中,以提高效率。这可以解决这个问题,因为我不会复制曲面。但是。。。你知道吗

假设我有一个项目符号和一个资源管理器对象。 项目符号有一个指向资源的指针_manager.bullet\u纹理(这是一个pygame.表面)。你知道吗

那我就可以了 bullet2=copy.deepcopy(bullet) 因为我要复制的是指针,而不是曲面本身。你知道吗

问题是python没有指针,所以我应该怎么做?你知道吗


Tags: 项目对象方法引擎游戏符号pygame曲面
1条回答
网友
1楼 · 发布于 2024-05-15 01:48:41

不能在pygame.Surface上使用copy模块,但Surface有自己的Surface.copy方法。你知道吗

您可以为类定义一个copy方法,该方法使用Surface实例的Surface.copy方法创建一个包含所有所需属性副本的新实例。你知道吗

如果有很多属性,可以使用特殊的内置属性__dict__:它包含一个属性(键)及其值的字典,您可以循环使用它,为每个属性分配一个原始属性的副本。你知道吗

一个非常简单的例子:

class Myobject:
    def __init__(self, image=None, rect=None):
        self.image = image #a pygame surface
        self.rect = rect #a rectangle
        self.level = 0

    def copy(self):
        copyobj = Myobject()
        for name, attr in self.__dict__.items():
            if hasattr(attr, 'copy') and callable(getattr(attr, 'copy')):
                copyobj.__dict__[name] = attr.copy()
            else:
                copyobj.__dict__[name] = copy.deepcopy(attr)
        return copyobj

现在如果你这样做了:

myobj = Myobject(an_image, a_rectange)
myobj2 = myobj.copy()

myobj2myobj的“副本”。它的image和rect是具有相同值的不同实例,您可以安全地编辑后者,而前者保持不变。你知道吗

因此,如果您想创建一个产卵器,产卵器可能会调用传递对象的copy方法。你知道吗

class Spawner:
    @staticmethod
    def set_spawn_object(obj):
        return obj.copy()

相关问题 更多 >

    热门问题