2007/090
AS3-子弹躲避游戏(下)
接上一篇《AS3-子弹躲避游戏(上)》。
有了Enemy和Role之后,自然就是游戏的主体控制部分了,这里是Game类:
这个类负责生成多少个Enemy,Role如何移动,游戏如何开始和如何结束,以及控制其他事务,比如记时类。
package{
import flash.display.Sprite;
import flash.events.*;
import flash.utils.Timer;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import fl.controls.Button;
import Config;
import Role;
import Enemy;
import TimeCount;
public class Game extends Sprite{
private var _role:Role;
private var _enemy:Sprite;
private var _time:TimeCount;
private var _enemyTotal:uint;
private var _gameFlag:Boolean;
private var startBtn:Button;
private var gameInfo:TextField;
//存储四个方向键是否按下的变量
private var leftArrow:Boolean=false;
private var rightArrow:Boolean=false;
private var upArrow:Boolean=false;
private var downArrow:Boolean=false;
public function Game():void{
startBtn = new Button();
startBtn.label = "StartGame";
startBtn.x=(Config.STAGE_W-startBtn.width)/2;
startBtn.y=(Config.STAGE_H-startBtn.height)/2;
addChild(startBtn);
startBtn.addEventListener(MouseEvent.MOUSE_DOWN,gameStart);
gameInfo = new TextField();
gameInfo.autoSize = TextFieldAutoSize.LEFT;
gameInfo.selectable = false;
gameInfo.text = "上下左右方向键控制方块移动,被黑球击中就挂了。";
gameInfo.x = (Config.STAGE_W-gameInfo.width)/2;
gameInfo.y = startBtn.y-30;
addChild(gameInfo);
}
private function gameStart(_evt:MouseEvent):void{
startBtn.removeEventListener(MouseEvent.MOUSE_DOWN,gameStart);
startBtn.visible = false;
gameInfo.visible = false;
init();
}
private function init():void{
initTime();
initRole();
initEnemy();
}
private function initTime():void{
_time = new TimeCount();
addChild(_time);
}
private function initRole():void{
_role = new Role();
addChild(_role);
_role.x=(Config.STAGE_W-_role.width)/2;
_role.y=(Config.STAGE_H-_role.height)/2;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);
_role.addEventListener(Event.ENTER_FRAME, roleMove);
stage.addEventListener(Event.DEACTIVATE, missingStage);//Flash处于非活动状态时调用
}
private function initEnemy():void{
_enemyTotal = Config.ENEMY_TOTAL;
var t:Timer=new Timer(2000,1);
t.addEventListener(TimerEvent.TIMER, timeToCreateEnemy);
t.start();
}
private function createEnemy():void{
var enemy=new Enemy();
enemy.setRole(_role);
_enemy.addChild(enemy);
}
private function getEnemyNum():uint{
return this.numChildren;
}
private function timeToCreateEnemy(_evt:TimerEvent):void{
_enemy = new Sprite();
addChild(_enemy);
for (var i:uint=0; i<_enemytotal ; i++) {
createEnemy();
}
addEventListener(Event.ENTER_FRAME,checkFlag);
}
//按键时的检测,左上右下分别是37,38,39,40
private function keyPressedDown(_evt:KeyboardEvent) {
if (_evt.keyCode==37) {
leftArrow=true;
} else if (_evt.keyCode == 39) {
rightArrow=true;
} else if (_evt.keyCode == 38) {
upArrow=true;
} else if (_evt.keyCode == 40) {
downArrow=true;
}
}
//松开按键时
private function keyPressedUp(_evt:KeyboardEvent) {
if (_evt.keyCode==37) {
leftArrow=false;
} else if (_evt.keyCode == 39) {
rightArrow=false;
} else if (_evt.keyCode == 38) {
upArrow=false;
} else if (_evt.keyCode == 40) {
downArrow=false;
}
}
private function roleMove(_evt:Event) {
//移动的速度
var speed:Number=Config.ROLE_SPEED;
if (leftArrow) {
//MC的位置检测,下边相同
if (0<=_role.x) {
_role.x-=speed;
}
}
if (rightArrow) {
if (_role.x<=Config.STAGE_W-_role.width) {
_role.x+=speed;
}
}
if (upArrow) {
if (0<=_role.y) {
_role.y-=speed;
}
}
if (downArrow) {
if (_role.y<=Config.STAGE_H-_role.height*2) {
_role.y+=speed;
}
}
}
//Flash处于非激活状态时
private function missingStage(_evt:Event) {
leftArrow=false;
rightArrow=false;
upArrow=false;
downArrow=false;
}
private function checkFlag(_evt:Event):void{
//trace(_gameFlag);
if(_gameFlag){
_gameFlag = false;
gameOver();
}
}
private function gameOver(){
removeEventListener(Event.ENTER_FRAME,checkFlag);
_time.stopTime();
gameInfo.text = "You Failed At " + _time.getTime() + " Second!";
var format:TextFormat = new TextFormat();
format.font = "Arial";
format.color = 0xFF0000;
format.size = 30;
gameInfo.setTextFormat(format);
gameInfo.x=(Config.STAGE_W-gameInfo.textWidth)/2;
gameInfo.y=(Config.STAGE_H-gameInfo.textHeight)/2;
gameInfo.visible = true;
startBtn.visible = true;
startBtn.y = gameInfo.y + 40;
startBtn.addEventListener(MouseEvent.MOUSE_DOWN,gameStart);
//_role.roleClear();
_role.removeEventListener(Event.ENTER_FRAME, roleMove);
removeChild(_role);
while(_enemy.numChildren>0){
Enemy(_enemy.getChildAt(0)).enemyClear();
_enemy.removeChildAt(0);
}
removeChild(_enemy);
}
public function setGameFlag(_value:Boolean):void{
_gameFlag = _value;
}
}
}
然后是一个不是很重要的类,记时类:
package{
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class TimeCount extends TextField{
private var _timeCount:uint;
private var t:Timer;
var format:TextFormat;
public function TimeCount():void{
init();
}
private function init(){
format = new TextFormat();
format.font = "Arial";
format.color = 0x666666;
format.size = 15;
format.bold = true;
_timeCount=0;
autoSize = TextFieldAutoSize.LEFT;
selectable = false;
t = new Timer(1000);
t.addEventListener(TimerEvent.TIMER,showTimeCount);
t.start();
}
private function showTimeCount(_evt:TimerEvent):void{
_timeCount++;
showTime(_timeCount);
}
private function showTime(timeCount:uint):void{
var _count = String(timeCount);
text = "Time: " + _count + " Second";
setTextFormat(format);
}
public function stopTime():void{
t.start();
t.removeEventListener(TimerEvent.TIMER,showTimeCount);
text = "";
}
public function getTime():uint{
return _timeCount;
}
}
}
当然了,你可以加入声音类,Enemy子类,Role子类,以及其他的OOXX的OOX之类的。
或者加入开始动画,结束动画,甚至是和《特训!99》一样加入一个巧妙度的计算类?