2D游戏缩放函数中pos属性被意外修改的原因排查
2D游戏缩放时原位置向量被意外修改的解决办法
在2D相机视角模拟中,执行缩放逻辑时修改self.zoom_pos的属性会意外改变self.pos的原值,核心原因是**self.pos和self.zoom_pos指向了同一个向量对象**——Python中对象赋值是引用传递而非值拷贝,修改其中一个的属性会直接影响另一个。
解决办法
要确保self.zoom_pos是独立于self.pos的新对象,可采用以下几种方式:
初始化时创建独立向量实例
在类的初始化方法中,不要直接将self.zoom_pos赋值为self.pos,而是基于self.pos的数值新建向量对象(以常见的Vector2类为例):self.pos = Vector2(100, 0) self.zoom_pos = Vector2(self.pos.x, self.pos.y) # 新建独立实例,避免引用共享缩放时直接生成新的缩放后向量
在zoom函数中跳过修改属性的操作,直接基于self.pos的数值计算后生成新向量赋值给self.zoom_pos:def zoom(self,z): print(self.pos.x) # 基于原位置计算缩放值,直接创建新向量 self.zoom_pos = type(self.pos)(self.pos.x * z, self.pos.y * z) print(self.pos.x,z)使用向量类自带的拷贝方法(若框架支持)
多数游戏框架的向量类会提供拷贝方法,比如Pygame的Vector2.copy(),通过拷贝原向量再修改缩放值,避免影响原对象:def zoom(self,z): print(self.pos.x) # 拷贝原向量后再执行缩放操作 temp_pos = self.pos.copy() temp_pos.x *= z temp_pos.y *= z self.zoom_pos = temp_pos print(self.pos.x,z)
验证效果
使用测试数据self.pos.x = 100,z = 2验证,修改后self.pos.x会保持100,self.zoom_pos.x为200,符合预期。
内容的提问来源于stack exchange,提问作者TomGards
相关产品推荐
相关产品推荐

