Artificial intelligence Corona SDK的AI帮助

Artificial intelligence Corona SDK的AI帮助,artificial-intelligence,coronasdk,Artificial Intelligence,Coronasdk,我已经创建了一个游戏,它通过一个属性表循环来创建要放置在屏幕上的敌人。创建的敌人存储在一个名为“baddie”的变量中,它们的x和y值由我在表中给它们的属性决定。目前,“坏蛋”在屏幕上的不同位置制造了3个敌人。看起来像这样 for i=1, #level[section]["enemies"] do local object = level[section]["enemies"][i] baddie = display.newSprite(baddieSheet, baddieD

我已经创建了一个游戏,它通过一个属性表循环来创建要放置在屏幕上的敌人。创建的敌人存储在一个名为“baddie”的变量中,它们的x和y值由我在表中给它们的属性决定。目前,“坏蛋”在屏幕上的不同位置制造了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
对于i=1,enemyGroup.numChildren do
enemyGroup[i].widthBetween=enemyGroup[i].x-sprite.x
如果enemyGroup[i].widthBetween=-20,则
enemyGroup[i]。inRange=true
其他的
enemyGroup[i]。inRange=false
终止
终止
但问题是,enemyGroup[i].inRange是一个局部值,我不能在循环外部或其他函数中调用它。这显然是有问题的,因为在另一个函数中,当每个敌人的inRange属性为true时,我希望每个敌人都能打、滚、跳等等。是否有一种方法可以将enemyGroup[I].存储在Range中,以便随时调用它


如果这个问题让人困惑,很抱歉。要说出来是一件很困难的事。

我不知道为什么这对你不起作用。enemyGroup[i]。inRange不是本地的,它是enemyGroup[i]上对象的一个属性。它应该在您可以访问enemyGroup[i]的任何地方都可用

就我个人而言,我不会为此使用display.newGroup(),相反,我只会创建一个范围为整个场景的数组/表

local baddies = {}
然后在循环中:

 --enemyGroup:insert(baddie)  instead of this, do this:
 baddies[#baddies + 1] = baddie

然后您就有了一个可以循环的表,但它实际上更多的是代码样式而不是功能。只要您的enemyGroup的范围足够高,场景中的任何功能都可以看到。

您应该在以下结构中创建一个文件:

module(..., package.seeall)

enemyGroup = {}
在要使用此表的所有文件中,首先需要此文件(假设您将此文件命名为敌人.lua):

有一个更好的选项供您使用
\u G
变量。当您将对象存储到
\u G
时,您可以随时随地访问该对象(如著名的设计模式Singleton)。只需将变量设置一次,然后在任何地方使用它,并且可以任意使用。例如:

-- in one file you set enemy table:
_G.enemies = enemyGroup

-- somewhere else in nowhere :)
print(_G.enemies.isRange)
-- in one file you set enemy table:
_G.enemies = enemyGroup

-- somewhere else in nowhere :)
print(_G.enemies.isRange)