我创造了一个游戏,它循环通过一个属性表来创建放置在屏幕上的敌人。创建的敌人存储在一个名为“baddie”的变量中,像x和y值这样的东西由我在表格中给出的属性决定。目前,“baddie”在屏幕上的不同位置创造了3个敌人。它看起来像这样。
for i=1, #level[section]["enemies"] do
local object = level[section]["enemies"][i]
baddie = display.newSprite(baddieSheet, baddieData)
baddie.anchorX = 0.5
baddie.anchorY = 1
baddie.x = object["position"][1]; baddie.y = object["position"][2];
baddie.xScale = -1
baddie.myName = "Baddie"
baddie.health = 15
baddie:setSequence("standrt"); baddie:play()
physics.addBody(baddie, "dynamic", {radius=22, density=0.1, friction=10.0, bounce=0.0})
baddie.isFixedRotation = true
enemyGroup:insert(baddie)
end
然后我将存储在baddie变量中的所有已创建实例插入到名为“enemyGroup”的显示组中。
现在这是我的问题。我正在研究我的游戏的AI并将其全部存储在一个enterFrame监听器中。我想制作一个名为“inRange”的“真/假”标志。当敌人的x位置在玩家x的20个像素范围内时,inRange = true。如果这是真的,敌人会攻击他。但我还没有想出办法让inRange标志检查每个个人敌人,而不是所有敌人。
我在考虑类似的东西,
for i = 1, enemyGroup.numChildren do
enemyGroup[i].widthBetween = enemyGroup[i].x - sprite.x
if enemyGroup[i].widthBetween <= 20 and enemyGroup[i].widthBetween >= -20 then
enemyGroup[i].inRange = true
else
enemyGroup[i].inRange = false
end
end
但问题是,enemyGroup [i] .inRange是一个本地值,我无法在循环外或其他函数中调用它。这显然是有问题的,因为在另一个函数中,当他们各自的inRange属性为真时,我希望每个敌人都有冲,滚,跳等。有没有办法可以存储enemyGroup [i] .inRange以便我可以随时调用它?
很抱歉,如果这个问题令人困惑。这是一个很难说的话。
答案 0 :(得分:0)
我不确定为什么这不适合你。 enemyGroup [i] .inRange不是local,它是enemyGroup [i]中对象的一个属性。它应该可以访问enemyGroup [i]。
就个人而言,我本来没有使用过display.newGroup(),而是我刚刚创建了一个范围为整个场景的数组/表。
local baddies = {}
然后在你的循环中:
--enemyGroup:insert(baddie) instead of this, do this:
baddies[#baddies + 1] = baddie
然后你有一个可以循环的表,但它的代码风格比功能更多。只要你的敌人组的范围足够高,可以看到场景可以看到的任何功能。
答案 1 :(得分:0)
你应该在下面的结构中创建一个文件:
module(..., package.seeall)
enemyGroup = {}
并且在您要使用此表的所有文件中,首先需要此文件(假设您将此文件命名为enemies.lua):
local enemiesArray = require "enemies"
-- somewhere in your code:
enemiesArray.enemyGroup[i].isRange = true -- or whatever you like to do
使用_G
变量有一个更好的选择。当您将对象存储到_G
时,您可以随意访问该对象(如着名的设计模式Singleton)。只需将变量设置一次,并在任何地方使用它,并尽可能多地使用它。例如:
-- in one file you set enemy table:
_G.enemies = enemyGroup
-- somewhere else in nowhere :)
print(_G.enemies.isRange)