我只是有点好奇,也有点困惑。在我的 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 瞬间调用函数 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
我的问题带有如下调用。如果我在这种情况下尝试设置 Bullet 的属性,即 owner 属性,我会得到一个 nil 错误并且不会让我更改它。如果有人可以帮助我了解访问密钥和属性的真正工作原理,那将对我有很大帮助。
function enemy:setBulletOwner()
self.bullet.owner = self;
end
更新:
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