今天开始做战斗,回合制战斗代码实现第一篇,从头开始,简单的2d回合制游戏

拖了这么久,终于弄到战斗系统了,不过仙剑demo的回合制战斗比较复杂,所以我们从最简单的2d回合制游戏战斗开始讨论,看看游戏战斗系统代码什么样子。

还记得回合制战斗的流程图吗,UI的时候我曾经贴过,,我们看下我们的战斗过程动画是什么样的,不要吐槽动画,我从神仙道用ps抠出来,没那么精细,反正不影响代码使用,我们直接看代码结构,这是bin目录也就是我们的生成目录(忘了说了,开发环境flashdevelop4.3,纯as3)lib路径下面fight.swc这个很重要(编译过程中需要里面的东西),因为fight.swc的底层写的很好,所以,我们的src代码相对简单,sampleBnt.as是我写的一个按钮类(比较简陋),main.as文档类(这是我们工程的代码入口类),fightmap.as战斗地图类,fightstarttip.as是我们的数据解析,战斗状态判断类,npc文件夹下面是控制动画和战斗逻辑部分,我们上代码,

package
{
	
	import BtnTip.SampleBnt;
	import com.FightTip.FightStartTip;
	
	import flash.display.Sprite;
	import flash.events.Event;
	/**
	 * ...
	 * @author swordfishx
	 */
	[SWF(width="1250",height="650",frameRate="24",backgroundColor="0")]
	
	public class Main extends Sprite
	{
		
		public function Main():void
		{
			if (stage)
				init();
			else
				addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			addChild(new FightStartTip());
		
		}
	
	}

}
文档类没有什么东西,这里我们把fightStartTip类addchlid到舞台中,

package com.FightTip
{
	
	import flash.display.Sprite;
	import com.ot.FightMap;
	import com.ot.BaseRemove;
	import com.npc.XMLLoader;
	import flash.events.MouseEvent;
	
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.net.URLLoader;
	import flash.geom.Point;
	import flash.system.System;
	
	
	/**
	 * ...
	 * @author swordfishx
	 */
	//[SWF(width="1250",height="650",frameRate="24",backgroundColor="0")]
	public class FightStartTip extends Sprite
	{
		
		private var _fight_mc:Sprite;
		
		//xml载入类
		private var loader:XMLLoader;
		private var _i:int = 0;
		
		public function FightStartTip()
		{
			System.useCodePage = true;
		
			//载入属性Xml
			
			loader = new XMLLoader();
			
			loader.onLoadComplete = initMap;
			
			loader.load("data/fight/fight.xml", XMLLoader.GB2312);
		
		}
		
		public function initMap(xml:XML):void
		{
		
			
			_fight_mc = new Sprite();
			
			addChild(_fight_mc);
			
			fightStart("fight002");
		}
		
		//战斗开始
		public function fightStart(mapValue:String = "", fun:Function = null):void
		{
			
			//通过名称显示相应地图
			var fightmap:FightMap = new FightMap("data/fight/" + mapValue + ".xml", fun, this);
			_fight_mc.addChild(fightmap);
		
		}
		
		//战斗结束
		public function fightEnd(fun:Function):void
		{
			overEnd();
			//BaseRemove.removeAllChildren(_fight_mc);
			//_fight_mc.visible = false;
			//fun();
			
		}
		public function overEnd():void {
		
			trace("到这里就先结束了。");
			
			try 
			{
				dispatchEvent(new Event("FightStartTipSTR"));
				trace("发送成功");
			} 
			catch (err:Error) 
			{
				trace("没有发送");
			}
			}
			
	
	}

}
上面的流程图很清楚,这里的数据应该填写的地方,我们看下fightstart方法,参数fight002,我们看下这个xml配置文件里面写了什么,
<?xml version="1.0" encoding="GB2312"?>
<data>
    <map>fight02.jpg</map>
    <our>
        <list>jianyu</list>
        <list>daji</list>
    </our>
    <enemy>
        <list>shibing</list>
        <list>shibing</list>
        <list>shibing</list>
    </enemy>
</data>
fight02.jpg是背景图,<our>是我方阵营,<enemy>是敌方,这个xml可以根据list的增减进行拓展(网络的话,只需要在解析部分修改一下,把赋值过程从xml解析改成网络监听方法解析的字符串就可以了),
package BtnTip
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.SimpleButton;
	import flash.text.TextField;
	import flash.text.TextFormat;
	
	/**
	 * ...
	 * @author swordfishx
	 */
	public class SampleBnt extends Sprite
	{
		
		public function SampleBnt(acol:uint = 0xffffff, bcol:uint = 0xffffff,ccol:uint = 0xffffff,Str:String = "btn", tfcol:uint = 0xffffff):void
		{
			var a:Sprite = new Sprite();
			huitu(a, acol, Str, tfcol)
			var b:Sprite = new Sprite();
			huitu(b, bcol, Str, tfcol);
			var c:Sprite = new Sprite();
			huitu(c, ccol, Str, tfcol);
			var abc:SimpleButton = new SimpleButton(a, b, c, c);
			addChild(abc);
		}
		
		public function huitu(obj:Sprite, col:uint = 0xffffff, str:String = "btn", tfcol:uint = 0xffffff):void
		{
			obj.graphics.beginFill(col);
			obj.graphics.drawRect(0, 0, 80, 30);
			obj.graphics.endFill();
			var lable:TextField = new TextField();
			lable.text = str;
			lable.width = 80;
			lable.height = 30;
			var tf:TextFormat = new TextFormat();
			tf.bold = true;
			tf.size = 24;
			tf.color = tfcol;
			lable.selectable = false;
			lable.setTextFormat(tf);
			obj.addChild(lable);
		}
	}

}
这是个简陋的画按钮方法,当然可以自己修改,把里面的huitu方法改成图片,或者在里面直接加一个就行了,
 
