用于Corona SDK的AI帮助

时间:2015-03-26 00:49:09

标签: artificial-intelligence corona

我创造了一个游戏,它循环通过一个属性表来创建放置在屏幕上的敌人。创建的敌人存储在一个名为“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以便我可以随时调用它?

很抱歉,如果这个问题令人困惑。这是一个很难说的话。

2 个答案:

答案 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)