关于lua中对象密钥访问的一些见解

时间:2013-05-08 09:37:38

标签: lua corona

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

我的问题附带如下调用。如果我尝试在这种情况下设置子弹的属性,所有者属性,我得到一个零错误,不会让我改变它。如果有人可以帮助我理解如何访问密钥和属性真的有用,这将帮助我很多。

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

1 个答案:

答案 0 :(得分:3)

你应该像这样设置你的课程

<强>子弹

Bullet = {}
Bullet_mt = { __index = Bullet }

function Bullet:new(co_ordinates)
    local obj = {x=co_ordinates[1],y=co_ordinates[2]}
    obj.owner = "You" --etc...
    return setmetatable(obj,Bullet_mt)
end

<强>敌人

Enemy = {slogan="Gettm!'"}
Enemy_mt = {__index = Enemy;}

function Enemy:new(args)
    local obj = {}
    --etc..
    obj.bullet = Bullet:new({0,0})
    return setmetatable(obj,Enemy_mt)
    --alert return setmetatable(obj,getmetatable(self))
end

function Enemy:getBulletOwner()
    return self.bullet.owner;
end

每次敌人在enemy:shoot射击时,你不应该要求“子弹”。如果你只想让敌人拥有一颗子弹你想为敌人制造一颗子弹 创建项目符号类的新“实例”并将其与您正在执行的bullet项关联obj.bullet= Bullet.new(...),但也将此功能引入{{1}的方法中1}}(所以你可以在旧的子弹超出范围等之后添加新的子弹......)。


如果表中不存在索引,它将在分配给相关表的元表中与Enemy相关联的表中查找索引。举个例子说__index,我们想通过a = Enemy:new()找出敌人的口号,我们会在a.slogan中查找索引slogan,但找不到它。因此,我们会在a的元表中检查与__index相关联的内容,在本例中为a。所以我们在Enemy中寻找slogan,它存在,所以我们最终得到了“Gettm!”。

在类定义

下添加以下代码
Enemy

可生产

en = Enemy:new()
print(en:getBulletOwner())
print(en.slogan)

还要对You Gettm!' a:b(arg1,arg2)之间的区别感到厌倦。 a.b(arg1,arg2)基本上等同于a:b(arg1,arg2),其中a.b(a,arg1,arg2)绑定到函数中的a。这方面的一个例子是:

self

产生

print(en.getBulletOwner())

,而

lua: l.lua:22: attempt to index local 'self' (a nil value)

产生

print(en:getBulletOwner())