You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:05:25