Actionscript 3-舞台上的随机动作?还有,边界?

时间:2014-07-20 11:15:32

标签: actionscript-3 flash pathing

我试图编写一些东西,其中有生物来回奔跑,在舞台上上下运动,而我是玩家,必须尝试去找他们,然后捡起它们。舞台上还有界限

  1. 地图限制 - 一个大矩形框很容易实现。我已经做到了。
  2. 地图中的边界,也是矩形,但不是将玩家弹回到矩形内部,而是试图反过来 - 让玩家远离它。
  3. 我的代码现在看起来像这样:

    //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. 有机地移动&#34;或稍微随机移动一下,停下来。如果他们遇到边界,他们会在其他地方停下来移动。不关心在哪里,只要它们停止进入岩石和树木,就像那样。
    2. 在舞台上移动时,尽可能不重叠。
    3. 如果它们重叠,则互相推开,尽管我想让它们略微重叠。
    4. 我正在缓慢地构建代码,但我想我只是问是否有人对如何做到这一点有任何想法。

1 个答案:

答案 0 :(得分: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.yabsDx的幅度(绝对值)。结果可归纳如下:

Math.abs(offset.x)absDyMath.abs(offset.y)absDx < absDy

  • offset.y < 0
    • targetsource高于offset.y > 0
    • targetsource低于absDx > absDy
  • offset.x < 0
    • targetsource位于offset.x > 0
    • 的左侧
    • targetsource位于absDx == absDy
    • 的右侧
  • {{1}}
    • 参考上述案例之一,并不重要

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


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

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