我正在尝试为 roguelike 实现基于速度的转向系统。我已经使用元方法设置了一个 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
这会将暴徒的 self.turn_counter 放入表中。同时,在另一个模块中,我定义了这两个函数,这是问题的核心:
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 实例将始终是玩家 1 和 2,分别分配给变量 player1 和 player2。而且,事实上,它可以很好地在玩家之间来回传递控制!但显然,这对于一个功能齐全的游戏来说是不够的。我也需要怪物。
allTurnCounters 表按顺序从每个生成的生物中获取新条目(一个包含玩家和怪物的类,因此它们可以共享统计信息)。这是我的问题: 如何让 Lua 动态检索与该表中给定的 turn_counter/value 关联的表的名称,并使用它来获得轮流优先级,即使在我不知道程序产生了什么的情况下也是如此提前或它将在生成顺序中占据什么位置?
我有 3 个想法,但我都不知道如何实施。一种方法是将整个实例表发送到另一个表,而不仅仅是它们的 turn_counter,然后以某种方式获取一对值(表本身和表中的 my_turn),直接更新 my_turn 的值。
另一种方法可能是使用环境 _G... 以某种方式。我仍在仔细研究 PiL 的第 14 章,试图使其适应我的目的,但 value = _G[varname] 似乎是我可以使用的强大代码。不知道如何,只是还没有。
我的最后一个想法是编写某种字符串感应查找替换,它可以在每个暴徒的表中获取一些其他值,然后将其弹出到 my_turn 的前面。就像,为每种暴徒类型分配一些具有已知模式的值,我可以在 string.find 和 string.gsub 中使用,以喜欢...手动使代码行按预期读取。不过,似乎不优雅。
我很幸运在这里问了我以前的 Lua/Love2D 问题,所以我想在我思考的时候把它扔出去!