0

我正在尝试编写一些东西,其中有生物在舞台上来回奔跑,上下奔跑,而我作为玩家,必须尝试接近它们,并捡起它们。舞台上也有界限——

  1. 地图约束——一个大的矩形框很容易完成。我已经做到了。
  2. 地图内的边界也是矩形,但不是将玩家弹回矩形内,而是尝试做相反的事情——让玩家远离它。

我的代码现在看起来像这样:

//Conditions that check if player/monsters are hittesting the boxes (rocks 
//and stuff), then if correct, bounce them away. Following code excludes 
//the monsters for simplicity.

    if((mcPlayer.x - aBounceBox[b].x) < 0 && mcPlayer.y <= (aBounceBox[b].y + aBounceBox[b].height/2) && mcPlayer.y >= (aBounceBox[b].y - aBounceBox[b].height/2))
                {
                    mcPlayer.x = aBounceBox[b].x - aBounceBox[b].width/2 - mcPlayer.width/2;
                }
//Duplicate above code for right side of box here
                if((mcPlayer.y - (aBounceBox[b].y + aBounceBox[b].height/2)) < 0 && (mcPlayer.x + mcPlayer.width/2) > (aBounceBox[b].x - aBounceBox[b].width/2) && (mcPlayer.x - mcPlayer.width/2) < (aBounceBox[b].x + aBounceBox[b].width/2))
                {
                    mcPlayer.y = aBounceBox[b].y + aBounceBox[b].height/2;
                }
//Duplicate above code for Upper boundary of box here

上面的代码效果不太好,因为在盒子的左右两侧反弹的代码与我正在测试的盒子的上下部分冲突。任何想法如何顺利地做到这一点?

另外,我遇​​到的另一个问题是游戏中怪物的路径。我试图让他们做以下事情:

  1. “有机地”四处走动,或者随机地移动一点——移动一点,停止。如果他们遇到边界,他们会停下来移动到别处。不关心去哪里,只要他们停止移动到岩石和树木中,诸如此类的事情。
  2. 尽量不要重叠,尽量在舞台上走动。
  3. 如果它们重叠,则将彼此推开,尽管我想让它们稍微重叠。

我正在缓慢地构建该代码,但我想我只想问是否有人对如何做到这一点有任何想法。

4

1 回答 1

0

要回答您的第一个问题,您可以尝试实现一个新的类/对象,它指示两个显示对象之间的 xy 偏移量。为了更清楚地说明这个想法,你可以有一个类似的函数:

public function getOffset(source:DisplayObject, target:DisplayObject):Object {
    var dx:Number = target.x - source.x;
    var dy:Number = target.y - source.y;
    return { x:dx, y:dy };
}

首先检查英雄角色是否与另一个对象发生hitTestObject(displayObj)碰撞DisplayObject。如果结果为 则继续true

假设你传入你的英雄角色作为源对象,另一个障碍物作为目标对象,

var offset:Object = getOffset(my_hero.mc, some_obstacle.mc);

offset.x得到结果偏移值后,比较和的大小(绝对值)offset.y。结果可概括如下:

让,absDx成为,_Math.abs(offset.x)absDyMath.abs(offset.y)

  • absDx < absDy
    • offset.y < 0,target上面source
    • offset.y > 0,target低于source
  • absDx > absDy
    • offset.x < 0,target在左边source
    • offset.x > 0,target在右边source
  • absDx == absDy
    • 参考上述情况之一,无所谓

然后你可以根据不同的情况更新你的英雄角色的位置。


关于为你的生物实现一个非常简单的 AI 算法的第二个问题,你可以利用上面的策略让你的生物验证它们是否与任何其他东西发生碰撞。如果它们确实发生碰撞,则为它们分配其他运动方向,或者更简单,只需翻转它们速度的符号 (+/-),它们就会以相反的方向移动。

首先实现简单的算法更容易。一旦它工作,您可以在之后应用您喜欢的任何增强功能。例如,到达路口或每 3 秒改变方向等。

于 2014-07-21T03:27:26.933 回答