AS3游戏 - 如何从屏幕的左侧和右侧产生敌人?

时间:2011-11-10 22:18:04

标签: flash actionscript-3

我的角色在屏幕中间产生,我不知道如何让僵尸从屏幕的左侧和右侧产生,并向中间移动。我的目标是让僵尸自动生成,中间的角色能够射击它们。 我刚刚开始研究AS3,但我知道我需要制作一个数组才能做到这一点,但不知道如何实现它。 有人能告诉我吗?谢谢。 这是我的代码:

package 
{
    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.KeyboardEvent;
    import flash.events.Event;
    import flash.ui.Keyboard;
    public class ActualGame extends MovieClip
    {
        public var char:Character;
        public var zombie:Zombieclass;
        public var timer:Timer;
        private var speed:Number = 4;
        private var moveleft:Boolean = false;
        private var moveright:Boolean = false;
        private var i:Number =0;

        public function ActualGame()
        {
            char = new Character();
            stage.addChild(char);
            zombie = new Zombieclass(0,360);
            addChild(zombie);
            timer = new Timer(25);
            timer.addEventListener(TimerEvent.TIMER, zombie_spawn);
            stage.addEventListener(Event.ENTER_FRAME, enterframe);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyup);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
            timer.start();
        }

        public function zombie_spawn(timerEvent:TimerEvent):void
        {
            zombie.zombie_move_right();
            if (char.hitTestObject(zombie))
            {
                timer.stop();
                trace("hit");
            }
        }
        public function enterframe(event:Event)
        {
            if (moveleft)
            {
                char.x -=  speed;
                char.scaleX = -1;
            }
            else if (moveright)
            {
                char.x +=  speed;
                char.scaleX = 1;
            }
        }
        public function keydown(event:KeyboardEvent)
        {
            switch ( event.keyCode )
            {
                case Keyboard.LEFT :
                    moveleft = true;
                    break;
                case Keyboard.RIGHT :
                    moveright = true;
                    break;
            }
        }
        public function keyup(event:KeyboardEvent)
        {
            switch ( event.keyCode )
            {
                case Keyboard.LEFT :
                    moveleft = false;
                    break;
                case Keyboard.RIGHT :
                    moveright = false;
                    break;
            }
        }
    }
}

Zombieclass:

package 
{
    import flash.display.MovieClip;
    public class Zombieclass extends MovieClip
    {

        public function Zombieclass(xcoord:Number, ycoord:Number)
        {
            x = xcoord;
            y = ycoord;
        }
        public function zombie_move_right():void
        {
            x +=  1.5;

        }
        public function zombie_move_left():void
        {
            x -=  1.5;
        }
    }

}

3 个答案:

答案 0 :(得分:1)

我通常喜欢将问题分开。假设您有各种类型的僵尸,然后您将使用另一种方法来创建它们并使用此方法简单地将它们添加到左侧和右侧。是的,与他们的类型无关......

   private function addZombie( zombie:Zombie ):void
   {

          //Get a random number
          var random:Number = ( Math.random() * 100 ) % 2;

          //If the number is even , place the zombie on the right
          if( random == 0 )
          {
              //add the zombie outside the stage
              zombie.x == stage.stageWidth + 10;

              zombie.moveLeft();

          }else { //otherwise , place it on the left

               //add the zombie outside the stage
               zombie.x = -10;
               zombie.moveRight();
          }

          addChild( zombie );

   }

答案 1 :(得分:1)

我理解你的问题,我自己一直在那里。 通过尝试,复制其他代码并修改代码来学习编码,并最终完成目标时,您可能会错过一些需要在以后学习的必需品。

数组有点像纸叠。你可以把一张纸放进去,你可以把它拿出来,或者你可以把整个堆叠放在你的桌子上,然后一个一个地盖上所有的纸。这就是你想要对你的僵尸做什么。 (形象地说)。

您还需要学习循环的概念。使用循环,您可以使用非常少的代码行操作数组中的所有对象,即使您事先不知道数组中有多少项。

您需要执行以下操作:

  • 创建一个阵列以保持你的僵尸。
  • 用僵尸填充阵列。
  • 每帧都穿过你的僵尸,告诉他们移动。

像这样创建你的数组: public var zombies:Array = new Array();

添加一些僵尸:

var numberOfZombies:uint = 10;

for(var i:uint = 0; i<numberOfZombies; ++i) {
   var zombie:ZombieClass = new ZombieClass(0, (360/numberOfZombies)*i);
   addChild(zombie);

   zombies.push( zombie );
}

这将创建10个僵尸,将它们放在屏幕上,然后将它们添加到阵列中。

然后,在每一帧上,你可以遍历数组并移动僵尸:

for(var i:uint = 0; i<numberOfZombies; ++i) {
    var zombie:ZombieClass = zombies[i];

    zombie.zombie_move_right();
}

或者其他什么。 这段代码可能包含一些错误,因为它没有经过测试,我在iPad上写了它,但希望它会对你有所帮助。 学习使用数组和循环。

祝你好运。

答案 2 :(得分:0)

而不是:

public var zombie:Zombieclass;

你会有类似的东西:

public var zombies:Array;

public var zombies:Vector.<Zombieclass>;

而不是:

zombie = new Zombieclass(0,360); 
你会有类似的事情:

zombies = new Array(20); //20 Zombies
for(var x:Number = 0; x < zombies.length; x++) {
    zombies[x] = new ZombieClass(someVar:Number, 360);
}

然后,您可以使用计时器功能逐个将僵尸添加到舞台。在这一点上,我会把它留给你,不要带走所有的兴奋;)