拖了这么久,终于弄到战斗系统了,不过仙剑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动画,然后按上面这个类的思路对动画进行操作,因为本身代码量不大,而且注释很详细,所以也不多说了,
代码下载在这里,需要的自己研究吧,我们下一篇介绍回合制的里一种形式,九宫格(神仙道类游戏)的战斗。