1

提前致谢...

我对在游戏中为敌人设置伤害等级的逻辑有点怀疑。以下是我的敌人班

package scripts.enemy
{
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.Stage;

    public class Enemy1 extends MovieClip
    {
        private var BG:MovieClip;
        private var speed:Number = 0.5;
        private var ease:Number = .005;
        private var rad:Number = 57.2957795;

        public function Enemy1(BG:MovieClip) : void
        {
            var RandomX:Array = new Array(-150,-200,-250,-300,-350,-400,-450,-500,-550,150,200,250,300,350,400,450,500,550);
            var RandomY:Array = new Array(-150,-200,-250,-300,-350,-400,150,200,250,300,350,400);
            var r:int = (Math.random() * 18);
            var s:int = (Math.random() * 12);

            x = RandomX[r];
            y = RandomY[s];

            this.BG = BG;

            addEventListener(Event.ENTER_FRAME, moveEnemy); //false, 0, true);.
        }
        private function moveEnemy(e:Event):void
        {
            var dx:Number = x - 10;
            var dy:Number = y - 10;

            this.x -= dx * ease;
            this.y -= dy * ease;

            this.rotation = (Math.atan2(dy,dx) * rad) + 180;

        }

    }

}

这是一些给我的主要课程带来麻烦的代码

// ......... Function for Checking the Collision between Bullet And Enemy...........
        private function checkCollision(mc:MovieClip):Boolean
        {
            var test:Point = mc.localToGlobal( new Point());
            for (var i = 0; i < enemies1.length; i++)
            {
                tempEnemy1 = enemies1[i];
                if (kill == true)
                {
                    if (tempEnemy1.hitTestPoint(test.x,test.y,true))
                    {
                        enemies1.splice(i, 1);
                        bg_mc.removeChild(tempEnemy1);
                        createDead(Dead1,deadArray1,tempEnemy1.x,tempEnemy1.y,tempEnemy1.rotation);
                        Score +=  10;
                        Scr_txt.text = String(Score);
                        bugsKill +=  1;
                        kill = false;
                        return true;
                    }
                }
            }
            if (Level >= 2)
            {
                for (var j = 0; j < enemies2.length; j++)
                {
                    tempEnemy2 = enemies2[j];
                    if (kill == true)
                    {
                        if (tempEnemy2.hitTestPoint(test.x,test.y,true))
                        {
                            bug2HitCount -= 1;
                            if (bug2HitCount == 0)
                            {
                                enemies2.splice(j, 1);
                                bg_mc.removeChild(tempEnemy2);
                                createDead(Dead2,deadArray2,tempEnemy2.x,tempEnemy2.y,tempEnemy2.rotation);
                                Score +=  20;
                                Scr_txt.text = String(Score);
                                bugsKill +=  1;
                                kill = false;
                                //bug2HitCount = bug2HitRate;
                                return true;
                            }
                            kill = false;
                            return true;
                        }

                    }
                }
            }

            return false;
        }

        private function removeElement(removeList:Array):void
        {
            for (var i = 0; i < removeList.length; i++)
            {
                bg_mc.removeChild(removeList[i]);
            }
        }
        //...........Function Checking the Collission Between Bunker And Enemy..............
        private function collideEnemy(deadArray:Array,enemyArray:Array,rate:Number):void
        {
            var enemy:MovieClip;
            for (var i = 0; i < enemyArray.length; i++)
            {
                enemy = enemyArray[i];
                if (enemy.hitTestObject(bunker_mc))
                {
                    life_mc.scaleX -=  rate;
                    if (life_mc.scaleX <= 0.05)
                    {
                        stage.removeEventListener(Event.ENTER_FRAME,updateCollission);
                        Timer1.stop();
                        Mouse.show();
                        stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUpFun);
                        stage.removeEventListener(Event.ENTER_FRAME,updateStage);
                        stage.removeEventListener(MouseEvent.MOUSE_DOWN,mouseDownFun);
                        (player.parent).removeChild(player);
                        (bunker_mc.parent).removeChild(bunker_mc);
                        (life_mc.parent).removeChild(life_mc);
                        (sniper_mc.parent).removeChild(sniper_mc);
                        removeElement(bullets);
                        EndFun();
                        gunFire = false;
                        gotoAndStop("end");
                        Level = 1;
                    }
                }
            }
        }
        //...........function of Timer Complete Event.....................
        private function TimerEnd(e:TimerEvent):void
        {
            EndBug();
            gotoAndStop("end");
        }
        //...........function of Timer Complete Event.....................
        private function EndBug():void
        {
            HelpTimer = new Timer(1000,1);
            HelpTimer.addEventListener(TimerEvent.TIMER_COMPLETE,HelpFun);
            HelpTimer.start();
            stage.removeEventListener(Event.ENTER_FRAME,updateStage);
            stage.removeEventListener(Event.ENTER_FRAME,updateCollission);
            function HelpFun(Event:TimerEvent)
            {
                stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUpFun);
                stage.removeEventListener(MouseEvent.MOUSE_DOWN,mouseDownFun);
                gunFire = false;
                bg_mc.removeChild(player);
                bg_mc.removeChild(bunker_mc);
                (life_mc.parent).removeChild(life_mc);
                bg_mc.removeChild(sniper_mc);
                EndFun();
                Score = 0;
                Level +=  1;
                totalBugs += 5;
            }
        }
        //..................Function for ending the Game And removing the Reamining Enemies.................
        private function EndFun():void
        {
            Mouse.show();
            removeElement(dustArray);
            if (Level == 1)
            {
                removeElement(enemies1);
                removeElement(deadArray1);
                gotoAndStop("level2");
            }
            if (Level == 2)
            {
                removeElement(enemies1);
                removeElement(deadArray1);
                removeElement(enemies2);
                removeElement(deadArray2);
                gotoAndStop("level3");
            }
            if (Level == 3)
            {
                ......
            }

            .....................
            .....................



        }
    }
}

在这段代码中,我在 2 级中添加了一种新型 Enemy,我还为其 HitTest 属性编写了代码。其中 2 级的每个敌人需要超过 1 颗子弹才能杀死。但是当我向一颗子弹射击时敌人,然后我向另一个相同类型的敌人发射另一颗子弹,另一个敌人被杀死。这意味着第二个敌人只被一颗子弹杀死了..那么我该如何解决这个问题..?

请帮助..提前谢谢..

4

1 回答 1

0

您的代码中的问题出在checkCollision函数中。它基本上遍历了第一个 for 循环并忽略了第二个。但最好是通过在 Enemy 类中添加一个生命值参数来分配敌人的生命值,并让每颗子弹将它们的生命值减少 1。这样,你可以通过你的阵列并移除任何生命值达到 0 的敌人。

编辑:我刚刚再次查看了您的代码,并意识到这是把bug2HitCount所有事情都搞砸了。

于 2013-03-13T11:21:30.790 回答