Starling 游戏 太空大战4 游戏主体

这一部分也就是游戏的核心。空战开始,舞台上会出现由玩家控制的飞机,还有随机出现的外星怪物.
飞机跟随鼠标移动躲闪飞来的怪物。按住鼠标后就开始子弹。子弹碰到怪物就消灭掉它。如果不幸碰到
了怪物游戏就结束了,逻辑还是很简单的。

 

1:首先我们来问原来play.as类 中增加循环滚动的背景效果,其实与欢迎界面一样。看代码:

2:有了背景我们就要开始让主角登场了,Hero.as  英雄,呵呵其实就是一架战斗机

代码解释:
1:首先这个Hero 是运行在play 里面的,所以我们在创建的时候要通过一个play变量来映射它的母体
2:我们使用Image对象来从纹理集中抽取战斗机图片并添加到舞台,这里pivotX 和 pivotY 是pivotX : Starling中DisplayObject显示对象在自己的坐标系的起始x和y坐标
3:创建一个更新函数update的是Hero对象随时跟着鼠标移动 Starling.current.navtiveStage.mouseX 这个就Starling核心类,此代码表示现在激活的 Starling 实例舞台上的鼠标坐标,而我们整个项目的舞台就是game了

Hero类创建好后我们就要在play.as类中添加代码使其可以显示在舞台上

看30,31行和37行代码,创建实例并添加舞台,然后让其逐帧执行更新还是update,这样一来,我们进入游戏界面时就会出现一架跟随鼠标运动的战斗机了。

 

3:战斗机有了还不行,我们要给它配备强大的火力 ---- 子弹 Bullet.as

这个类很简单的,就是一个简单的图形显示功能。但是战斗机要打击怪兽时会不同的发射子弹,大量的子弹在舞台上出现如何控制呢
由此就产生了一个子弹管理类,因为子弹都是有共性的,既然有共性那我们就可以 统一来管理。

4:BulletManager.as  管理众多对象不是一件容易的事情,我们要创建一个对象池,把他们放到一起来统一管理。

package managers
{
    import com.leebrimelow.starling.StarlingPool;
    import core.Assets;
    import object.Bullet;
    import states.Play;
    
    public class BulletManager
    {
        private var play:Play;
        public var bullets:Array;
        private var pool:StarlingPool;
        public var count:int = 0;
        
        public function BulletManager(play:Play)
        {
            this.play = play;
            bullets = new Array();
            pool = new StarlingPool(Bullet,100);
            
        }
        
        //更新事件
        public function update():void
        {
          var b:Bullet;
          var len:int = bullets.length;
          for(var i:int=len-1;i>=0;i--){
            b = bullets[i];
            b.y -= 25;
            if(b.y <0)
                destroyBullet(b);
          }
          
          if(play.fire && count%10 == 0)
              fire();
              
              count++;
        }
        
        public function fire():void
        {
           var b:Bullet = pool.getSprite() as Bullet;
              play.addChild(b);
              b.x = play.hero.x - 10;
              b.y = play.hero.y - 15;
              bullets.push(b);
              
              b = pool.getSprite() as Bullet;
              play.addChild(b);
              b.x = play.hero.x + 10;
              b.y = play.hero.y - 15;
              bullets.push(b);
              
              Assets.shoot.play();
        }
        
        public function destroyBullet(b:Bullet):void
        {
          var len:int = bullets.length;
          for(var i:int=0;i<len;i++){
             if(bullets[i] == b)
             {
               bullets.splice(i,1);
               b.removeFromParent(true);
               pool.returnSprite(b);
             }
          }
        }
        
        public function destroy():void
        {
        
        }
    }
}

