拖了这么久,终于弄到战斗系统了,不过仙剑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();elseaddEventListener(Event.ADDED_TO_STAGE, init);}private function init(e:Event = null):void{removeEventListener(Event.ADDED_TO_STAGE, init);// entry pointaddChild(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;//载入属性Xmlloader = 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;//读取图片用Bitmapprivate var _image:Bitmap;//头像Bitmappublic 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;//函数1public var _fun:Function;//函数2public var _fun2:Function;//战斗类Classprivate 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);//将传入的位图数据拆分成小块,装入bitmapArrvar 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名称,获取事件xmlif(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();//声明Bitmapprivate 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;//选项显示用和信息显示用MCpublic var _characterShow:CharacterShow;//当前选择选项private var _btnCtrl:String;//战斗状态private var _fightShow:String;//移动状态private var _moveCtrl:String;//符号显示用Bitmapprivate var _sign:Bitmap = new Bitmap();//符号图片储存数组private var _signArr:Array;//人物属性储存用Xmlprivate var _peopleXml:XML;//xml载入类private var loader:XMLLoader;//符号显示用序号private var _signIndex:int = 0;//人物属性用MCprivate var _view:VIEW = new VIEW();//人物属性显示时,头像图片装载用Bitmapprivate var _view_face:Bitmap = new Bitmap();//战斗时我方人物数组private var _pkOurArr:Array;//战斗时敌方人物数组private var _pkEnemyArr:Array;//信息显示时,头像图片装载用Bitmapprivate var _face:Bitmap = new Bitmap();private var _fun:Function;//人物的垂直间距private var mandect:int = 115;//战斗准备时移动的距离private var manspeed:int = 20;//坐标修正private var charaoffx:int = 120;//我方初始坐标xprivate 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);//载入人物属性Xmlloader = 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;//载入战场用xmlloader = 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_DETECTsignLeftRight();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动画,然后按上面这个类的思路对动画进行操作,因为本身代码量不大,而且注释很详细,所以也不多说了,
代码下载在这里,需要的自己研究吧,我们下一篇介绍回合制的里一种形式,九宫格(神仙道类游戏)的战斗。

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

  1. 今天开始做战斗,回合制战斗代码实现第一篇补充,从头开始,简单的2d回合制游戏一些文档方面的知识

    上一篇代码贴完了,总是感觉缺少些东西,因为光看代码用时候不是很直观,我们还是需要些文档来辅助理解.好了,所以补充些内容. 2009 年 8 月,<梦幻西游>同时最高在线人数达到 256 万 ...

  2. matlab实现鬼波信号压制算法(附鬼波算法压制工具包)  代码实践--第一篇 频率-空间域自适应鬼波压制

    matlab实现鬼波信号压制算法(附鬼波算法压制工具包)  代码实践 涵盖了频率-空间域.频率-波数域.拉东域鬼波压制算法     建议实践之前熟练掌握各个域鬼波压制方法的原理,才能对代码有更深入的了 ...

  3. c语言生成16进制随机数,C语言实战篇——模拟ATM取款机,最强大脑小游戏,进制转换,产生不同的随机数...

    2019.11.24 模拟ATM取款机 如图为登录界面 银行.png #include int main(){ printf("----------------------------\n& ...

  4. 今天开始做战斗,回合制战斗代码实现第二篇,九宫格战斗

    说到九宫格战斗,就不能不提一款游戏<神仙道>,在神仙道之前,九宫格战斗的模式就在几款游戏里面有应用,但神仙道是真真正正把这种战斗模式发扬光大的里程碑,当时无论口碑,还是市场占有率都可以说是 ...

  5. 图神经网络代码_第一篇:图神经网络(GNN)计算框架绪论

    写在开头: 这个专栏是为了总结我本科毕业设计中所设计的题目<基于GPU的图神经网络算法库的设计钰实现>.这半年来一直在这个方向上啃代码,读论文,真的学到了很多东西.尤其是阅读了大佬团队写的 ...

  6. 基于stm32c8t6的两轮平衡小车 第一篇——物料选购

    本人在最近在实习摸鱼期间尝试了一下PID平衡小车,在做的过程中遇到了许多问题,由于我是开始做之前完全是一个小白(都到大四实习期了,还是个小白 ,是不是很搞笑,所以在这里劝大家大学期间还是要好好学习 , ...

  7. zabbix监控第一篇---基础使用

    zabbix监控系统第一篇---安装和简单使用 在本文中主要讲一下目前比较流行的zabbix监控系统的安装和使用,实验以最新的zabbix版本为准. 1. 监控系统简介: 业界常用的监控系统主要包括N ...

  8. 第一篇:SOUI是什么?

    概述 用C++做产品最痛苦的是什么?肯定是做UI. SOUI的使命就是把痛苦的UI变化成快乐的UI. 什么?UI还能快乐?脑子进水了吗? 当你看完这个系统教程的时候相信你面对UI至少不会再痛苦.你可以 ...

  9. 2017年终总结——第一篇博客开端

    2017的总结: 2017年过去了,真的好快,可以清晰的记得我去年除夕的晚上我干了啥.但是2017年也是我改变比较大的一年,何出此言呢,总结了几点: 1.变的更加稳重成熟了,这种感觉的由来,其实是有时 ...

最新文章

  1. TCP连接管理【三次握手-四次挥手】
  2. windows如何安装python-windows下安装python过程
  3. 修复 SyntaxHighlighter 3.0.83 Java 代码多行注释 Bug
  4. python 浏览器,轻量级Python Web浏览器
  5. GoLang的逃逸分析
  6. 学会了PowerBI简单的托托拽拽,是时候学习下DAX了
  7. mysql数据库innodb恢复命令_MySQL 如何对InnoDB使用Undrop来恢复InnoDB数据
  8. 【网摘】 浅谈HTTP中GET与POST的区别
  9. 20190817:(leetcode习题)旋转图像
  10. 两种遮罩层的关闭方法
  11. swift4.1 系统学习十 函数
  12. mysql排序优化_Mysql 排序优化
  13. 微服务化的基石--持续集成
  14. MAC中已有的虚拟环境在pycharm 中进行调用
  15. my ReadBook_4juan / zikao / zixuekaoshi
  16. 99个互联网常用词汇,建议收藏“食用”
  17. 适合程序员学习的国外网站推荐
  18. 齐齐哈尔大学计算机调剂,2020年齐齐哈尔大学硕士研究生调剂复试工作方案
  19. LNMT架构部署:Linux+Nginx+Mysql+Tomcat
  20. linux忘记root密码,单用户模式修改密码

热门文章

  1. 卡西欧计算机键盘讲解,卡西欧小方块按键介绍
  2. docker 镜像瘦身工具 docker-slim
  3. 支持响应式手机端jQuery图片轮播插件unslider
  4. QWebEngineView如何忽略SSL证书错误
  5. win10文件夹加密_纯UEFI电脑安装Win10 LTSB做全分区加密
  6. 全栈工程师和架构师的区别
  7. 小白的测试人生(三)小白如何进入IT行业及如何选择培训机构
  8. JAVA pdf中插入自定义图片
  9. mac 命令行 解压7z文件_如何在Mac上快速压缩和解压文件?Mac上解压和压缩文件的方法...
  10. matlab竖向正负柱状图,echarts竖向正负柱状图【如何用EXCEL做正负柱状图?请高手指点,谢谢】...