package com.npc {
	import com.ot.ImageCtrl;
	import com.ot.FightMap;
	
	import flash.events.Event;
	import flash.display.Sprite;
	import flash.display.Loader;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.net.URLRequest;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.text.*;
	
	public class CharacterMC  extends Sprite{
		
		//位图数据数组
		protected var _bitmapArr:Array;
		//加载图片用
		private var _loader:Loader;
		//读取图片用Bitmap
		private var _image:Bitmap;
		//头像Bitmap
		public var _imageFace:Bitmap;
		//用以显示的bitMap对象
        private var _peopleBitmap:Bitmap;
		//图片列数
		private var _row:int;
		//图片行数
		private var _col:int;
		//图片列数
		private var _rowatt:int;
		//图片行数
		private var _colatt:int;
		//图片显示控制
		public var _keys:Object;
		//目前显示图片列号
		private var _pointer:int = 0;
		//图片显示速度控制
		private var _count:Number = 0;
		//图片显示速度
		private var _speed:Number;
		//攻击图片地址
		private var _attImage:String;
		//行走图片地址
		private var _strImage:String;
		//HP显示
		public var _hp:TextField = new TextField();
		//HP值
		public var _hpValue:int = 100;
		//函数1
		public var _fun:Function;
		//函数2
		public var _fun2:Function;
		//战斗类Class
		private var _fightMap:FightMap;
		//HP伤害显示
		public var _hpHert:TextField = new TextField();
		//人物名称
		public var _nameTxt:String;
		//图片翻转buff的宽度
		private var picTurnwidth:int = 128;
	
	//Class参数依次为:战斗类Class,头像地址,行走图片地址,攻击图片地址,图片显示控制,行走图片行数,行走图片列数,攻击图片行数,攻击图片列数,显示速度
		public function CharacterMC(fightMap:FightMap = null,faceImage:String = "",strImage:String = "",attImage:String = "",keys:Object = null,row:int = 2,col:int = 4,rowatt:int = 1,colatt:int= 5,speed:Number = 0.15) {  
			_fightMap = fightMap;
			_keys = keys;
			_row = row;
			_col = col;
			_rowatt = rowatt;
			_colatt = colatt;
			_speed = speed;
			_strImage = strImage;
			_attImage = attImage;
             //头像图片加载对象;           
  			_loader = new Loader();  
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
			_loader.load(new URLRequest(faceImage));
		}
		//头像加载完成
		public function onComplete(event:Event):void {
			_imageFace = Bitmap(_loader.content);
			_imageFace.width = 120;
			_imageFace.height = 120;
			 //行走图片加载对象;           
  			_loader = new Loader();  
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteMov);
			_loader.load(new URLRequest(_strImage));
		}
		//HP伤害
		public function setHp(hert:int):void{
			_hpHert.htmlText = "<font color='#FF0000'>-" + hert + "</font>";
			_hpHert.height = 20;
			_hpHert.y = 0;
			//伤害图片显示
			var hertDir:int;
			if(int(_keys["playDirection"]) == 2){
				setDir(5);
			}else{
				setDir(7);
			}
			//HP伤害显示
			addEventListener(Event.ENTER_FRAME, hertFrame);
			//HP值计算与显示
			_hpValue -= hert;
			 _hp.htmlText = "<font color='#FF0000'>" + _hpValue + " / 100</font>";
			 //HP值为0时,显示撤退信息
			 if(_hpValue == 0){
				_fightMap._characterShow.show_txt.appendText( _nameTxt +  "撤退\n");
			}
		}
		//行走图片加载完成
		public function onCompleteMov(event:Event):void {
			_image = Bitmap(_loader.content);
			
			//将传入的位图数据拆分成小块,装入bitmapArr
			_bitmapArr=ImageCtrl.divide(_image,_row,_col);
			_peopleBitmap = new Bitmap();
             addChild(_peopleBitmap);  
			 //HP初始化
			 _hp.x = 0;
			 _hp.y = 48;
			 _hp.width = 48;
			 _hp.height = 20;
			 _hp.htmlText = "<font color='#FF0000'>" + _hpValue + " / 100</font>";
			 addChild(_hp);
			 addChild(_hpHert);
			_hpHert.y = -50;
			
			 //攻击图片加载对象;      
  			_loader = new Loader();  
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteAtt);
			_loader.load(new URLRequest(_attImage));
		}
		//图片水平翻转处理
		private function imageTurn(loaderBmp:Bitmap):Bitmap {
			var w:Number = loaderBmp.width / picTurnwidth;
			var imagebit:BitmapData  = new BitmapData(loaderBmp.width,loaderBmp.height,true, 0xffffffff);
			for(var i:int = 0; i < picTurnwidth; i++) {
				imagebit.copyPixels(loaderBmp.bitmapData,
					new Rectangle( i * w, 0,w, loaderBmp.height),
					new Point((picTurnwidth-1 - i) * w ,  0));
			}
			var __image:Bitmap = new Bitmap(imagebit);
			return __image;
		}
		//攻击图片加载完成,将图片按照 [0-3上下左右 4左攻击5左倒6右攻击7右倒]的顺序装入数组
		public function onCompleteAtt(event:Event):void {
			_image = Bitmap(_loader.content);
			//将传入的位图数据拆分成小块,装入bitmapArr
			var bitmapArr:Array=ImageCtrl.divide(_image,_rowatt,_colatt);
			var bitArr:Array;
			var i:int = 0;
			bitArr = new Array();
			for(i = 0;i<bitmapArr.length - 1;i++){
				bitArr.push(bitmapArr[i][0]);
			}
			_bitmapArr.push(bitArr);
			bitArr = new Array();
			bitArr.push(bitmapArr[bitmapArr.length - 1][0]);
			_bitmapArr.push(bitArr);
			//攻击图片翻转
			 _image = imageTurn(_image);
			bitmapArr=ImageCtrl.divide(_image,_rowatt,_colatt);
			bitArr = new Array();
			for(i = 0;i<bitmapArr.length - 1;i++){
				bitArr.push(bitmapArr[i][0]);
			}
			_bitmapArr.push(bitArr);
			bitArr = new Array();
			bitArr.push(bitmapArr[bitmapArr.length - 1][0]);
			_bitmapArr.push(bitArr);
			var dir:int = int(_keys["playDirection"]);
			_peopleBitmap.bitmapData = _bitmapArr[dir][0];
		}
		public function startFrame():void{
			//角色动作开始;
			addEventListener(Event.ENTER_FRAME, onFrame);
		}
		public function endFrame():void{
			//角色动作停止;
			removeEventListener(Event.ENTER_FRAME, onFrame);
		}
		//角色动作改变
		public function setDir(dir:int):void{
			_keys["playDirection"] = dir;
			_pointer = 0;
			_count = 0;
			startFrame();
		}
		//_keys["playDirection"] 0-3上下左右 4左攻击5左倒6右攻击7右倒
		public function onFrame(event:Event):void {
			var dir:int = int(_keys["playDirection"]);
				_peopleBitmap.bitmapData = _bitmapArr[dir][_pointer];
				_count += _speed;
				_pointer += int(_count) ;
				_count=_count%1;
				if(_pointer >= _bitmapArr[dir].length){
					endFrame();
					_pointer = 0;
					_count = 0;
					switch(dir){
						case 4:
							setDir(2);
							_fun();
							_fun = null;
							break;
						case 6:
							setDir(3);
							_fun();
							_fun = null;
							break;
						case 5:
							setDir(2);
							break;
						case 7:
							setDir(3);
							break;
						default:
							break;
							
					}
				}
		}
		//伤害显示
		public function hertFrame(event:Event):void {
			if(_hpHert.y > -50){
				_hpHert.y -= 2;
			}else{
				removeEventListener(Event.ENTER_FRAME, hertFrame);
				_hpHert.text = "";
				_fun2();
				_fun2 = null;
			}
		
		}
	
	}
	
}
图像处理类,我们bin文件夹里面的序列图片,在这个类里面被分割,生成动画(如果使用cocos2dx和u3d的话,可以直接做动画,当然flash也可以,当时做的时候就是一个评估,因为游戏最终流产,所以没有做更好的效果,这里见谅,只是给大家提供个思路),
package com.npc{
	import com.ot.Map001;
	import com.ot.ImageCtrl;
	
	import flash.net.URLLoader;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.events.KeyboardEvent;
	import flash.geom.Point;
    import flash.utils.Timer;
	import flash.events.TimerEvent;
	public class NpcClass extends Sprite { 
	
		//声明time函数
        private var _timer:Timer;
		//位图数据数组
		protected var _bitmapArr:Array;
		//播放的顺序 0为上 1为下 2为左 3为右
		private var _playDirection:int = 1;
		//当前帧显示的位图数据的索引
		private var _bitmapIndex:int=0;
		//图片列数
		private var _row:int;
		//图片行数
		private var _col:int;
		private var _pointer:int;
		//加载图片用
		private var _loader:Loader;
		//读取图片用
		private var _image:Bitmap;
		//用以显示的bitMap对象
        private var _peopleBitmap:Bitmap;
		//当前地图类
		private var _mapBack:Map001;
		//移动步数控制
		public var _moveCtrl:int = 0;
		//移动步长
		public var _moveLong:int = 12;
		private var _isKeyDown:Boolean = false;
		//NPC在地图中坐标
		private var _mapPoint:Point;
		//滚屏控制
		private var _mapIsRoll = false; 
		//NPC是否可移动
		private var _canMove:Boolean = false;
		//NPC是否已显示
		private var _isAdd = false;
		public var _npcName:String;
		//构造器 mapBack:当前地图 player:NPC图片 npcName:NPC名称 row:图片列数 col:图片行数
		public function NpcClass(mapBack:Map001,player:String,npcName:String,row:int,col:int,point:Point = null,timer:Timer=null,canMove:Boolean = false) { 
			//初始化
			_mapBack = mapBack;
			_npcName = npcName;
			_row = row;
			_col = col;
			_canMove = canMove;
			_mapPoint = point;
			_timer = timer;
            _timer.addEventListener(TimerEvent.TIMER, timerHandler);    
             //图片加载对象;           
  			_loader = new Loader();  
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
			_loader.load(new URLRequest(player));
		}
		public function onComplete(event:Event):void {
			_image = Bitmap(_loader.content);
			//将传入的位图数据拆分成小块,装入bitmapArr
			_bitmapArr=ImageCtrl.divide(_image,_row,_col);
			//trace("_bitmapArr = " + _bitmapArr);
			_peopleBitmap = new Bitmap(_bitmapArr[0][0]);  
			_mapBack._npcFrame.addChild(_peopleBitmap);  
			 //NPC坐标计算
			 _peopleBitmap.x = (_mapPoint.x - _mapBack._mPoint.x)*48;
			 _peopleBitmap.y = (_mapPoint.y - _mapBack._mPoint.y)*48;
			//NPC动作开始;
            _timer.start();
		}
		//获得NPC名称
		public function getName():String{
			return _npcName;
		}
		public function drowNpc():void{
			_peopleBitmap.bitmapData = _bitmapArr[_playDirection][_pointer];
             //显示新的NPC动作图像;  
			 
			 if(_moveCtrl > 0){
				 //NPC坐标计算
				switch (_playDirection) {
					case 0 :
						_peopleBitmap.y = _peopleBitmap.y - 12;
						break;
					case 1 :
						_peopleBitmap.y = _peopleBitmap.y  + 12;
						break;
					case 2 :
						_peopleBitmap.x = _peopleBitmap.x  - 12;
						break;
					case 3 :
						_peopleBitmap.x = _peopleBitmap.x  + 12;
						break;
				}
			}
			
            //NPC动作循环处理;  
             if (_pointer < _row - 1) {  
                _pointer ++;  
            } else {  
				_pointer = 0;  
            }  
		}
        //定时器运行事件;  
         private function timerHandler(event:Event):void {  
		 	drowNpc();
			//移动控制
            toMove();
        }  
		//移动
		private function toMove():void{
			if(!_canMove){
				return;
			}
			//移动达到一个坐标判断
			if(_moveCtrl >= 4 || _moveCtrl == 0){
				_moveCtrl =0;
				toCheckMove();
			}else{
				_moveCtrl += 1;
			}
		}
        //随机移动
        private function toCheckMove():void {
			var intRand:int = Math.floor(Math.random()*15);
			if(intRand < 4){
				_playDirection = intRand;
				
				switch (_playDirection) {
					case 0 :
						checkUp();
						break;
					case 1 :
						checkDown();
						break;
					case 2 :
						checkLeft();
						break;
					case 3 :
						checkRight();
						break;
				}
			}
        }
		//坐标随NPC移动
		private function npcChange(npcX:int,npcY:int):void{
			_mapBack._npcList.remove(_mapPoint.x + "," + _mapPoint.y);
			_mapBack._npcList.put((_mapPoint.x + npcX )+ "," + (_mapPoint.y + npcY),this);
		}
		//右移判断
		private function checkRight():void{
			if(checkMap(_mapPoint.x + 1,_mapPoint.y)){
				npcChange(1,0);
				_mapPoint.x += 1
				_moveCtrl += 1;
			}
		}
		//左移判断
		private function checkLeft():void{
			if(checkMap(_mapPoint.x - 1,_mapPoint.y)){
				npcChange(-1,0);
				_mapPoint.x -= 1;
				_moveCtrl += 1;
			}
		}
		//下移判断
		private function checkDown():void{
			if(checkMap(_mapPoint.x, _mapPoint.y + 1)){
				npcChange(0,1);
				_mapPoint.y += 1;
				_moveCtrl += 1;
			}
		}
		//上移判断
		private function checkUp():void{
			if(checkMap(_mapPoint.x,_mapPoint.y - 1)){
				npcChange(0,-1);
				_mapPoint.y -= 1;
				_moveCtrl += 1;
			}
		}
		//障碍判断
		private function checkMap(mapX:int,mapY:int):Boolean{
			var mapDate:Array = _mapBack.getMapDate();
			if(mapDate[ mapY][mapX] == 0){
				if(_mapBack._npcList.getValue(mapX + "," + mapY) == null && !_mapBack.isPlayer(mapX,mapY)){
					return true;
				}else{
					return false;
				}
			}else{
				return false;
			}
		}
		
	}
}
动画的控制,
package com.npc{
	import com.ot.Map001;
	import com.ot.ImageCtrl;
	import com.ot.BaseRemove;
	import com.mains.Sav;
	
	import flash.net.URLLoader;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.events.KeyboardEvent;
	import flash.geom.Point;
    import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.net.URLLoaderDataFormat;
	import flash.utils.ByteArray;
	
	public class PeopleClass extends Sprite { 
	
		//声明time函数
        private var _timer:Timer;
		//位图数据数组
		protected var _bitmapArr:Array;
		//播放的顺序 0为上 1为下 2为左 3为右
		private var _playDirection:int = 1;
		//当前帧显示的位图数据的索引
		private var _bitmapIndex:int=0;
		//图片列数
		private var _row:int;
		//图片行数
		private var _col:int;
		private var _pointer:int;
		//加载图片用
		private var _loader:Loader;
		//读取图片用
		private var _image:Bitmap;
		//用以显示的bitMap对象
        private var _peopleBitmap:Bitmap;
		//当前地图类
		private var _mapBack:Map001;
		//移动步数控制
		public var _moveCtrl:int = 0;
		//移动步长
		public var _moveLong:int = 12;
		private var _isKeyDown:Boolean = false;
		//人物在画面中坐标
		private var _point:Point;
		//人物在地图中坐标
		private var _mapPoint:Point;
		//滚屏控制
		private var _mapIsRoll:Boolean = false; 
		//显示对话类
		private var _my_talk:Talk;;
		//人物名称
		public var _peopleName:String;
		//载入图片宽
		private var loadpicwidth:int = 48;
		//载入图片高
		private var loadpicheight:int = 48;
		//载入图片高
		//构造器 mapBack:当前地图 player:人物图片 row:图片列数 col:图片行数
		public function PeopleClass(mapBack:Map001,player:String,peopleName:String,row:int,col:int,point:Point = null,timer:Timer=null) { 
			_mapBack = mapBack;
			_peopleName = peopleName;
			_my_talk = new Talk(_mapBack);
			_row = row;
			_col = col;
			if(point == null){
				_point = new Point(5,5);
				_mapPoint = new Point(5,5);
			}else{
				_point = new Point(point.x*48,point.y*48);
				_mapPoint = new Point(_mapBack._mPoint.x + point.x,_mapBack._mPoint.y + point.y);
			}
		    _timer = timer;
             //图片加载对象;           
  			_loader = new Loader();  
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
			
			_loader.load(new URLRequest(player));
			//用来添加侦听器,侦听键盘
			_mapBack.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);  
			_mapBack.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);  
		}
		public function onComplete(event:Event):void {
			_image = Bitmap(_loader.content);

			//将传入的位图数据拆分成小块,装入bitmapArr
			_bitmapArr=ImageCtrl.divide(_image,_row,_col);
             _peopleBitmap = new Bitmap(_bitmapArr[_playDirection][_pointer]);  
             _mapBack.addChild(_peopleBitmap);  
			//角色动作开始;
            _timer.addEventListener(TimerEvent.TIMER, timerHandler);    
            _timer.start();
		}
		public function getPoint():Point{
			return _mapPoint;
		}
        //键盘事件,通过方向键更改角色移动方向;
        private function keyDownHandler(event:KeyboardEvent):void {
			//人物移动不够一个坐标,则返回
			if(_moveCtrl > 0 || _mapBack._is_talked){
				return;
			}
			_isKeyDown = true;
            switch (event.keyCode) {
                case 40 :
                   _playDirection = 1;
                    break;
                case 38 :
                    _playDirection = 0;
                    break;
                case 37 :
                    _playDirection = 2;
                    break;
                case 39 :
                    _playDirection = 3;
                    break;
                case 32 :
                    checkStage();
					_isKeyDown = false;
                    break;
				default:
					_isKeyDown = false;
					break;
            }
        }
		//空格按下时,检测方向
		private function checkStage():void{
				switch (_playDirection) {
					case 0 :
						getTalk(_mapPoint.x,_mapPoint.y - 1);
						break;
					case 1 :
						getTalk(_mapPoint.x,_mapPoint.y + 1);
						break;
					case 2 :
						getTalk(_mapPoint.x - 1,_mapPoint.y);
						break;
					case 3 :
						getTalk(_mapPoint.x + 1,_mapPoint.y);
						break;
				}
		}
		//人物存在检测
		private function getTalk(talkX:int,talkY:int):void{
			var talkValue:Object = _mapBack._npcList.getValue(talkX + "," + talkY);
			//如果前方人物不为空,则根据人物id名称,获取事件xml
			if(talkValue != null){
				var npcXml:String = "data/talk/" + talkValue._npcName + ".xml"
				
				//根据文字类型获取xml内容
				var loader:XMLLoader = new XMLLoader();
				loader.onLoadComplete      = getXml;
				loader.load(npcXml, XMLLoader.GB2312);
			}
		}
		//获取事件
		private function getXml(xml:XML):void{
			var xmlarr:Array = new Array();
			for each ( var element:XML in xml.elements( ) ) {
				xmlarr.push(element);
			}
			setEvent(xmlarr);
		}
		/*
			*游戏脚本解析*
			每个游戏,或者有自己特定的脚本,或者用共同的脚本
			这里的xml处理或许可以称作一个简单的游戏脚本吧
			获取事件类型,进入事件 目前只有对话,战斗,设定变量和选择四种事件
			若要添加更多的事件解析,如行走,动作等,则在此添加,然后修改事件xml
		*/
		private function setEvent(xmlarr:Array):void{
			if(xmlarr.length == 0){
				return;
			}
			var index:int;
			var varlable_name:String;
			var varlable_value:int;
			var ele:XML = xmlarr[0];
			if(ele.name() == "talk"){
				//对话事件
				xmlarr.shift();
				getTalkXml(ele,xmlarr);
			}else if(ele.name() == "att"){
				//战斗事件
				xmlarr.shift();
				getAttXml(ele,xmlarr);
			}else if(ele.name() == "set"){
				//设定变量事件
				varlable_name = "save" + ele.@varlable_name;
				varlable_value = int(ele.@varlable_value);
				Sav.gamedata[varlable_name] = varlable_value;
				xmlarr.shift();
				setEvent(xmlarr);
			}else if(ele.name() == "if"){
				//条件事件
				index = 0;
				var eleif:XML;
				varlable_name = "save" + ele.@varlable_name;
				varlable_value = int(ele.@varlable_value);
				if(Sav.gamedata[varlable_name] == varlable_value){
					xmlarr.shift();
					for each ( eleif in ele["true"].elements( ) ) {
						xmlarr.splice(index++, 0,eleif);
					}
					setEvent(xmlarr);
				}else{
					xmlarr.shift();
					for each ( eleif in ele["false"].elements( ) ) {
						xmlarr.splice(index++, 0,eleif);
					}
					setEvent(xmlarr);
				}
			}
		}
		//战斗事件运行
		private function getAttXml(xml:XML,xmlarr:Array):void{
			var fun:Function = function(){
				setEvent(xmlarr);
			}
			_mapBack._gameMap.fightStart(xml.toString(),fun);
		}
		//对话事件运行
		private function getTalkXml(xml:XML,xmlarr:Array):void{
			//根据xml内容,得到地图图片数组
			var talkArray:Array = new Array();
			for each ( var elementTalk:XML in xml.elements( ) ) {
				var thisTalk = [elementTalk.@image,elementTalk.@name,"      "+elementTalk];
				talkArray.push(thisTalk);
			}
			if(("" + xml.@rand) == "false"){
				//顺序对话
				setTalk(talkArray);
				(talkArray[talkArray.length - 1])[3]=function (){
					_mapBack._is_talked=false;
					_my_talk.removeKeyDown();
					setEvent(xmlarr);
				};
				if (!_mapBack._is_talked) {
					_mapBack._is_talked=true;
					_my_talk.newTalk(talkArray[0]);
				}
			}else{
				//随即对话
				var _talk_npc_random=talkArray[int(Math.random()*talkArray.length)];
				_talk_npc_random[3]=function(){
					_mapBack._is_talked=false;
					_my_talk.removeKeyDown();
					setEvent(xmlarr);
				};
				if (!_mapBack._is_talked) {
					_mapBack._is_talked=true;
					_my_talk.newTalk(_talk_npc_random);
				}
			}
		}
		//对话显示处理
		private function setTalk(talkArray:Array):void{
			if(talkArray.length > 0){
				(talkArray[0])[3]=function (){
					_my_talk.newTalk(talkArray[1]);
				};
			}else{
				return;
			}
			if(talkArray.length > 1){
				(talkArray[1])[3]=function (){
					_my_talk.newTalk(talkArray[2]);
				};
			}else{
				return;
			}
			if(talkArray.length > 2){
				(talkArray[2])[3]=function (){
					_my_talk.newTalk(talkArray[3]);
				};
			}else{
				return;
			}
		}
        //键盘事件,
        private function keyUpHandler(event:KeyboardEvent):void {
			_isKeyDown = false;
        }
			
        //定时器运行事件;  
         private function timerHandler(event:Event):void {  
             //显示新的角色动作图像;  
			 _peopleBitmap.bitmapData = _bitmapArr[_playDirection][_pointer];
			 //角色坐标
			 _peopleBitmap.x = _point.x;
			 _peopleBitmap.y = _point.y;
			 
            //角色动作循环处理;  
             if (_pointer < _row - 1) {  
                _pointer ++;  
            } else {  
				_pointer = 0;  
            }  
			//移动控制
            toMove();
        }  
		private function keyUpCheck(){
			//人物移动达到一个坐标,则停止,否则继续移动
			if(_moveCtrl == 0){
				_mapIsRoll = false;
				return;
			}else{
				coordinateChange();
			}
		}
		private function keyDownCheck(){
			//人物移动达到一个坐标,则进行下一个坐标的判断,否则继续移动
			if(_moveCtrl == 0){
				switch (_playDirection) {
					case 0 :
						checkUp();
						break;
					case 1 :
						checkDown();
						break;
					case 2 :
						checkLeft();
						break;
					case 3 :
						checkRight();
						break;
				}
			}else{
				coordinateChange();
			}
		}
		//移动执行
		private function coordinateChange():void{
			//人物移动
			if(!_mapIsRoll){
				switch (_playDirection) {
					case 0 :
						_point.y -= _moveLong;
						break;
					case 1 :
						_point.y += _moveLong;
						break;
					case 2 :
						_point.x -= _moveLong;
						break;
					case 3 :
						_point.x += _moveLong;
						break;
				}
			}else{
				//滚屏移动
				switch (_playDirection) {
					case 0 :
						_mapBack._mapFrame.y += _moveLong;
						break;
					case 1 :
						_mapBack._mapFrame.y -= _moveLong;
						break;
					case 2 :
						_mapBack._mapFrame.x += _moveLong;
						break;
					case 3 :
						_mapBack._mapFrame.x -= _moveLong;
						break;
				}
			}
			_moveCtrl += 1;
		}
		//移动控制
		private function toMove():void{
			//移动达到一个坐标判断
			if(_moveCtrl >= 4){
				_moveCtrl =0;
				
				//如果滚屏移动,则重绘地图
				if(_mapIsRoll){
					switch (_playDirection) {
						case 0 :
							_mapBack._mPoint.y -= 1;
							break;
						case 1 :
							_mapBack._mPoint.y += 1;
							break;
						case 2 :
							_mapBack._mPoint.x -= 1;
							break;
						case 3 :
							_mapBack._mPoint.x += 1;
							break;
					}
					_mapBack.drowMap(_playDirection);
				}
				
					
				//检测跳转
				if(_mapBack._changeList.getValue(_mapPoint.x + "," + _mapPoint.y) != null){
					var changeList:Object =  _mapBack._changeList.getValue(_mapPoint.x + "," + _mapPoint.y);
					_mapBack._gameMap.setMapName(changeList[0]);
					_mapBack._gameMap.setPoint(changeList[1]);
					_mapBack.removeSelf();
					BaseRemove.removeAllChildren(this);
					_mapBack._gameMap.selectMap();
					return;
				}
			}
			
			if(!_isKeyDown){
				//键盘弹起状态处理
				keyUpCheck();
			}else{
				//键盘按下状态处理
				keyDownCheck();
			}
			
		}
		//右移判断
		private function checkRight():void{
			if(checkMap(_mapPoint.x + 1,_mapPoint.y)){
				//是否滚屏移动
				if(_point.x >= 240 && _mapBack._mPoint.x < _mapBack._maxX - 10){
					_mapBack._mapFrame.x -= _moveLong;
					_mapIsRoll = true;
				}else{;
					_mapIsRoll = false;
					_point.x += _moveLong;
				}
				_moveCtrl += 1;
				_mapPoint.x += 1
			}
		}
		//左移判断
		private function checkLeft():void{
			if(checkMap(_mapPoint.x - 1,_mapPoint.y)){
				//是否滚屏移动
				if(_point.x <= 192 && _mapBack._mPoint.x > 0){
					_mapBack._mapFrame.x += _moveLong;
					_mapIsRoll = true;
				}else{
					_mapIsRoll = false;
					_point.x -= _moveLong;
				}
				_mapPoint.x -= 1;
				_moveCtrl += 1;
			}
		}
		//下移判断
		private function checkDown():void{
			if(checkMap(_mapPoint.x, _mapPoint.y + 1)){
				//是否滚屏移动
				if(_point.y >= 240 && _mapBack._mPoint.y< _mapBack._maxY - 10){
					_mapBack._mapFrame.y -= _moveLong;
					_mapIsRoll = true;
				}else{
					_mapIsRoll = false;
					_point.y += _moveLong;
				}
				_mapPoint.y += 1;
				_moveCtrl += 1;
			}
		}
		//上移判断
		private function checkUp():void{
			if(checkMap(_mapPoint.x,_mapPoint.y - 1)){
				//是否滚屏移动
				if(_point.y <= 192 && _mapBack._mPoint.y > 0){
					_mapBack._mapFrame.y += _moveLong;
					_mapIsRoll = true;
				}else{
					_mapIsRoll = false;
					_point.y -= _moveLong;
				}
				
				_mapPoint.y -= 1;
				_moveCtrl += 1;
			}
		}
		//障碍判断
		private function checkMap(mapX:int,mapY:int):Boolean{
			var mapDate:Array = _mapBack.getMapDate();
			if(mapDate[mapY][mapX] == 0){
				if(_mapBack._npcList.getValue(mapX + "," + mapY) == null){
					return true;
				}else{
					return false;
				}
			}else{
				return false;
			}
		}
		
	}
}
上面这个类是一个功能拓展,后来我写了一个独立的flash剧情对话系统,所以上面的这段废弃了,但那是后话,所以占时保留在代码里了,
package com.ot
{
	import BtnTip.SampleBnt;
	import com.FightTip.FightStartTip;
	import com.npc.PeopleClass;
	import com.npc.NpcClass;
	import com.npc.CharacterMC;
	import com.npc.XMLLoader;
	
	import flash.net.URLLoader;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.geom.Point;
	import flash.events.MouseEvent;
	import flash.utils.Timer;
	import flash.events.KeyboardEvent;
	
	public class FightMap extends Sprite
	{
		private const BTN_ATTACK:String = "攻击";
		private const BTN_DETECT:String = "侦查";
		private const BTN_DEFENSE:String = "防御";
		private const BTN_RETREAT:String = "撤退";
		private const SELECT:String = "SELECT"; //战斗状态:选择
		private const FIGHT:String = "FIGHT"; //战斗状态:战斗开始
		private const FIGHTVIEW:String = "FIGHTVIEW"; //战斗状态:侦查
		private const MOVE_ADVANCE:String = "MOVE_ADVANCE"; //前进
		private const MOVE_RETREAT:String = "MOVE_RETREAT"; //后退
		private const GAMEOVER:String = "GAMEOVER"; //战斗状态:结束
		//声明time函数
		private var _timer:Timer;
		//声明载入图片类
		private var _loader:Loader = new Loader();
		//声明Bitmap
		private var _image:Bitmap;
		private var __image:Bitmap;
		//装载地图小位图用
		private var _mapList:Array = new Array();
		private var _mapXmlSrc:String;
		//地图图片数组
		private var _map:Array = new Array();
		//地形数组
		private var _mapDate:Array = new Array();
		//人物
		private var _player:PeopleClass;
		//滚屏用变量
		private var _mapStartX:int = 0;
		private var _mapEndX:int = 0;
		private var _mapStartY:int = 0;
		private var _mapEndY:int = 0;
		//地图显示的起始坐标
		public var _mPoint:Point;
		//地图最大坐标
		public var _maxX:int;
		public var _maxY:int;
		//人物主角图片
		private var _propleImage:String;
		//人物初始坐标
		public var _peoplePoint:Point;
		//地图画板
		public var _mapFrame:Sprite = new Sprite();
		public var _mapFloor:Sprite = new Sprite();
		//地图画板
		public var _npcFrame:Sprite = new Sprite();
		public var _npcPoint:Point = new Point(0, 0);
		//地图跳转信息
		public var _changeList:HashMap = new HashMap();
		//主地图
		public var _gameMap:FightStartTip;
		//装载NPC数组
		public var _npcList:HashMap = new HashMap();
		//人物名称
		private var _peopleName:String;
		//是否对话中
		public var _is_talked:Boolean = false;
		
		//我方人物数组
		private var _listOur:Array = new Array();
		//敌方人物数组
		private var _listEnemy:Array = new Array();
		//当前数组(敌方或我方)
		public var _ctrlArr:Array;
		//当前人物序号
		public var _ctrlIndex:int;
		//选项显示用和信息显示用MC
		public var _characterShow:CharacterShow;
		//当前选择选项
		private var _btnCtrl:String;
		//战斗状态
		private var _fightShow:String;
		//移动状态
		private var _moveCtrl:String;
		//符号显示用Bitmap
		private var _sign:Bitmap = new Bitmap();
		//符号图片储存数组
		private var _signArr:Array;
		//人物属性储存用Xml
		private var _peopleXml:XML;
		//xml载入类
		private var loader:XMLLoader;
		//符号显示用序号
		private var _signIndex:int = 0;
		//人物属性用MC
		private var _view:VIEW = new VIEW();
		//人物属性显示时,头像图片装载用Bitmap
		private var _view_face:Bitmap = new Bitmap();
		//战斗时我方人物数组
		private var _pkOurArr:Array;
		//战斗时敌方人物数组
		private var _pkEnemyArr:Array;
		//信息显示时,头像图片装载用Bitmap
		private var _face:Bitmap = new Bitmap();
		private var _fun:Function;
		//人物的垂直间距
		private var mandect:int = 115;
		//战斗准备时移动的距离
		private var manspeed:int = 20;
		//坐标修正
		private var charaoffx:int = 120;
		//我方初始坐标x
		private var wfksoffx:int = 20;
		//敌人初始坐标
		private var drcsoffx:int = 450+300;
		//我方攻击移动
		private var wfgjoffx:int = 178;
		//敌方攻击移动
		private var dfgjoffx:int = 376+300;
		//----------------------控制菜单
		//攻击菜单选项
		private var Attmenu:SampleBnt;
		
		//防御菜单选项
		private var Defmenu:SampleBnt;
		
		//逃跑菜单选项
		private var runmenu:SampleBnt;
		//魔法菜单选项
		private var mgcmenu:SampleBnt;
		//调查菜单选项
		private var chekmenu:SampleBnt;
		
		//道具菜单选项
		private var propmenu:SampleBnt;
		//未选中时的颜色
		private var unselectcol:uint = 0xff00ff;
		//选中时的颜色
		private var selectcol:uint = 0xffff00;
		//区域颜色
		private const coluse:uint = 0x0000ff;
		//我方人物坐标调节
	//	private var fightherox:int;
		private var fightheroy:int = 300;
		public function FightMap(mapXmlSrc:String, fun:Function, gameMap:FightStartTip)
		{
			
			//添加地图画板
			addChild(_mapFrame);
			_mapFrame.addChild(_mapFloor);
			//添加NPC画板
			_mapFrame.addChild(_npcFrame);
			_view.face.addChild(_view_face);
			_gameMap = gameMap;
			_fun = fun;
			//获取地图xml文件
			_mapXmlSrc = mapXmlSrc;
			//选项显示用和信息显示用MC初始化
			_characterShow = new CharacterShow();
			_characterShow.ctrl.visible = false;
			//_characterShow.x = 120;
			//_characterShow.y = 480;
			Fightmenu();
			//this.addChild(_characterShow);
			//鼠标点击时候,光标设定
			//addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			//载入人物属性Xml
			loader = new XMLLoader();
			loader.onLoadComplete = initPeople;
			loader.load("data/people.xml", XMLLoader.GB2312);
		
		}
		
		public function Fightmenu():void
		{
			
			Attmenu = new SampleBnt(unselectcol, selectcol, coluse, " 攻  击 ", 0x000000);
			Attmenu.x = 100;
			Attmenu.y = 130;
			Defmenu = new SampleBnt(unselectcol, selectcol, coluse, " 防  御 ", 0x000000);
			Defmenu.x = 100;
			Defmenu.y = 160;
			runmenu = new SampleBnt(unselectcol, selectcol, coluse, " 逃  跑 ", 0x000000);
			runmenu.x = 100;
			runmenu.y = 190;
			propmenu = new SampleBnt(unselectcol, selectcol, coluse, " 道  具 ", 0x000000);
			propmenu.x = 100;
			propmenu.y = 220;
			chekmenu = new SampleBnt(unselectcol, selectcol, coluse, " 侦  察 ", 0x000000);
			chekmenu.x = 100;
			chekmenu.y = 250;
			addChild(Attmenu);
			addChild(Defmenu);
			addChild(runmenu);
			addChild(propmenu);
			addChild(chekmenu);
			Attmenu.addEventListener(MouseEvent.CLICK, Attmouse);
			Defmenu.addEventListener(MouseEvent.CLICK, Defmouse);
			chekmenu.addEventListener(MouseEvent.CLICK,Chekmouse);
		}
		
		//按钮隐藏方法
		public function btnvlfalse():void
		{
			Attmenu.visible = false;
			Defmenu.visible = false;
			runmenu.visible = false;
			propmenu.visible = false;
			chekmenu.visible = false;
		
		}
		
		//按钮出现的方法
		public function btnvltrue():void
		{
			Attmenu.visible = true;
			Defmenu.visible = true;
			runmenu.visible = true;
			propmenu.visible = true;
			chekmenu.visible = true;
		
		}
		
		public function mouseDownHandler(evet:MouseEvent):void
		{
			//设定光标
			stage.focus = _characterShow.ctrl;
		}
		
		public function initPeople(peopleXml:XML):void
		{
			_peopleXml = peopleXml;
			//载入战场用xml
			loader = new XMLLoader();
			loader.onLoadComplete = initStage;
			loader.load(_mapXmlSrc, XMLLoader.GB2312);
		}
		
		//得到战场xml信息
		public function initStage(mapXml:XML):void
		{
			
			var obj:Object;
			var chara:CharacterMC;
			var keys:Object;
			var indexY:int = 10;
			//获得我方人物
			for each (var elementOur:XML in mapXml.our.elements())
			{
				obj = new Object();
				obj["id"] = _peopleXml[elementOur.toString()].id;
				obj["name"] = _peopleXml[elementOur.toString()].name;
				obj["face"] = _peopleXml[elementOur.toString()].face;
				obj["moveimage"] = _peopleXml[elementOur.toString()].moveimage;
				obj["attimage"] = _peopleXml[elementOur.toString()].attimage;
				obj["att"] = _peopleXml[elementOur.toString()].att;
				obj["def"] = _peopleXml[elementOur.toString()].def;
				obj["speed"] = _peopleXml[elementOur.toString()].speed;
				obj["comment"] = _peopleXml[elementOur.toString()].comment;
				//xml压入数据
				_listOur.push(obj);
				
			}
			indexY = 10;
			//获得敌方人物
			for each (var elementEnemy:XML in mapXml.enemy.elements())
			{
				obj = new Object();
				obj["id"] = _peopleXml[elementEnemy.toString()].id;
				obj["name"] = _peopleXml[elementEnemy.toString()].name;
				obj["face"] = _peopleXml[elementEnemy.toString()].face;
				obj["moveimage"] = _peopleXml[elementEnemy.toString()].moveimage;
				obj["attimage"] = _peopleXml[elementEnemy.toString()].attimage;
				obj["att"] = _peopleXml[elementEnemy.toString()].att;
				obj["def"] = _peopleXml[elementEnemy.toString()].def;
				obj["speed"] = _peopleXml[elementEnemy.toString()].speed;
				obj["comment"] = _peopleXml[elementEnemy.toString()].comment;
				_listEnemy.push(obj);
			}
			//加载地图
			_loader = new Loader();
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
			_loader.load(new URLRequest("images/map/" + mapXml.map));
		}
		
		public function onComplete(event:Event):void
		{
			_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
			_image = Bitmap(_loader.content);
			_mapFloor.addChild(_image);
			
			//加载箭头图标
			_loader = new Loader();
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteSign);
			_loader.load(new URLRequest("images/system/sign.gif"));
		}
		
		public function onCompleteSign(event:Event):void
		{
			_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteSign);
			_image = Bitmap(_loader.content);
			_signArr = ImageCtrl.divide(_image, 2, 1);
			_mapFrame.addChild(_sign);
			//战场人物初始化
			var obj:Object;
			var chara:CharacterMC;
			var keys:Object;
			var i:int = 0;
			//初始化我方人物
			for (i = 0; i < _listOur.length; i++)
			{
				obj = _listOur[i];
				keys = new Object();
				keys["playDirection"] = 3;
				chara = new CharacterMC(this, obj["face"], obj["moveimage"], obj["attimage"], keys);
				chara.x = wfksoffx + charaoffx;
				chara.y = i * mandect + fightheroy;
				chara._nameTxt = obj["name"];
				obj["chara"] = chara;
				obj["move"] = 0;
				_npcFrame.addChild(chara);
			}
			//初始化敌方人物
			for (i = 0; i < _listEnemy.length; i++)
			{
				obj = _listEnemy[i];
				keys = new Object();
				keys["playDirection"] = 2;
				chara = new CharacterMC(this, obj["face"], obj["moveimage"], obj["attimage"], keys);
				chara.x = drcsoffx + charaoffx;
				chara.y = i * mandect + fightheroy;
				chara._nameTxt = obj["name"];
				obj["chara"] = chara;
				obj["move"] = 0;
				_npcFrame.addChild(chara);
			}
			_ctrlIndex = 0;
			_ctrlArr = _listOur;
			//开始检测我方图片是否全部加载完成
			this.addEventListener(Event.ENTER_FRAME, faceFrameOur);
		}
		
		//战斗结束测试
		public function memberCheck():int
		{
			var hp:int = 0;
			var i:int;
			var obj:Object;
			for (i = 0; i < _listOur.length; i++)
			{
				obj = _listOur[i];
				hp += obj["chara"]._hpValue;
				if (obj["chara"]._hpValue == 0)
				{
					_listOur.splice(i, 1);
					i--;
				}
			}
			//我方全灭测试
			if (hp == 0)
			{
				return 1;
			}
			hp = 0;
			for (i = 0; i < _listEnemy.length; i++)
			{
				obj = _listEnemy[i];
				hp += obj["chara"]._hpValue;
				if (obj["chara"]._hpValue == 0)
				{
					_listEnemy.splice(i, 1);
					i--;
				}
			}
			//敌方全灭测试
			if (hp == 0)
			{
				return 2;
			}
			return 0;
		}
		
		//检测我方图片是否全部加载完成
		private function faceFrameOur(e:Event):void
		{
			var obj:Object = _ctrlArr[_ctrlIndex];
			if (obj["chara"]._imageFace != null)
			{
				_ctrlIndex++;
				if (_ctrlIndex >= _ctrlArr.length)
				{
					this.removeEventListener(Event.ENTER_FRAME, faceFrameOur);
					_ctrlIndex = 0;
					_ctrlArr = _listEnemy;
					//检测敌方图片是否加载完成
					this.addEventListener(Event.ENTER_FRAME, faceFrameEnemy);
				}
			}
			;
		
		}
		
		//检测敌方图片是否全部加载完成
		private function faceFrameEnemy(e:Event):void
		{
			var obj:Object = _ctrlArr[_ctrlIndex];
			if (obj["chara"]._imageFace != null)
			{
				_ctrlIndex++;
				if (_ctrlIndex >= _ctrlArr.length)
				{
					this.removeEventListener(Event.ENTER_FRAME, faceFrameEnemy);
					_ctrlArr = _listOur;
					_ctrlIndex = 0;
					this.addEventListener(Event.ENTER_FRAME, renderHandler);
					//用来添加侦听器,侦听键盘
					_characterShow.ctrl.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
					stage.focus = _characterShow.ctrl;
					//开始选择战斗选项
					_fightShow = SELECT;
					_moveCtrl = MOVE_ADVANCE;
					_mapFrame.addEventListener(Event.ENTER_FRAME, moveFrame);
				}
			}
			;
		
		}
		
		//战斗开始
		private function toPK():void
		{
			//获取战斗结果
			var intCheck:int = memberCheck();
			if (intCheck == 1)
			{
				_face.bitmapData = _listOur[0]["chara"]._imageFace.bitmapData;
				_characterShow.show_txt.appendText("战斗失败了\n");
				_ctrlIndex = 0;
				_fightShow = GAMEOVER;
				this.addEventListener(Event.ENTER_FRAME, keyDownOver);
				return;
			}
			else if (intCheck == 2)
			{
				_face.bitmapData = _listOur[0]["chara"]._imageFace.bitmapData;
				_characterShow.show_txt.appendText("战斗胜利了\n");
				_ctrlIndex = 0;
				_fightShow = GAMEOVER;
				this.addEventListener(Event.ENTER_FRAME, keyDownOver);
				return;
			}
			//战斗本回合结束测试
			if (_pkOurArr.length + _pkEnemyArr.length == 0)
			{
				btnvltrue();
				_ctrlArr = _listOur;
				_ctrlIndex = 0;
				//回合结束,进入选择战斗菜单选项
				_fightShow = SELECT;
				_moveCtrl = MOVE_ADVANCE;
				_mapFrame.addEventListener(Event.ENTER_FRAME, moveFrame);
				
				return;
			}
			//找出未行动的人中速度最快的人,速度采用随机浮动
			var obj:Object;
			_ctrlIndex = 0;
			if (_pkOurArr.length > 0)
			{
				_ctrlArr = _pkOurArr;
			}
			else
			{
				_ctrlArr = _pkEnemyArr;
			}
			var i:int;
			for (i = 0; i < _pkOurArr.length; i++)
			{
				obj = _pkOurArr[i];
				if (obj["chara"]._hpValue > 0 && int(_ctrlArr[_ctrlIndex]["speed"]) < (int(obj["speed"]) + 5 - Math.random() * 10))
				{
					_ctrlArr = _pkOurArr;
					_ctrlIndex = i;
				}
			}
			for (i = 0; i < _pkEnemyArr.length; i++)
			{
				obj = _pkEnemyArr[i];
				if (obj["chara"]._hpValue > 0 && int(_ctrlArr[_ctrlIndex]["speed"]) < int(obj["speed"]) + 5 - Math.random() * 10)
				{
					_ctrlArr = _pkEnemyArr;
					_ctrlIndex = i;
				}
			}
			_moveCtrl = MOVE_ADVANCE;
			//按钮隐藏方法
			btnvlfalse();
			
			_mapFrame.addEventListener(Event.ENTER_FRAME, moveFrame);
		}
		
		//人物移动
		private function moveFrame(e:Event):void
		{
			var obj:Object;
			var i:int;
			//战斗状态判断
			if (_fightShow == SELECT)
			{
				//战斗菜单状态
				obj = _ctrlArr[_ctrlIndex];
				if (_moveCtrl == MOVE_ADVANCE)
				{
					//前移
					if (obj["chara"].x == wfksoffx + charaoffx)
					{
						obj["chara"].startFrame();
					}
					if (obj["chara"].x < wfgjoffx + charaoffx)
					{
						obj["chara"].x += manspeed;
					}
					else
					{
						obj["chara"].x = wfgjoffx + charaoffx;
						_mapFrame.removeEventListener(Event.ENTER_FRAME, moveFrame);
						setCtrlBtn();
					}
				}
				else if (_moveCtrl == MOVE_RETREAT)
				{
					//后移
					if (obj["chara"].x == wfgjoffx + charaoffx)
					{
						obj["chara"].startFrame();
					}
					if (obj["chara"].x > wfksoffx + charaoffx)
					{
						obj["chara"].x -= manspeed;
					}
					else
					{
						obj["chara"].x = wfksoffx + charaoffx;
						_ctrlIndex++;
						if (_ctrlIndex >= _ctrlArr.length)
						{
							_fightShow = FIGHT;
							_mapFrame.removeEventListener(Event.ENTER_FRAME, moveFrame);
							_pkOurArr = new Array();
							_pkEnemyArr = new Array();
							
							for (i = 0; i < _listOur.length; i++)
							{
								_pkOurArr.push(_listOur[i]);
							}
							for (i = 0; i < _listEnemy.length; i++)
							{
								_pkEnemyArr.push(_listEnemy[i]);
							}
							toPK();
						}
						else
						{
							_moveCtrl = MOVE_ADVANCE;
						}
					}
				}
			}
			else if (_fightShow == FIGHT)
			{
				//战斗状态
				obj = _ctrlArr[_ctrlIndex];
				if (_moveCtrl == MOVE_ADVANCE)
				{
					if (obj["chara"]._hpValue == 0)
					{
						_ctrlArr.splice(_ctrlIndex, 1);
						_mapFrame.removeEventListener(Event.ENTER_FRAME, moveFrame);
						toPK();
						return;
					}
					//前移
					if (_ctrlArr == _pkOurArr)
					{
						if (obj["chara"].x == wfksoffx + charaoffx)
						{
							obj["chara"].startFrame();
						}
						if (obj["chara"].x < wfgjoffx + charaoffx)
						{
							obj["chara"].x += manspeed;
						}
						else
						{
							obj["chara"].x = wfgjoffx + charaoffx;
							setAtt();
						}
					}
					else
					{
						if (obj["chara"].x == drcsoffx + charaoffx)
						{
							obj["chara"].startFrame();
						}
						if (obj["chara"].x > dfgjoffx + charaoffx)
						{
							obj["chara"].x -= manspeed;
						}
						else
						{
							obj["chara"].x = dfgjoffx + charaoffx;
							setAtt();
						}
					}
				}
				else if (_moveCtrl == MOVE_RETREAT)
				{
					//后移
					if (_ctrlArr == _pkOurArr)
					{
						if (obj["chara"].x == wfgjoffx + charaoffx)
						{
							obj["chara"].startFrame();
						}
						if (obj["chara"].x > wfksoffx + charaoffx)
						{
							obj["chara"].x -= manspeed;
						}
						else
						{
							obj["chara"].x = wfksoffx + charaoffx;
							_ctrlArr.splice(_ctrlIndex, 1);
							_mapFrame.removeEventListener(Event.ENTER_FRAME, moveFrame);
							toPK();
						}
					}
					else
					{
						if (obj["chara"].x == dfgjoffx + charaoffx)
						{
							obj["chara"].startFrame();
						}
						if (obj["chara"].x < drcsoffx + charaoffx)
						{
							obj["chara"].x += manspeed;
						}
						else
						{
							obj["chara"].x = drcsoffx + charaoffx;
							_ctrlArr.splice(_ctrlIndex, 1);
							_mapFrame.removeEventListener(Event.ENTER_FRAME, moveFrame);
							toPK();
						}
					}
				}
			}
		
		}
		
		//判断战斗选项,开始战斗
		private function setAtt():void
		{
			_mapFrame.removeEventListener(Event.ENTER_FRAME, moveFrame);
			var obj:Object = _ctrlArr[_ctrlIndex];
			_face.bitmapData = obj["chara"]._imageFace.bitmapData;
			var hertObj:Object;
			var randIndex:int;
			var hert:int;
			var selfDir:int;
			var hertDir:int;
			//随机获取受攻击武将
			if (_ctrlArr == _pkOurArr)
			{
				randIndex = Math.random() * _listEnemy.length;
				hertObj = _listEnemy[randIndex];
				selfDir = 6;
				hertDir = 5;
			}
			else
			{
				randIndex = Math.random() * _listOur.length;
				hertObj = _listOur[randIndex];
				selfDir = 4;
				hertDir = 7;
			}
			//如果战斗选项是撤退,则随机判断撤退是否成功
			if (obj["ctrl"] == BTN_RETREAT && Math.random() * 100 < 20)
			{
				_characterShow.show_txt.appendText("撤退成功!\n");
				_ctrlIndex = 0;
				_fightShow = GAMEOVER;
				this.addEventListener(Event.ENTER_FRAME, keyDownOver);
				return;
			}
			//选择防御
			if (obj["ctrl"] == BTN_DEFENSE)
			{
				_face.bitmapData = obj["chara"]._imageFace.bitmapData;
				_characterShow.show_txt.appendText(obj["name"] + "防御中\n");
				_moveCtrl = MOVE_RETREAT;
				_mapFrame.addEventListener(Event.ENTER_FRAME, moveFrame);
				return;
			}
			//选择战斗
			var hertDef:int = int(hertObj["def"]);
			if (hertObj["ctrl"] == BTN_DEFENSE)
			{
				hertDef = hertDef * 1.5;
			}
			//攻击力随机浮动,计算伤害值
			hert = Math.floor((110 + int(obj["att"]) - Math.random() * 20 - hertDef) / 5);
			
			obj["chara"]._fun = function()
			{
				//攻击动作结束后,处理函数
				hertObj["chara"]._fun2 = function()
				{
					//受伤害动作结束后,处理函数
					_moveCtrl = MOVE_RETREAT;
					_mapFrame.addEventListener(Event.ENTER_FRAME, moveFrame);
				}
				if (hert >= hertObj["chara"]._hpValue)
				{
					hert = hertObj["chara"]._hpValue;
				}
				_characterShow.show_txt.appendText(obj["name"] + "攻击\n杀死" + hertObj["name"] + hert + "个士兵\n");
				hertObj["chara"].setHp(hert);
			
			}
			//开始攻击
			obj["chara"].setDir(selfDir);
		}
		
		//选项菜单设定
		private function setCtrlBtn():void
		{
			_btnCtrl = BTN_ATTACK;
			_face.bitmapData = _ctrlArr[_ctrlIndex]["chara"]._imageFace.bitmapData;
			_face.width = 120;
			_face.height = 120;
			trace("_fightShow" + _fightShow);
			trace("_btnCtrl" + _btnCtrl);
			
			//_characterShow.ctrl.btn1.show.htmlText = getBtnText(BTN_ATTACK, true);
			//trace(_characterShow.ctrl.btn1.x)
			//_characterShow.ctrl.btn2.x = 100;
			//_characterShow.ctrl.btn2.show.htmlText = getBtnText(BTN_DETECT, false);
			//trace(_characterShow.ctrl.btn2.x);
			//_characterShow.ctrl.btn3.show.htmlText = getBtnText(BTN_DEFENSE, false);
			//trace(_characterShow.ctrl.btn3.x);
			//_characterShow.ctrl.btn4.x = 100;
			//_characterShow.ctrl.btn4.show.htmlText = getBtnText(BTN_RETREAT, false);
			//trace(_characterShow.ctrl.btn4.x);
			_characterShow.ctrl.visible = true;
			stage.focus = _characterShow.ctrl;
		}
		
		//鼠标防御事件
		public function Defmouse(evt:MouseEvent):void
		{
			_btnCtrl = BTN_DEFENSE;
			if (_fightShow == SELECT && _btnCtrl == BTN_DEFENSE)
			{
				
				btnOk();
			}
		
		}
		
		//鼠标攻击事件
		public function Attmouse(evt:MouseEvent):void
		{
			_btnCtrl = BTN_ATTACK;
			if (_fightShow == SELECT && _btnCtrl == BTN_ATTACK)
			{
				btnOk();
			}
		
		}
		public function Chekmouse(evt:MouseEvent):void {
			
			_fightShow == BTN_DETECT
			signLeftRight();
			signOk();
			}
			//战斗结束,
		private function keyDownOver(event:Event):void
		{
			_ctrlIndex++;
			if (_ctrlIndex > 20)
			{
				this.removeEventListener(Event.ENTER_FRAME, keyDownOver);
				_gameMap.fightEnd(_fun);
			}
		}
		
		//键盘事件,
		private function keyDownHandler(event:KeyboardEvent):void
		{
			if (_fightShow == SELECT)
			{
				//战斗菜单键盘事件
				switch (event.keyCode)
				{
					case 40: 
						//btnUpDown();
						break;
					case 38: 
						btnUpDown();
						break;
					case 37: 
						btnLeftRight();
						break;
					case 39: 
						btnLeftRight();
						break;
					case 32: 
						//btnOk();
						break;
					case 13: 
						//btnOk();
						break;
					default: 
						break;
				}
			}
			else if (_fightShow == BTN_DETECT)
			{
				//侦查选择键盘事件
				switch (event.keyCode)
				{
					case 40: 
						signDown();
						break;
					case 38: 
						signUp();
						break;
					case 37: 
						signLeftRight();
						break;
					case 39: 
						signLeftRight();
						break;
					default: 
						signOk();
						break;
				}
			}
			else if (_fightShow == FIGHTVIEW)
			{
				//侦查显示状态下键盘状态
				_mapFrame.removeChild(_view);
				_fightShow = SELECT;
			}
		}
		
		//侦查显示
		private function signOk():void
		{
			_sign.bitmapData = null;
			var obj:Object;
			if (_sign.x == _listEnemy[0]["chara"].x - 30)
			{
				obj = _listEnemy[_signIndex];
			}
			else
			{
				obj = _listOur[_signIndex];
			}
			_view_face.bitmapData = obj["chara"]._imageFace.bitmapData;
			_view_face.width = 120;
			_view_face.height = 120;
			_view.name_txt.text = obj["name"];
			_view.att.text = obj["att"];
			_view.def.text = obj["def"];
			_view.speed.text = obj["speed"];
			_view.comment.text = obj["comment"];
			_mapFrame.addChild(_view);
			_fightShow = FIGHTVIEW;
		}
		
		//侦查选择键盘事件 : 上
		private function signUp():void
		{
			_signIndex--;
			if (_sign.x == _listEnemy[0]["chara"].x - 30)
			{
				if (_signIndex < 0)
				{
					_signIndex = _listEnemy.length - 1;
				}
				_sign.x = _listEnemy[_signIndex]["chara"].x - 30;
				_sign.y = _listEnemy[_signIndex]["chara"].y + 10;
				
			}
			else
			{
				if (_signIndex < 0)
				{
					_signIndex = _listOur.length - 1;
				}
				_sign.x = _listOur[_signIndex]["chara"].x + 48;
				_sign.y = _listOur[_signIndex]["chara"].y + 10;
			}
		}
		
		//侦查选择键盘事件 : 下
		private function signDown():void
		{
			_signIndex++;
			if (_sign.x == _listEnemy[0]["chara"].x - 30)
			{
				if (_signIndex >= _listEnemy.length)
				{
					_signIndex = 0;
				}
				_sign.x = _listEnemy[_signIndex]["chara"].x - 30;
				_sign.y = _listEnemy[_signIndex]["chara"].y + 10;
			}
			else
			{
				if (_signIndex >= _listOur.length)
				{
					_signIndex = 0;
				}
				_sign.x = _listOur[_signIndex]["chara"].x + 48;
				_sign.y = _listOur[_signIndex]["chara"].y + 10;
			}
		}
		
		//侦查选择键盘事件 : 左右
		private function signLeftRight():void
		{
			if (_sign.x == _listEnemy[0]["chara"].x - 30)
			{
				if (_signIndex >= _listEnemy.length || _signIndex < 0)
				{
					_signIndex = 0;
				}
				else
				{
					_sign.bitmapData = _signArr[0][0];
					_sign.x = _listOur[0]["chara"].x + 48;
					_sign.y = _listOur[0]["chara"].y + 10;
				}
			}
			else
			{
				if (_signIndex >= _signArr.length || _signIndex < 0)
				{
					_signIndex = 0;
				}
				else
				{
					_sign.bitmapData = _signArr[0][1];
					_sign.x = _listEnemy[0]["chara"].x - 30;
					_sign.y = _listEnemy[0]["chara"].y + 10;
				}
			}
		}
		
		//战斗菜单键盘事件 : 确定
		private function btnOk():void
		{
			if (_btnCtrl == BTN_DETECT)
			{
				_sign.bitmapData = _signArr[0][1];
				_sign.x = _listEnemy[0]["chara"].x - 30;
				_sign.y = _listEnemy[0]["chara"].y + 10;
				//记录选择事件
				_fightShow = BTN_DETECT;
				_signIndex = 0;
				return;
			}
			var obj:Object = _ctrlArr[_ctrlIndex];
			obj["ctrl"] = _btnCtrl;
			_moveCtrl = MOVE_RETREAT
			_characterShow.ctrl.visible = false;
			_mapFrame.addEventListener(Event.ENTER_FRAME, moveFrame);
		}
		
		//战斗菜单键盘事件 : 上下
		private function btnUpDown():void
		{
			if (_btnCtrl == BTN_ATTACK)
			{
				_btnCtrl = BTN_DEFENSE;
					//_characterShow.ctrl.btn1.show.htmlText = getBtnText(BTN_ATTACK, false);
					//_characterShow.ctrl.btn3.show.htmlText = getBtnText(BTN_DEFENSE, true);
			}
			else if (_btnCtrl == BTN_DEFENSE)
			{
				_btnCtrl = BTN_ATTACK;
					//_characterShow.ctrl.btn1.show.htmlText = getBtnText(BTN_ATTACK, true);
					//_characterShow.ctrl.btn3.show.htmlText = getBtnText(BTN_DEFENSE, false);
			}
			else if (_btnCtrl == BTN_DETECT)
			{
				_btnCtrl = BTN_RETREAT;
					//_characterShow.ctrl.btn2.show.htmlText = getBtnText(BTN_DETECT, false);
					//_characterShow.ctrl.btn4.show.htmlText = getBtnText(BTN_RETREAT, true);
			}
			else if (_btnCtrl == BTN_RETREAT)
			{
				_btnCtrl = BTN_DETECT;
					//_characterShow.ctrl.btn2.show.htmlText = getBtnText(BTN_DETECT, true);
					//_characterShow.ctrl.btn4.show.htmlText = getBtnText(BTN_RETREAT, false);
			}
		}
		
		//战斗菜单键盘事件 : 左右
		private function btnLeftRight():void
		{
			if (_btnCtrl == BTN_ATTACK)
			{
				_btnCtrl = BTN_DETECT;
					//_characterShow.ctrl.btn1.show.htmlText = getBtnText(BTN_ATTACK, false);
					//_characterShow.ctrl.btn2.show.htmlText = getBtnText(BTN_DETECT, true);
			}
			else if (_btnCtrl == BTN_DETECT)
			{
				_btnCtrl = BTN_ATTACK;
					//_characterShow.ctrl.btn1.show.htmlText = getBtnText(BTN_ATTACK, true);
					//_characterShow.ctrl.btn2.show.htmlText = getBtnText(BTN_DETECT, false);
			}
			else if (_btnCtrl == BTN_DEFENSE)
			{
				_btnCtrl = BTN_RETREAT;
					//_characterShow.ctrl.btn3.show.htmlText = getBtnText(BTN_DEFENSE, false);
					//_characterShow.ctrl.btn4.show.htmlText = getBtnText(BTN_RETREAT, true);
			}
			else if (_btnCtrl == BTN_RETREAT)
			{
				_btnCtrl = BTN_DEFENSE;
					//_characterShow.ctrl.btn3.show.htmlText = getBtnText(BTN_DEFENSE, true);
					//_characterShow.ctrl.btn4.show.htmlText = getBtnText(BTN_RETREAT, false);
			}
		}
		
		//战斗菜单显示设定
		private function getBtnText(txt:String, isOn:Boolean):String
		{
			var colStr:String = "#CCCCCC";
			if (isOn)
			{
				colStr = "#FFff00";
			}
			return "<font color='" + colStr + "'><b>" + txt + "</b></font>";
		}
		
		//滚动显示文本信息,让文本始终向上滚动,显示最后一行
		private function renderHandler(e:Event):void
		{
			_characterShow.show_txt.scrollV = _characterShow.show_txt.maxScrollV;
		}
	
	}
}

其实整个事例最重要的类莫过于上面这个fightmap累了,回合制游戏的状态机基本代码都在上面(参考了一个成熟的回合制游戏),开发回合制游戏的话,建议按照上面这个类重写一下,比如使用u3d(或者cocos2dx),可以先作出2d动画,然后按上面这个类的思路对动画进行操作,因为本身代码量不大,而且注释很详细,所以也不多说了,
代码下载在这里,需要的自己研究吧,我们下一篇介绍回合制的里一种形式,九宫格(神仙道类游戏)的战斗。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值