我们来看一下具体的功能:

 1:首先我们创建一个play变量,用来映射母体Play ,bullets数组保存以产生的子弹对象,pool 为子弹对象池,我们这里设定储备了100发。

 2:fire() 是开火函数,一旦按住鼠标则开始发炮,我们这里就同时产生两发炮弹同时齐发,呵呵还是个双响炮,并排向前,
      var b:Bullet = pool.getSprite() as Bullet;  这个就是从已有的对象池中抽出一个子弹对象,并添加到舞台上,同时保存到bullets数组中

  3:update()更新函数,  一旦发炮,子弹就会沿着预定轨迹运行了,而管理类的好处就是要同时管理所有的子弹,所以遍历循环所有子弹数组中的对象
      修改他们的Y坐标,一旦超出我们的视觉范围了if(b.y <0),子弹也就没有力气了,那就让它自毁吧 destroyBullet();

  4:destroyBullet 函数,参数就是一枚子弹对象,把它跟子弹数组中的所有对象做比较,如果发现存在,则通过splice把它从数组中清除掉,并通过     
       显示对象的removeFromParent()函数让其在父类舞台上自动消失,但不是真的就毁灭了,它还是回到了对象池中,pool.returnSprite(b)

  5:为了做到间接性开火效果,我们使用if(play.fire && count%10 == 0)判断调节,一是变量fire必须为true ,二是数字计时变量需是10的倍数

好了,子弹管理搞好了,那我们就来开始让让战斗机在舞台上实验开火吧
增加Play.as代码

 

ns = Starling.current.nativeStage 对当前舞台的索引

首先44行,增加了子弹管理对象,接着ns舞台 注册鼠标按下和抬起事件

在50和55行鼠标事件中,按下时fire变量为true,代表可以开火。 抬起时fire为false,表示挺火,计时变量归零

而在update 逐帧更新函数中也调用子弹管理类中的更新函数

 

5:飞机炮弹都有了,我们还要创建漫天废物的怪物,Alien.as

package object
{
    import core.Assets;
    import starling.display.MovieClip;
    import starling.textures.Texture;
    
    public class Alien extends MovieClip
    {
        public function Alien()
        {
            super(Assets.ta.getTextures("alien"),12);
            pivotX = width * 0.5;
            pivotY = height * 0.5;
        }
    }
}

接下来我们 同样要创建一个管理怪物的管理类AlienManager.as 类似与子弹的管理类,他是把所有怪物相关的属性方法都集中到一起

package managers
{
    import com.leebrimelow.starling.StarlingPool;
    import core.Assets;
    import object.Alien;
    import object.Bullet;
    import starling.core.Starling;
    import states.Play;
    
    public class AlienManager
    {
        private var play:Play;
        public var aliens:Array;
        private var pool:StarlingPool;
        public var count:int = 0;
        
        public function AlienManager(play:Play)
        {
            this.play = play;
            aliens = new Array();
            pool = new StarlingPool(Alien,20);
            
        }
        
        //更新事件
        public function update():void
        {
            if(Math.random() <0.05)
                spawn();
            
            var a:Alien;
            var len:int = aliens.length;
            for(var i:int=len-1;i>=0;i--){
                a = aliens[i];
                a.y += 8;
                if(a.y > 800)
                    destroyAlien(a);
            }
        }
        
        public function spawn():void
        {
            var a:Alien = pool.getSprite() as Alien;
                Starling.juggler.add(a);
                aliens.push(a);
                a.y = -50;
                a.x = Math.random() * 700 +50;
                play.addChild(a);
        
        }
        
        public function destroyAlien(a:Alien):void
        {
            var len:int = aliens.length;
            
            for(var i:int=0;i<len;i++){
                if(aliens[i] == a)
                {
                    aliens.splice(i,1);
                    Starling.juggler.remove(a);
                    a.removeFromParent(true);
                    pool.returnSprite(a);
                }
            }
        }
        
        public function destroy():void
        {
            
        }
    }
}

这里还是要用到自定义的对象池,创建一个aliens数组保存已创建的改完,和建立一个pool 怪物对象池  update()更新函数,随机量产怪物,并遍历整个
怪物数组中的所有怪物,Y坐标递增,如果超出舞台800像素则使用毁灭函数destroyAlien将其消失, spawn() 函数是生产怪物的,Y轴固定而X轴随机
生产一个就从对象池中删去调并加入的怪物数组中。

到此舞台上主要元素就都产生了,剩下的就是做碰撞测试咯。很多游戏都是要用到碰撞的。

 

 

posted @ 2013-12-26 14:28  无名盗闪  阅读(223)  评论(0)    收藏  举报