复制python的pygame表面对象

时间:2018-01-26 12:27:37

标签: python python-3.x pygame pygame-surface

我有关于copy.deepcopy和pygame表面对象的问题。

通常,我使用WSL和python来执行python(因为我必须在我的机器上运行windows但是我讨厌windows的命令行界面)。 我正在学习pygame - 制作一个简单的游戏。一切都运行正常,但我尝试使用我在AppData中定期安装的python3和pygame来启动它,这通常可以正常工作,但这次它返回的错误在WSL中不会发生。

错误是:TypeError:无法pickle pygame.Surface对象 这是关于错误的代码。

player = Player(start)
temp = deepcopy(player)

这是班级本身:

class Player(pygame.sprite.Sprite):
    def __init__(self, pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(os.path.join('img','player.png'))
        self.r = 17
        self.rect = self.image.get_rect()
        self.rect.center = (pos[0] + 8.5, pos[1] + 8.5)
        self.rect.inflate_ip(-2,-2)
        self.vel = Vector(0,0)

现在我为什么要做我正在做的事情。我从零开始制作东西,我没有查找类似的游戏或任何东西,我就去了。关键是,在游戏领域,有一个玩家和墙壁。玩家不能穿过墙壁。

我这样做的方式是 - 在移动之前,我对玩家进行深度复制,然后副本移动。然后我检查墙壁碰撞,如果副本没有碰到墙壁,我移动原始玩家。然后我删除了副本。这是一种非常草率的方式,但我无法想出更好的主意。

我想做这个工作。我不介意是否有人建议我更好地复制播放器或以不同方式实现移动。如果有人想看到更多的代码,请告诉我,我会很高兴地给你更多的代码:)

提前感谢您的帮助。 附:这不是作业,它实际上是拖延作业lol

1 个答案:

答案 0 :(得分:1)

没有理由复制整个玩家对象。

如果您只是使用精灵的Rect来检查碰撞,则只需使用Rect函数移动move。它将返回一个新的,更新的Rect,然后您可以使用它来检查冲突。

如果发生碰撞,请不要做任何事情。如果没有碰撞,请通过更改原始Rect来允许移动,例如与move_ip