2

ローグライクに速度ベースのターン システムを実装しようとしています。メタメソッドを使用して Mob クラスをセットアップしたので、以下を変数に割り当てると、特定のグリッド座標でモブがマップにスポーンされます。

function Mob:spawn(x,y,m)
    local mob = {}
    setmetatable(mob, Mob)
    mob.x = x
    mob.y = y
    mob.is_monster = m
    return mob
end

それが完了したら、次のように呼び出します。

function Mob:roll_call()
    who_is_here[self.y][self.x] = self.is_monster
    self.turn_counter = self.turn_counter * math.random(0.9, 1.1)
    table.insert(allTurnCounters, self.turn_counter)
end

これにより、mob の self.turn_counter がテーブルに入れられます。一方、別のモジュールでは、問題の核心である次の 2 つの関数を定義しました。

function turn.decrement_counters(dt) -- runs in Dungeon.update(dt) and subtracts from allTurnCounters
    for i = 1,#allMobsSpawned do
            if allTurnCounters[i] <= 0 then
                    allTurnCounters[i] = 0
                    turn_active = true
                    whose_turn = i
                    return
            elseif allTurnCounters[i] > 0 then
                    allTurnCounters[i] = allTurnCounters[i] - (10 * dt)
            end
    end
end

function turn.whose_is_it() -- called when an entry in allTurnCounters goes zero
    if whose_turn == 1 then -- spots 1 and 2 in the spawn list are only ever for players
            player1.my_turn = true -- turns on player 1's keys
    elseif whose_turn == 2 then
            player2.my_turn = true -- turns on player 2's keys
    elseif whose_turn >= 3 then -- above 3 we're in monster territory

    end
end

初期化される Mob の最初の 2 つのインスタンスは常にプレーヤー 1 と 2 であり、それぞれ変数 player1 と player2 に割り当てられることにしました。そして、そのままで、プレイヤー間でコントロールをやり取りするのにうまく機能します! しかし明らかに、それはフル機能のゲームには十分ではありません。モンスターも必要です。

allTurnCounters テーブルは、スポーンするすべての Mob から順番に新しいエントリを取得します (プレイヤーとモンスターの両方を含むクラスで、統計を共有できます)。これが私の質問です: Lua にそのテーブル内の特定の turn_counter/value に関連付けられたテーブルの名前を動的に取得させ、それを使用してターンの優先順位を取得させるにはどうすればよいですか?事前に、またはスポーン順序でどの位置を占めますか?

私には 3 つのアイデアがありますが、どれも実装方法がしっかりしていません。1 つの方法は、turn_counters だけでなく、インスタンス テーブル全体を別のテーブルに送信し、何らかの方法で値のペア (テーブル自体とテーブル内の my_turn) を取得して、my_turn の値を直接更新するようなものです。

別の方法は、何らかの方法で環境 _G... を使用することです。私はまだ PiL の第 14 章を自分の目的に合わせようと調べていますが、value = _G[varname] はこれに使用できる強力なコードのようです。方法はまだわかりません。

私の最後のアイデアは、おそらく、各モブのテーブルで他の値を取得し、my_turn の前にポップできる、ある種の文字列感知検索置換を作成することでした。同様に、mob の種類ごとに既知のパターンで値を割り当て、それを string.find で使用し、次に string.gsub で使用して、コード行を意図したとおりに手動で読み取らせます。しかし、非エレガントに見えます。

ここで以前の Lua/Love2D の質問をすることができて幸運だったので、考えているうちに放り出しておきましょう!

4

2 に答える 2

1

これをどのように実装すべきかについての私の提案は次のとおりです。

  1. の代わりにallTurnCounters[i]、モブにturn_counterプロパティを与えて使用しますallMobsSpawned[i].turn_counter。次に、削除しallTurnCountersます。

  2. mob 番号を に保存する代わりにwhose_turn、mob 自体を保存します。(注:「モブ自体」と言うときは、「モブ自体への参照」の略です)

    だから代わりに

    whose_turn = i
    

    あなたが持っているでしょう:

    whose_turn = allMobsSpawned[i]
    
  3. 現在whose_turnの番の Mob を保持します。whose_turn == player1、などを簡単に確認できますwhose_turn == player2。おまけとして、プレイヤーが最初のモブであることに依存しなくなりました。

Mob のプロパティにアクセスできます。たとえば、true のwhose_turn場合は、同じフィールドにアクセスします。whose_turn == player1whose_turn.xplayer1.x

于 2016-09-08T03:15:48.890 に答える