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