ActionScript 3:字符命中测试 object,数组中的所有 object

ActionScript 3 : character hit test object with all objects in array

首先感谢阅读此问题的各位的关注

我是印度尼西亚人,如果我的英语不好,请见谅。

我目前正在学校项目中使用 Flash ActionScript 3 或 Unity 创建触摸屏 Android 游戏,我当前的项目是使用 Flash 和 ActionScript 3 制作的。我目前的工作是 Feeding Frenzy-like游戏涉及一名女潜水员,她将消灭落在水下的鱼炸弹。

我正在尝试让潜水员警告屏幕上的所有炸弹。我有一个 BombsLayer class,它将调用一个 RegularBomb Class 落在随机的 x 位置。所有 RegularBomb 实例都放在一个数组中,然后我使用 hitTestObject 进行每次循环,因此如果潜水员击中动画片段内的透明圆圈,将出现一个感叹号并将潜水员 class 中的 readyToDefuse 布尔值设置为 true,并且当潜水员远离炸弹时,布尔值将设置为假,感叹号将消失。

我的问题是潜水员只能与数组中最后一个炸弹动画片段实例进行交互。当第一个炸弹 child 添加到数组中并且潜水员到达它时,会出现感叹号,但每次实例化新炸弹时感叹号都会消失,我必须让潜水员移动到实例化的新炸弹使标志出现。

我已经阅读了关于这个问题的建议:AS3 - array hit test in 'for each' loop only works properly with last object in array删除 for each 循环中的 else 语句,但是删除它会使 readyToDefuse 保持为 True,感叹号仍然出现。

我已经进行了 google 搜索,但似乎没有任何东西可以解决我的问题,我必须在一周内完成这个游戏直到展示,这让我在过去的几天里感到困惑..

这是我的 Bombslayer 的完整代码 Class :

package  {
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;

    public class BombsLayer extends MovieClip{
        public var area:Sprite;
        public var bombs:Array;
        public var bomb:RegularBomb;
        public var bombground:BombGround;
        public var diver:Diver;
        public var warner:BombWarn;

        public function BombsLayer(character:Diver, warn:BombWarn){
            // constructor code
            area = new Sprite();
            area.graphics.beginFill(000000, 0);
            area.graphics.drawRect(0,0,2200,720);
            area.graphics.endFill();
            addChild(area);

            diver = character;
            warner = warn;

            bombs = new Array();
            var newBomb = new RegularBomb(Math.random()*area.width, diver, warner);
            bombs.push(newBomb)
            addChild(newBomb);

            bombground = new BombGround(0, 670, this);
            addChild(bombground);

            this.addEventListener(Event.ENTER_FRAME, moveBomb);
        }
        function moveBomb(event:Event){
            if(Math.random() <= 0.0005){
                var newBomb = new RegularBomb(Math.random()*area.width, diver, warner);
                bombs.push(newBomb)
                addChild(newBomb);
            }
            for each(var bomb:RegularBomb in bombs){
                bomb.moveDown();
                if(diver.hitTestObject(bomb)){
                    warner.visible = true;
                    diver.readyToDefuse = true;
                }
                else{
                    warner.visible = false;
                    diver.readyToDefuse = false;
                }
            }
        }
    }
}

如果需要我也可以上传完整的项目..

所有帮助将不胜感激。 谢谢!

逻辑错误。您需要浏览炸弹并找到与潜水员有联系的炸弹(如果有的话),并使用唯一的炸弹。否则潜水员已准备好拆除炸弹 A 但未准备拆除炸弹 B、C 和 D,因此根本没有准备好。

function moveBomb(event:Event)
{
    var aBomb:RegularBomb;

    if (Math.random() <= 0.0005)
    {
        aBomb = new RegularBomb(Math.random() * area.width, diver, warner);
        bombs.push(aBomb)
        addChild(aBomb);
    }

    for each(aBomb in bombs) aBomb.moveDown();

    // Find bomb in diver's vicinity.
    aBomb = findBomb();

    // The same as "if (aBomb != null)"
    if (aBomb)
    {
        warner.visible = true;
        diver.readyToDefuse = true;
    }
    else
    {
        warner.visible = false;
        diver.readyToDefuse = false;
    }
}

function findBomb():RegularBomb
{
    for each(var aBomb:RegularBomb in bombs)
        if (diver.hitTestObject(aBomb))
            return aBomb;

    return null;
}