DFdou's Blog Life is short,Be yourself.

1707/090

AS3-子弹躲避游戏(上)

先来Demo:



游戏本身很简单,本尊是一个日本人做的叫《特训!99》,移动方块不要被球击中即可。
下边说下做法,首先我们需要一个配置参数的类,当然你可以写个XML读取,或者其他的~

package{
	public class Config{
		public static var STAGE_W:uint = 550;
		public static var STAGE_H:uint = 400;
		public static var ENEMY_SIZE:uint = 5;
		public static var ENEMY_MINSPEED:uint = 1;
		public static var ENEMY_MAXSPEED:uint = 3;
		public static var ENEMY_COLOR:uint = 0x000000;
		public static var ENEMY_TOTAL:uint = 120;
		public static var ROLE_SIZE:uint = 10;
		public static var ROLE_COLOR:uint = 0x0066cc;
		public static var ROLE_SPEED:uint = 5;
	}
}

里边的变量名就是代表的含义,就不说明了……
然后就是Enemy的类,也就是黑球,这个类要实现什么功能呢,首先肯定是绘制一个形状对吧,然后呢,就是让这些形状动起来,并且判断冲出屏幕和碰撞Role等情况。这个类差不多是长这个样子:

package {
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.display.Graphics;
	import flash.events.*;

	import ascb.util.NumberUtilities;//来自于as3 cook book 的第三方类
	import Config;//配置文件 里边存放了游戏的基本参数
	import Role;//游戏角色,也就是方块

	public class Enemy extends Sprite{

		private var _size:uint;//大小
		private var _color:uint;//颜色
		private var _spdX:Number;//x轴的速度
		private var _spdY:Number;//y轴的速度
		private var _directionX:int;//x轴移动方向
		private var _directionY:int;//y轴移动方向
		private var _minSpeed:int;//最小运动速度
		private var _maxSpeed:int;//最大运动速度
		private var _role:Role;

		public function Enemy():void {
			init();
			drawCircle();
			_directionX = randDirection();
			_directionY = randDirection();
			addEventListener(Event.ENTER_FRAME,run);
		}
		private function init():void{
			//trace(Config.STAGE_W);
			//trace(Config.STAGE_H);
			_minSpeed = Config.ENEMY_MINSPEED;
			_maxSpeed = Config.ENEMY_MAXSPEED;
			_spdX = NumberUtilities.random(_minSpeed,_maxSpeed);
			_spdY = NumberUtilities.random(_minSpeed,_maxSpeed);
			_size = Config.ENEMY_SIZE;
			_color = Config.ENEMY_COLOR;
			x = randDis()[0];
			y = randDis()[1];
		}
		//开始位置定了4个点
		private function randDis():Array{
			var aryTmp:Array = [[50,50],[Config.STAGE_W-50,50],[50,Config.STAGE_H-50],[Config.STAGE_W-50,Config.STAGE_H-50]];
			var rand = NumberUtilities.random(0,3);
			trace(aryTmp[rand]);
			return (aryTmp[rand]);
		}
		//x,y轴的移动方向随机值
		private function randDirection():int{
			var rand = NumberUtilities.random(0,1);
			if(rand){
				return 1;
			}else{
				return -1;
			}
			//trace(_direction);
		}
		//绘制圆
		private function drawCircle():void{
			//trace("drawCircle");
            var childCircle:Shape = new Shape();
            var halfSize:uint = Math.round(_size / 2);
            childCircle.graphics.beginFill(_color);
            childCircle.graphics.lineStyle(0,_color);
            childCircle.graphics.drawCircle(halfSize, halfSize, halfSize);
            childCircle.graphics.endFill();
            addChild(childCircle);
		}
		//enemy的位移控制
		public function run(_evt:Event):void {
			//trace("run");
			x += _spdX * (_directionX);
			y += _spdY * (_directionY);
			//trace(_spdX * _direction);
			//out of stage的时候改变移动方向
			if(x< =0 || x>=Config.STAGE_W || y< =0 || y>=Config.STAGE_H){
				_spdX = NumberUtilities.random(_minSpeed,_maxSpeed);
				_spdY = NumberUtilities.random(_minSpeed,_maxSpeed);
				_directionX = randDirection();
				_directionY = randDirection();
				//本来是打算冲出屏幕就删除的
				/*if (parent){
					//trace("out of stage");
					removeEventListener(Event.ENTER_FRAME,run);
					parent.removeChild(this);
				}*/
			}
			hitRole();
		}
		//判断是否和Role碰撞了
		private function hitRole(){
			if(hitTestObject(_role)){
				Game(root).setGameFlag(true);
			}
		}
		//设置Role
		public function setRole(roleObj:Role):void{
			_role = roleObj;
		}
		//game over时的清除操作
		public function enemyClear(){
			removeEventListener(Event.ENTER_FRAME,run);
		}
	}
}

然后是Role类,也就是游戏主体方块,这个类很简单,绘制一个Role就可以了:

package {
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.display.Graphics;
	import Config;

	public class Role extends Sprite {
		private var _size:uint;
		private var _color:uint;

		public function Role():void {
			init();
		}
		private function init():void {
			_size=Config.ROLE_SIZE;
			_color=Config.ROLE_COLOR;
			drawRole();
		}
		private function drawRole():void {
			var role:Shape = new Shape();
			role.graphics.beginFill(_color);
			role.graphics.lineStyle(0, _color);
			role.graphics.drawRect(0, 0, _size, _size);
			role.graphics.endFill();
			addChild(role);
		}
		public function roleClear(){
			if (parent){
				parent.removeChild(this);
			}
			//other code
		}
	}
}

最后是控制部分,请见这里《AS3-子弹躲避游戏(下)》

Some Related Posts

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

:zhuang :xizao :wuwu :wenhao :wc :touxiang :shuaya :shuajian :shengtian :paopao :no :meinv :maonv :loveu :leilei :kua :jrjr :dahan :chi :chaocai :byebye


CommentLuv Enabled

No trackbacks yet.