2012-02-14 24 views
1

私はコロナが初めてです。私はこれを解決する方法がわかりません。コロナ/ルア関数スコープ

メインでは、2つのローカルオブジェクト、プレーヤーと敵を作成しています。

プレーヤーには、takeDamageという機能があります。

敵の中からplayer.takeDamageを呼び出そうとすると、その機能が表示されません。

メインは両方のオブジェクトを所有しており、お互いを知りません。

EnemyはどのようにしてPlayerにダメージを与えることができるようにその機能を呼び出すことができますか?

main.luaが含まれています

-- Create player character 
local player = require("player"); 
player = player.new(); 

-- Create enemy character 
local enemy = require("enemy"); 
enemy = enemy.new(); 

を私はプレイヤーがグローバル作ることができると思うが、私が知っているから、それはベストプラクティスではありません。

ご協力いただければ幸いです。

+0

'player:takeDamage'にするべきではありませんか?セミコロンはインスタンスメソッドとしてそれを示します。 –

答えて

1

「プレーヤー」インスタンスが1つしかないと想定すると、になります。

-- main.lua 
local player = require 'player'.new() 
local enemy = require 'enemy'.new() 
enemy:setPlayer(player) 

-- enemy.lua 
... 
function enemy:setPlayer(player) 
    self.player = player 
end 

以降のプレーヤーを参照するために敵のコードでself.playerを使用します。そうしないと、これらの線に沿って何かをしなければならないでしょう。プレイヤーの参照はすべての敵のインスタンスにコピーされるため、これはメモリを消費することに注意してください。

私は、モジュールとインスタンスを同じように呼び出すことはできません。すなわち、playerです。後でモジュールまたはインスタンスを意味するかどうかは不明確になります。安全な方法はPlayerEnemyとしてモジュールを呼び出すことであろう、とのコードは次のようになります。

Player = require 'Player' 
local player = Player.new() 
+0

おかげでMichal。このゲームには1人のプレイヤーしかいません。他のすべては、対話できる静的オブジェクト、または敵のいずれかになります。私はあなたがここで何をしているのかを見て、敵にプレイヤーへの参照を与えます。プレーヤーをグローバルにするよりも優れているとお考えですか?命名規則を明確にしていただきありがとうございます。わかりやすくするために、名前に少なくとも別の封印を付ける必要があります。 – Kenny

+0

私は個人的にグローバル変数を使って 'player'を設計します。1つの理由は、どこでも利用できるということです。私が書いたような洗練されたスキームを設計する必要はありません。別の理由は記憶です.N(敵の数)ではなく、プレイヤーへの参照が1つしかありません。最後のアプローチは、プレーヤーと他の必要なゲーム状態を含む 'gameState'グローバルを持つことです。 –

+0

敵が相互にやりとりする必要があるかもしれないと言わざるを得なかったので、グローバルオプションが適切かどうかはわかりません。すべてのエンティティがグローバルになることは望ましくありませんか? – Kenny

1

は理想的には、直接敵を参照プレーヤーやプレーヤーを参照する敵を望んでいません。代わりに、各参加者をゲームループでポーリングし、その結果に基づいてゲームの状態を更新することができます。実際のゲームでは

local player = make_player() 
local enemy = make_enemy() 

--game loop - in a real game this isn't a busy while 
while true do 

    local move = player.move() 
    local result = validate_move(move) 
    if result.is_valid then 
     update_position(player, result) 
    end 

    move = enemy.move() 
    result = validate_move(move) 
    if result.is_valid then 
     update_position(enemy, result) 
    end 

    local attack = player.attack() 
    local attack_result = validate_attack(attack) 
    if attack_result.hit then 
     update_health(enemy, attack_result) 
    end 

    -- more game logic here 

    render(player) 
    render(enemy) 
end 

、状態変化がeventsによって駆動されるだろう - 私のビジーループ(while true do)が一般的な考え方を示しているなどのタッチイベント、drawing events、。

実装が不足している場合は、想像力を使用する必要があります。

ゲームをモデル化する方法はたくさんあります。私はこれが最高だとは思わない。ただし、相互作用する要素を切り離す1つの方法を示しています。

+0

コービンにお返事いただきありがとうございます。ターンベースのゲームでここに表示されているモデルは何ですか?私はこれが私が探しているものなのかどうかはわかりませんが、私はそれについて考えて、私がしようとしているものにどのように適合するかを確かめることができるかどうかを見ます。 – Kenny

+0

@Kenny - それはターンまたはリアルタイムゲームのために働く。 'while'ループをイベント - UIアクション(turnまたはreal-time)またはフレームイベント(real-time only)に置き換えます。重要な特徴は、直接の参照でそれらの要素を相互に対話することができる要素間のアクションを調整するコントローラ/ブローカ/マネージャである。それらを分離しておくことで、自分の行動や責任について簡単に理由を説明することができます。 –

+0

よろしくお願いします。 :o) – Kenny