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轴随机
生产一个就从对象池中删去调并加入的怪物数组中。
到此舞台上主要元素就都产生了,剩下的就是做碰撞测试咯。很多游戏都是要用到碰撞的。

浙公网安备 33010602011771号