我只是好奇,以及有点困惑。在我的lua代码中,我从一开始就设置了一个新对象。lua中的对象密钥访问的一些洞察
enemy = {};
enemy.__index = enemy;
function enemy.new(args)
Obj = {};
setmetatable(Obj,enemy);
Obj.name = "bullet";
Obj.x = args.x;
Obj.y = args.y;
Obj.spriteTexFile= "Invader.png";
Obj.sprite = display.newImage(Obj.spriteTexFile);
Obj.sprite:setReferencePoint (display.TopLeftReferencePoint);
Obj.sprite.x = Obj.x;
Obj.sprite.y = Obj.y;
Obj.sprite.alpha = 0;
Obj.health = 100;
Obj.activeBul = false;
Obj.bullet = Bullet.new({x=Obj.sprite.x,y=Obj.sprite.y});
return Obj;
end
...
return enemy;
end
因此,当实例化一个新的Enemy obj时,我将调用上面的新函数。现在在同一个文件中,敌人对象中的函数我有以下函数,例如它允许我访问“self.bullet”,这是创建敌人时创建的Bullet对象。它也允许我在这个Bullet瞬间调用函数trajectBullet。
function enemy:shoot()
local Bullet = require "Bullet";
local DEFAULTTIME = 5;--Movement time per space
self.bullet:trajectBullet({x=self.sprite.x,y=display.contentHeight, time =
DEFAULTTIME*display.contentHeight-self.sprite.y)});
end
我的问题带有如下调用。如果我尝试在这种情况下设置一个子弹属性,所有者属性,我得到一个零错误,并不会让我改变它。如果有人能够帮助我理解访问密钥和属性的真正效果,这将帮助我解决很多问题。
function enemy:setBulletOwner()
self.bullet.owner = self;
end
UPDATE:
bullet = {};
bullet.__index = bullet;
function bullet.new(arg)
local Obj = {};
setmetatable (Obj, bullet);
Obj.sprite = display.newRect( 0, 0, 3, 7);
Obj.sprite.x = arg.x;
Obj.sprite.y = arg.y;
Obj.sprite:setFillColor (255, 255, 255 );
Obj.sprite:setReferencePoint (display.TopLeftReferencePoint);
Obj.owner = nil;
return Obj;
end
function bullet:trajectBullet(arg)
self.sprite.tween = transition.to(self.sprite,{ tansistion = easing.outExpo, y = arg.y, x=arg.x,time= arg.time,onComplete = function() bullet:cancelTween(self.sprite);
self.owner.sprite:dispatchEvent({name = "canShootAgain"}); end});
end
记住Obj.owner应该得到从下面的功能设置。
function enemy:setBulletOwner()
print("BULLET MADE");
self.bullet.owner = self;
end
也许,你正在执行'enemy.setBulletOwner()'代替'enemy:setBulletOwner()' – 2013-05-08 10:14:57
没有im正在执行敌人:setBulletOwner() – 2013-05-08 19:52:33
您忘记添加**完整**错误消息。有各种类型的“nil”错误信息 – dualed 2013-05-09 12:21:26