ローグライクに速度ベースのターン システムを実装しようとしています。メタメソッドを使用して 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 の質問をすることができて幸運だったので、考えているうちに放り出しておきましょう!