ActionScript 3:包含数组中所有对象的字符命中测试对象

时间:2017-05-12 10:45:58

标签: arrays actionscript-3 flash collision-detection movieclip

首先感谢读这个问题的人的关注

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

我目前正在使用Flash ActionScript 3或Unity创建触摸屏Android游戏的学校项目,我目前的项目是使用Flash与ActionScript 3制作的。我目前的工作是一个类似Feeding Frenzy的游戏,涉及女性潜水潜水员将歼灭落在水下的鱼炸弹。

我试图让潜水员警告屏幕上的所有炸弹。我有一个BombsLayer类,它将调用RegularBomb类以落入随机x位置。所有RegularBomb实例都被放入一个Array中,然后我用hitTestObject进行每次循环,所以如果潜水员击中了movieclip里面的透明圆圈,会出现一个惊叹号,并将潜水员类中的readyToDefuse布尔值设置为true,当潜水员是远离炸弹,布尔值将设置为false,感叹号将消失。

我的问题是潜水员只能与阵列中的最后一个炸弹movieclip instace进行交互。当第一个炸弹子加入阵列并且潜水员到达时,会出现惊叹号,但每次新炸弹实例化时,惊叹号都会消失,我必须让潜水员移动到新炸弹实例化以制作标志出现。

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

我已经进行了谷歌搜索,似乎没有什么可以回答我的问题,我必须完成这个游戏一周,直到演示文稿,这让我感到困惑,这些过去的日子......

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

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;
                }
            }
        }
    }
}

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

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

1 个答案:

答案 0 :(得分:0)

逻辑错误。您需要浏览炸弹并找到与潜水员接触的炸弹(如果有的话),并使用唯一的炸弹。否则,潜水员已准备好拆除炸弹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;
}