0

私は少し興味があるだけでなく、少し混乱しています。私の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 のプロパティ、所有者プロパティを設定しようとすると、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
4

1 に答える 1

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。敵に弾丸を1つだけ持たせたい場合に敵用の弾丸を作成したい場合は、弾丸クラスの新しい「インスタンスbullet」を作成し、これまで行ってきたようにキーに関連付ける必要がありますobj.bullet= Bullet.new(...)が、この機能をに導入する必要がありますの方法Enemy(古い弾丸が範囲外になった後に新しい弾丸を追加できるようにするためなど)。


__indexテーブル内にインデックスが存在しない場合、問題のテーブルに割り当てられたメタテーブルで関連付けられたテーブル内のインデックスを探します。例としてa = Enemy:new()、敵のスローガンを見つけたかったのでa.slogan、インデックスを探しましたslogana、見つかりませんでした。__index次に、 のメタテーブルで何が関連付けられているかを確認します。aこの場合はEnemy. sloganinを探すとEnemy、存在するので「Gettm!」で終わります。

クラス定義の下に次のコードを追加します

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())

生産する

You
于 2013-05-08T10:17:43.937 に答える