Lua+LOVE框架实现面向对象遇问题:多Ship实例显示异常
问题根源:全局变量导致实例被覆盖
这是代码错误,不是Lua解释器或LOVE框架的异常——问题出在你的Object:new方法里的变量o没有用local声明!
在Lua中,未用local修饰的变量会被视为全局变量。所以每次调用Ship:new()时,你都在复用同一个全局的o表:第一次创建ship1时,o指向第一个Ship实例;第二次创建ship2时,o被覆盖成第二个实例,最终ship1和ship2其实引用的是同一个对象(最后创建的那个),自然只会显示第二个实例。
修正后的通用Object类
只需要给o加上local声明,确保每次调用new都创建一个独立的局部实例表:
local Object = {} function Object:load(arg) end function Object:update(dt) end function Object:draw() end function Object:new(arg) local o = {} -- 这里加上local! setmetatable(o, self) self.__index = self o:load(arg) return o end return Object
额外说明
你的Ship类设计是合理的:将sprite、px、py定义在Ship类本身(而不是实例上),意味着所有Ship实例共享同一个精灵资源,这能节省内存,是正确的做法。
修正后再创建ship1和ship2,它们就是两个完全独立的实例,各自拥有自己的x、y、tint等属性,绘制时就能正常显示两个飞船了。
内容的提问来源于stack exchange,提问作者Okarin
相关产品推荐
相关产品推荐

