2017-08-21 3 views
1

LUAとLove2Dで自分の足を濡らそうとしていて、Luaでオブジェクトのインスタンス化/アクセスに関する問題が発生しています。バグとオブジェクト内の2D(Lua)の予期しないnilを好きになる

ソースはここで見つけることができます:https://bitbucket.org/dannsee/love_scrollingshooter

私は私のメインである、私は、オブジェクトを作成し、敵

enemies = Enemies:new() 

と敵の内部オブジェクト、私は保持するオブジェクトを作成します私はタイマーに電話しています。

timers = Timers:new() 

だから、敵のコンストラクタ 'メソッドのルックス(基本的に)この

Enemies = {} -- so that Enemies will not be nil when new() is called 
timers = {} -- so that timers will be accessible in the class scope 

function Enemies:new(enemies) 
    enemies = enemies or {} 
    timers = Timers:new() 
    setmetatable(enemies, self) 
    self.__index = self 
    return enemies 
end 

のように作成されたタイマーは、このような

Timers = {} -- so that Timers will not be nil when new() is called 

function Timers:new(timers) 
    timers = timers or { 
     miniBombTimerMax = 0.2, 
     miniBombTimer = minibombTimerMax 
    } 
    setmetatable(timers, self) 
    self.__index = self 
    return timers 
end 

として見ている間、しかし、私は1つをrefrenceしようとすると、タイマーの中から(敵のオブジェクトの内部から)、私はゼロ値の例外を得ています。

timers.miniBombTimer -- Produces nil exception 

このクラス内で作成されたオブジェクトであり、それは値、及び2が割り当てられる前に、= {}タイマとして局所的にインスタンス化されるので、これは、両方の1が、範囲にあるべきであるように思わ。それは 'コンストラクタ'に値が与えられているためではありません。しかし、ここでは私が握っていないことが増えているようです。

私はこの時点で明らかになっているかもしれないが、これは有効であるべきであると思われる変数の範囲について読んだことがあるからです。なぜタイマーが値で作られていないのか分かりません。

+0

はhttp://lua-users.org/wiki/ObjectOrientationTutorialて読みますか?あなたは問題のコードの部分を表示していませんが、おそらくあなたは 'self'を使用していませんか? – smarx

+0

コンストラクタも 'self'を使用していません。私は 'タイマー 'を'敵'クラスのメンバーにしたいと思っていますが、そうでないかもしれませんか?おそらく、あなたはこのクラスをどのように使うつもりであるかの最小限の例を共有することができます。 – smarx

答えて

0

グローバルに注意してください! Luaでは、間違ってグローバル変数を設定するのは簡単ではありませんが、そういったことが起こっているようです。ここでは3行目の

function Enemies:new(enemies) 
    enemies = enemies or {} 
    timers = Timers:new() 
    setmetatable(enemies, self) 
    self.__index = self 
    return enemies 
end 

timersが、ここでローカル変数として存在していないので、この値ではなくtimers呼ばグローバル変数に入れれてしまいます。あなたがenemiesのプロパティを設定したい場合は、明示的enemies言及する必要があります。今すぐ

function Enemies:new(enemies) 
    enemies = enemies or {} 
    enemies.timers = Timers:new() 
    setmetatable(enemies, self) 
    self.__index = self 
    return enemies 
end 

を、次のように記述:

しかし、私はタイマーの1(からのrefrenceしよう敵のオブジェクトの中に)、私はゼロ値の例外を取得しています。

ルアには、「オブジェクト内部」または「クラス内部」の概念はありません。いくつかの言語では、クラスの中にコードを書くときに、クラスのメンバーのすべてが範囲内にあり、それらを "裸"と呼ぶことができます。ルアはそれらの言語の一つではありません。 Luaでは、「クラスメンバ」を参照する場合は、アクセスしているオブジェクトを明示的に示すドット表記を使用する必要があります。 (または、あなたは_ENVを使って "高度な方法"を行うことができます)

ところで...

timers = {} -- so that timers will be accessible in the class scope 

私がこの質問に見ることから、この行はあまり効果がありません。これは決して使用されないグローバル変数を作成するだけです。

また、Enemies:newでこの行:

self.__index = self 

はこれだけEnemies.__indexEnemies:newが呼び出されるたびに設定します。これは罰金ですが、あなたにも一度だけ、それを設定することがあります。

function Enemies:new(enemies) 
    enemies = enemies or {} 
    enemies.timers = Timers:new() 
    setmetatable(enemies, self) 
    return enemies 
end 

Enemies.__index = Enemies 
関連する問題