我只是好奇,以及有點困惑。在我的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