我有关于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
答案 0 :(得分:1)
没有理由复制整个玩家对象。
如果您只是使用精灵的Rect
来检查碰撞,则只需使用Rect
函数移动move
。它将返回一个新的,更新的Rect
,然后您可以使用它来检查冲突。
如果发生碰撞,请不要做任何事情。如果没有碰撞,请通过更改原始Rect
来允许移动,例如与move_ip
。