繁体   English   中英

针对Corona SDK的AI帮助

[英]AI help for Corona SDK

我创建了一个游戏,该游戏在属性表中循环以创建要放置在屏幕上的敌人。 创建的敌人存储在一个名为“ 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”的“ True / False”标志。 当敌人的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] .inRange是一个局部值,我不能在循环外或其他函数中调用它。 这显然是有问题的,因为在另一个函数中,当每个敌人的inRange属性为true时,我想让每个敌人对其进行猛击,滚动,跳跃等操作。 有没有一种方法可以存储敌人组[i] .inRange,以便随时可以调用它?

抱歉,这个问题令人困惑。 很难说出来。

我不确定为什么这对您不起作用。 敌人组[i] .inRange不是本地的,它是敌人组[i]上对象的一个​​属性。 您可以访问敌人组[i]的任何地方都应该如此。

就我个人而言,我不会为此使用display.newGroup(),而是会创建一个针对整个场景的数组/表。

local baddies = {}

然后在您的循环中:

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

然后,您有了一个可以循环使用的表,但是它实际上是比功能更多的代码样式。 只要您的敌人组的作用域范围足够高,以使场景可以看到任何功能。

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

module(..., package.seeall)

enemyGroup = {}

在要使用此表的所有文件中,首先需要此文件(假设您将此文件命名为敌人.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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM