以上各文件夹,com用来存放as文件,date用来存放xml等外部data文件,images下的map用来存放地图图片,player用来存放人物图片
好,下面,先建立新工程
选择Flash工程as3.0,名字随意
然后,CTRL + J打开属性框,将大小改为480*480
首先,先来写一个xml文件,命名为map001.xml,放到FlashProject/data/下,用来生成地图
我还用上次的数组了,但是写到xml文件里,如下:
<data>
<imageMap>
<list>3,3,3,3,3,3,3,3,3,3</list>
<list>3,1,0,0,0,0,3,0,0,3</list>
<list>3,0,0,0,0,0,3,3,0,3</list>
<list>3,0,3,3,3,3,3,3,0,3</list>
<list>3,0,0,3,0,0,0,3,0,3</list>
<list>3,3,0,3,0,3,3,3,0,3</list>
<list>3,0,0,3,0,0,0,0,0,3</list>
<list>3,0,3,3,0,3,0,3,3,3</list>
<list>3,0,0,0,0,3,0,0,2,3</list>
<list>3,3,3,3,3,3,3,3,3,3</list>
</imageMap>
</data>
接着,准备一张图片stage.jpg,放到FlashProject/images/map/备用
下面先不急着生成地图,先来建立一个处理图片的类,
因为刚刚准备的图片需要分解成小的位图才可以用
在com文件夹下,新建ImageCtrl.as
里面代码如下:
package com{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.Rectangle;
public class ImageCtrl {
public function ImageCtrl() {
}
//参数依次为原图片,图片列数,图片行数
public static function divide(source:Bitmap,row:int,col:int,total:* = null):Array {
//计算出每个小位图对象的宽度
var w:uint=source.width/row;
//计算出每个小位图对象的高度
var h:uint=source.height/col;
//计算有效位图总数
total=total==null?col*row:total;
//定义结果数组
var result:Array= new Array();
//定义矩阵
var matrix:Matrix = new Matrix();
//定义矩形
var rect:Rectangle=new Rectangle(0,0,w,h);
out:for (var j:int = 0; j < col; j++) {
var tempArr:Array = new Array();
for (var i:int = 0; i < row; i++) {
if (total<=0) {
break out;
}
//新建小位图对象
var bmp:BitmapData=new BitmapData(w,h,true,0x00000000);
//定义矩阵的焦点
matrix.tx=- i*w;
matrix.ty=- j*h;
//将矩阵内的数据按定义好的矩形大小和相应位置,画出小位图对象像素
bmp.draw(source,matrix,null,null,rect,true);
tempArr.push(bmp);
total--;
}
result.push(tempArr);
}
return result;
}
}
}
好了,上面这个类,可以把需要的大图片,按照需要分解成小的位图装进数组里
下面,该做地图了,在FlashProject/com/里新建Map001.as文件
内容如下:
package com{
import flash.net.URLLoader;
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.geom.Point;
public class Map001 extends MovieClip {
//声明载入图片类
private var _loader:Loader = new Loader( );
//声明Bitmap
private var _image:Bitmap;
//装载地图小位图用
private var _mapList:Array= new Array();
private var _mapXmlSrc:String;
//地图图片数组
private var _map:Array= new Array();
public function Map001() {
//获取地图xml文件
_mapXmlSrc = "data/map001.xml";
var loader:URLLoader = new URLLoader(new URLRequest(_mapXmlSrc));
loader.addEventListener(Event.COMPLETE,initMap);
}
public function initMap(evet:Event):void{
var mapXml:XML = new XML(evet.target.data);
//根据xml内容,得到地图图片数组
for each ( var element:XML in mapXml.imageMap.elements( ) ) {
var words:Array = ("" + element).split( ",");
_map.push(words);
}
//加载地图
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_loader.load(new URLRequest("images/map/stage.jpg"));
}
public function onComplete(event:Event):void {
_image = Bitmap(_loader.content);
//将地图文件分解成数组
_mapList = ImageCtrl.divide(_image,4,1);
for(var i:int=0;i<10;i++){
for(var j:int=0;j<10;j++){
var index:int = _map[j];
var __image = new Bitmap(_mapList[0][index]);
__image.x = j*48;
__image.y = i*48;
addChild(__image);
}
}
}
}
}
这样地图就已经生成了,下面该把地图显示出来了
在FlashProject/com/里新建GameStart.as
代码如下:
package com{
import flash.display.MovieClip;
public class GameStart extends MovieClip {
public function GameStart() {
var map_001:Map001 = new Map001();
addChild(map_001);
}
}
}
然后,打开flash工程主场景,鼠标点击第一贞,F9打开代码框,写下:
import com.GameStart;
var myStart:GameStart = new GameStart();
addChild(myStart);
stop();
然后,CTRL+回车,生成flash
可以看到,一幅简单的地图就这样轻松的生成了
//声明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:Object;
private var _isKeyDown:Boolean = false;
//人物坐标
private var _point: Point;
//构造器 mapBack:当前地图 player:人物图片 row:图片列数 col:图片行数
public function PeopleClass(mapBack:Object,player:String,row:int,col:int,point: Point = null) {
_point = new Point(point.x*48,point.y*48);
_mapBack = mapBack;
_row = row;
_col = col;
//初始化time;
_timer = new Timer(100);
_timer.addEventListener(TimerEvent.TIMER, timerHandler);
//图片加载对象;
_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);
//角色动作开始;
_timer.start();
}
//键盘事件,通过方向键更改角色移动方向;
private function keyDownHandler(event:KeyboardEvent):void {
_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;
}
}
//键盘事件,
private function keyUpHandler(event:KeyboardEvent):void {
_isKeyDown = false;
}
package com{
import flash.net.URLLoader;
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.geom.Point;
public class Map001 extends MovieClip {
//声明载入图片类
private var _loader:Loader = new Loader( );
//声明Bitmap
private var _image:Bitmap;
//装载地图小位图用
private var _mapList:Array= new Array();
private var _mapXmlSrc:String;
//地图图片数组
private var _map:Array= new Array();
//人物
private var _player: PeopleClass;
public function Map001() {
//获取地图xml文件
_mapXmlSrc = "data/map001.xml";
var loader:URLLoader = new URLLoader(new URLRequest(_mapXmlSrc));
loader.addEventListener(Event.COMPLETE,initMap);
}
public function initMap(evet:Event):void{
var mapXml:XML = new XML(evet.target.data);
//根据xml内容,得到地图图片数组
for each ( var element:XML in mapXml.imageMap.elements( ) ) {
var words:Array = ("" + element).split( ",");
_map.push(words);
}
//加载地图
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_loader.load(new URLRequest("images/map/stage.jpg"));
}
public function onComplete(event:Event):void {
_image = Bitmap(_loader.content);
//将地图文件分解成数组
_mapList = ImageCtrl.divide(_image,4,1);
for(var i:int=0;i<10;i++){
for(var j:int=0;j<10;j++){
var index:int = _map[j];
var __image = new Bitmap(_mapList[0][index]);
__image.x = j*48;
__image.y = i*48;
addChild(__image);
}
}
//加载人物
_player = new PeopleClass(this,"images/player/liubei.gif",2,4,new Point(2,1));
//设定光标
stage.focus = this;
}
}
}
CTRL+回车运行,
可以看到,人物已经添加上去了,
但是情况,依然是“跳移”,且上天入地,畅通无阻
至此,已经和上次完成了相同的内容
//声明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:Object;
//移动步数控制
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 = false;
//构造器 mapBack:当前地图 player:人物图片 row:图片列数 col:图片行数
public function PeopleClass(mapBack:Object,player:String,row:int,col:int,point: Point = null) {
if(point == null){
_point = new Point(0,0);
_mapPoint = new Point(0,0);
}else{
_point = new Point(point.x*48,point.y*48);
_mapPoint = point;
}
_mapBack = mapBack;
_row = row;
_col = col;
//初始化time;
_timer = new Timer(100);
_timer.addEventListener(TimerEvent.TIMER, timerHandler);
//图片加载对象;
_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);
//角色动作开始;
_timer.start();
}
//键盘事件,通过方向键更改角色移动方向;
private function keyDownHandler(event:KeyboardEvent):void {
//人物移动不够一个坐标,则返回
if(_moveCtrl > 0){
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;
}
}
//键盘事件,
private function keyUpHandler(event:KeyboardEvent):void {
_isKeyDown = false;
}
//定时器运行事件;
private function timerHandler(event:Event):void {
//删除旧的角色动作图像;
if (_peopleBitmap != null) {
_mapBack.removeChild(_peopleBitmap);
}
//显示新的角色动作图像;
_peopleBitmap = new Bitmap(_bitmapArr[_playDirection][_pointer]);
//角色坐标
_peopleBitmap.x = _point.x;
_peopleBitmap.y = _point.y;
_mapBack.addChild(_peopleBitmap);
//角色动作循环处理;
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;
}
//地图重绘
_mapBack.drowMap();
}
_moveCtrl += 1;
}
//移动控制
private function toMove():void{
//移动达到一个坐标判断
if(_moveCtrl >= 4){
_moveCtrl =0;
//如果滚屏移动,则重绘地图
if(_mapIsRoll){
_mapBack._mapFrame.x = 0;
_mapBack._mapFrame.y = 0;
_mapBack.setCoordinate();
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();
}
}
}
}
以上,红色字体部分必须有,是用来清除旧的地图,否则new的越来越多,速度也就越来越慢了......
当然,需要在com包下添加一个新类,
BaseRemove.as:
package com
{
import flash.display.*;
public class BaseRemove{
public static function removeAllChildren(
containerisplayObjectContainer ):void {
var count:int = container.numChildren;
for ( var i:int = 0; i < count; i++ ) {
container.removeChildAt( 0 );
}
}
GameStart.as中,将相应地图名称封装,变更如下:
package com{
import flash.display.MovieClip;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.geom.Point;
public class GameStart extends MovieClip {
private var _mapList:HashMap = new HashMap();
private var _mapName:String = "map001";
//人物跳转坐标
private var _mapPoint:Point;
public function GameStart() {
var loader:URLLoader = new URLLoader(new URLRequest("data/maps.xml"));
loader.addEventListener(Event.COMPLETE,initMap);
}
public function initMap(evet:Event):void{
//得到xml信息
var mapXml:XML = new XML(evet.target.data);
//装载所有地图信息
for each ( var datement:XML in mapXml.elements( ) ) {
var strDate:String = ("" + datement);
_mapList.put(strDate,"data/" + strDate + ".xml");
}
selectMap();
}
//地图跳转
public function selectMap():void{
BaseRemove.removeAllChildren(this);
//通过名称显示相应地图
var mapValue:String = "" +_mapList.getValue(_mapName);
var map_001:Map001 = new Map001(mapValue,this);
addChild(map_001);
}
//设定地图名称
public function setMapName(mapName:String):void{
_mapName = mapName;
}
//设定人物跳转坐标
public function setPoint(mapPoint:Point = null):void{
_mapPoint = mapPoint;
}
//得到人物跳转坐标
public function getPoint():Point{
return _mapPoint;
}
}
}
Map001.as 中,增加响应解析xml的代码,
public function initMap(evet:Event):void{
//得到xml信息
var mapXml:XML = new XML(evet.target.data);
//得到人物图片
_propleImage = mapXml.hero.Image;
//取得地图最大size
_maxX = mapXml.dataMap.@maxX;;
_maxY = mapXml.dataMap.@maxY;
//得到人物坐标信息
var peoplePoint:Point = _gameMap.getPoint();
if(peoplePoint == null){
var strPoint:String = mapXml.hero.Coordinate;
var pointArray:Array = strPoint.split( ",");
_peoplePoint = new Point(pointArray[0],pointArray[1]);
}else{
_peoplePoint = peoplePoint;
}
//计算人物坐标和显示位置
var mPointX:int = 0;
var mPointY:int = 0;
if(_peoplePoint.x > 5){
if(_peoplePoint.x + 5 <= _maxX){
mPointX = _peoplePoint.x - 5;
_peoplePoint.x = 5;
}else{
mPointX = _maxX - 10;
if(mPointX > 0){
_peoplePoint.x = _peoplePoint.x - mPointX;
}
}
}
if(_peoplePoint.y > 5){
if(_peoplePoint.y + 5 <= _maxY){
mPointY = _peoplePoint.y - 5;
_peoplePoint.y = 5;
}else{
mPointY = _maxY - 10;
if(mPointY > 0 ){
_peoplePoint.y = _peoplePoint.y - mPointY;
}
}
}
_mPoint = new Point(mPointX,mPointY);
//根据xml内容,得到地图图片数组
for each ( var element:XML in mapXml.imageMap.elements( ) ) {
var words:Array = ("" + element).split( ",");
_map.push(words);
}
//根据xml内容,得到地形数组
for each ( var datement:XML in mapXml.dataMap.elements( ) ) {
var dates:Array = ("" + datement).split( ",");
_mapDate.push(dates);
}
//根据xml内容,得到地图跳转信息
for each ( var changement:XML in mapXml.changeMap.elements( ) ) {
var changeList:Array = new Array();
changeList.push(changement.@name);
if(("" + changement.@coordinate).length > 0){
var thisPointArray:Array = ("" + changement.@coordinate).split( ",");
var thisPoint1:Point = new Point(thisPointArray[0],thisPointArray[1]);
changeList.push(thisPoint1);
}else{
changeList.push(null);
}
_changeList.put("" + changement,changeList);
}
//加载地图
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_loader.load(new URLRequest("images/map/stage.jpg"));
}
最终代码如下:
package com{
import flash.net.URLLoader;
import flash.display.MovieClip;
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;
public class Map001 extends MovieClip {
//声明载入图片类
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:MovieClip = new MovieClip();
//地图跳转信息
public var _changeList:HashMap = new HashMap();
public var _gameMap:GameStart;
public function Map001(mapXmlSrc:String,gameMap:GameStart) {
addChild(_mapFrame);
_gameMap = gameMap;
//获取地图xml文件
_mapXmlSrc = mapXmlSrc;
var loader:URLLoader = new URLLoader(new URLRequest(_mapXmlSrc));
loader.addEventListener(Event.COMPLETE,initMap);
addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
}
public function mouseDownHandler(evet:MouseEvent):void{
//设定光标
stage.focus = this;
}
public function initMap(evet:Event):void{
//得到xml信息
var mapXml:XML = new XML(evet.target.data);
//得到人物图片
_propleImage = mapXml.hero.Image;
//取得地图最大size
_maxX = mapXml.dataMap.@maxX;;
_maxY = mapXml.dataMap.@maxY;
//得到人物坐标信息
var peoplePoint:Point = _gameMap.getPoint();
if(peoplePoint == null){
var strPoint:String = mapXml.hero.Coordinate;
var pointArray:Array = strPoint.split( ",");
_peoplePoint = new Point(pointArray[0],pointArray[1]);
}else{
_peoplePoint = peoplePoint;
}
//计算人物坐标和显示位置
var mPointX:int = 0;
var mPointY:int = 0;
if(_peoplePoint.x > 5){
if(_peoplePoint.x + 5 <= _maxX){
mPointX = _peoplePoint.x - 5;
_peoplePoint.x = 5;
}else{
mPointX = _maxX - 10;
if(mPointX > 0){
_peoplePoint.x = _peoplePoint.x - mPointX;
}
}
}
if(_peoplePoint.y > 5){
if(_peoplePoint.y + 5 <= _maxY){
mPointY = _peoplePoint.y - 5;
_peoplePoint.y = 5;
}else{
mPointY = _maxY - 10;
if(mPointY > 0 ){
_peoplePoint.y = _peoplePoint.y - mPointY;
}
}
}
_mPoint = new Point(mPointX,mPointY);
//根据xml内容,得到地图图片数组
for each ( var element:XML in mapXml.imageMap.elements( ) ) {
var words:Array = ("" + element).split( ",");
_map.push(words);
}
//根据xml内容,得到地形数组
for each ( var datement:XML in mapXml.dataMap.elements( ) ) {
var dates:Array = ("" + datement).split( ",");
_mapDate.push(dates);
}
//根据xml内容,得到地图跳转信息
for each ( var changement:XML in mapXml.changeMap.elements( ) ) {
var changeList:Array = new Array();
changeList.push(changement.@name);
if(("" + changement.@coordinate).length > 0){
var thisPointArray:Array = ("" + changement.@coordinate).split( ",");
var thisPoint1:Point = new Point(thisPointArray[0],thisPointArray[1]);
changeList.push(thisPoint1);
}else{
changeList.push(null);
}
_changeList.put("" + changement,changeList);
}
//加载地图
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_loader.load(new URLRequest("images/map/stage.jpg"));
}
public function onComplete(event:Event):void {
_image = Bitmap(_loader.content);
//将地图文件分解成数组
_mapList = ImageCtrl.divide(_image,10,10);
//加载人物
_player = new PeopleClass(this,_propleImage,2,4,_peoplePoint);
//绘制地图
drowMap();
//设定光标
stage.focus = this;
}
public function drowMap():void{
//地图清空
BaseRemove.removeAllChildren(_mapFrame);
//地图重绘
for(var i:int= _mPoint.y + _mapStartY;i<_mPoint.y + _mapEndY + 10;i++){
for(var j:int=_mPoint.x + _mapStartX;j<_mPoint.x + _mapEndX + 10;j++){
var index:int = _map[j];
var indexX:int = Math.floor(index /10);
var indexY:int = index - indexX*10;
__image = new Bitmap(_mapList[indexX][indexY]);
__image.x = (j - _mPoint.x)*48;
__image.y = (i - _mPoint.y)*48;
_mapFrame.addChild(__image);
}
}
}
//取得地形数组
public function getMapDate():Array{
return _mapDate;
}
//设定偏移
public function setCoordinate(intStartX:int = 0,intEndX:int = 0,intStartY:int = 0,intEndY:int = 0):void{
_mapStartX = intStartX;
_mapEndX = intEndX;
_mapStartY = intStartY;
_mapEndY = intEndY;
}
public function removeSelf():void{
BaseRemove.removeAllChildren(_mapFrame);
}
}
}
最后是PeopleClass.as中,在人物移动中添加跳转判断
//移动控制
private function toMove():void{
//移动达到一个坐标判断
if(_moveCtrl >= 4){
_moveCtrl =0;
//如果滚屏移动,则重绘地图
if(_mapIsRoll){
_mapBack._mapFrame.x = 0;
_mapBack._mapFrame.y = 0;
_mapBack.setCoordinate();
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();
}
//检测跳转
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;
}
//声明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 = false;
//构造器 mapBack:当前地图 player:人物图片 row:图片列数 col:图片行数
public function PeopleClass(mapBack:Map001,player:String,row:int,col:int,point:Point = null) {
_mapBack = 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);
}
//初始化time;
_timer = new Timer(100);
_timer.addEventListener(TimerEvent.TIMER, timerHandler);
//图片加载对象;
_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);
//角色动作开始;
_timer.start();
}
//键盘事件,通过方向键更改角色移动方向;
private function keyDownHandler(event:KeyboardEvent):void {
//人物移动不够一个坐标,则返回
if(_moveCtrl > 0){
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;
}
}
//键盘事件,
private function keyUpHandler(event:KeyboardEvent):void {
_isKeyDown = false;
}
}
}
最后,做一个仿HashMap类,HashMap.as
package com
{
import flash.utils.Dictionary;
public class HashMap
{
private var _keys:Array=null;
private var props:Dictionary=null;
public function HashMap() {
this.clear();
}
public function clear():void {
this.props=new Dictionary ;
this._keys=new Array ;
}
public function containsKey(key:Object):Boolean {
return this.props[key]!=null;
}
public function containsValue(value:Object):Boolean {
var result:Boolean=false;
var len:uint=this.size();
if (len>0) {
for (var i:uint=0; i<len; i++) {
if (this.props[this._keys]==value) {
result = true;
break;
}
}
}
return result;
}
public function getValue(key:Object):Object {
return this.props[key];
}
public function put(key:Object,value:Object):Object {
var result:Object=null;
if (this.containsKey(key)) {
result=this.getValue(key);
this.props[key]=value;
} else {
this.props[key]=value;
this._keys.push(key);
}
return result;
}
public function remove(key:Object):Object {
var result:Object=null;
if (this.containsKey(key)) {
delete this.props[key];
var index:int=this._keys.indexOf(key);
if (index>-1) {
this._keys.splice(index,1);
}
}
return result;
}
public function putAll(map:HashMap):void {
this.clear();
var len:uint=map.size();
if (len>0) {
var arr:Array=map.keys();
for (var i:uint=0; i<len; i++) {
this.put(arr,map.getValue(arr));
}
}
}
public function size():uint {
return this._keys.length;
}
public function isEmpty():Boolean {
return this.size() <1;
}
public function values():Array {
var result:Array=new Array ;
var len:uint=this.size();
if (len>0) {
for (var i:uint=0; i<len; i++) {
result.push(this.props[this._keys]);
}
}
return result;
}
public function keys():Array {
return this._keys;
}
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
public class Talk extends MovieClip {
private var _tar:MovieClip;
private var _talkStr:String;
private var _temp_str:String;
private var _my_talk:MovieClip;
private var _down_fun:Object;
private var _now_index:uint;
private var _total_index:uint;
private var _my_timer:Timer;
private var _loader:Loader = new Loader( );
private var _image:Bitmap;
private var _bitmap:BitmapData;
private var _array:Array;
public function Talk(tar:MovieClip) {
_tar=tar;
}
public function newTalk(array:Array) {
_array = array;
_down_fun=array[3];
_my_talk=new talk_mc();
_my_talk.name_txt.text=array[1];
if(_tar.getPlayer()._peopleName == array[1]){
_my_talk.x=0;
_my_talk.y=300;
}else{
_my_talk.x=0;
_my_talk.y=30;
}
_talkStr=array[2];
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_loader.load(new URLRequest(array[0]));
_my_timer=new Timer(50);
_now_index=0;
_total_index=_talkStr.length;
_my_timer.addEventListener(TimerEvent.TIMER,_my_timer_fun);
_tar.addEventListener(KeyboardEvent.KEY_DOWN, my_md_key);
_my_timer.start();
return _my_talk;
}
public function onComplete(event:Event):void {
_image = Bitmap(_loader.content);
_bitmap = _image.bitmapData;
_my_talk.face.addChild(_image);
_tar.addChild(_my_talk);
}
private function my_md_key(eve:KeyboardEvent) {
if (_now_index<_total_index) {
_now_index=_total_index;
_my_talk.show_txt.text=_talkStr;
} else {
_tar.removeChild(_my_talk);
_loader = new Loader( );
_my_talk=null;
_my_timer.stop();
_down_fun();
}
}
public function removeKeyDown():void{
_tar.removeEventListener(KeyboardEvent.KEY_DOWN, my_md_key);
}
private function _my_timer_fun(eve:TimerEvent) {
if (_now_index<_total_index) {
_now_index++;
_temp_str=_talkStr.substr(0,_now_index);
_my_talk.show_txt.text=_temp_str;
} else {
_my_timer.stop();
}
}
public function getTar(){
return _tar;
}
}
}
然后,主要是修改PeopleClass.as中的代码
现在把工程上传,里面都写了详细的注释,很容易明白,有兴趣的朋友可以下载看一下,
代码没多少,主要是几张图片占地方
效果如图
暂时告一段落了,有时间了再慢慢研究战斗系统
A*算法寻路代码如下
RoadQuery.as
package com
{
import flash.geom.Point;
public class RoadQuery
{
private var _map:Array;//地图
private var _w:int;//地图的宽
private var _h:int;//地图的高
private var _open:Array;//开放列表
private var _aveOpen:Number;//开放列表平均值
private var _starPoint:Object;
private var _endPoint:Object;
private var _path:Array = [];//计算出的路径
public function RoadQuery(map:Array) {
_map = [];
_w = map[0].length;
_h = map.length;
for (var y:int=0; y<_h; y++) {
if (_map[y]==undefined) {
_map[y] = [];
}
for (var x:int=0; x<_w; x++) {
_map[y][x] = {x:x, y:y, value:map[y][x], isChecked:false, open:false, value_g:0, value_h:0, value_f:0, nodeparent:null, index:-1};
}
}
}
//寻路
public function path4(star:Point, end:Point):Array {
_path = [];
_starPoint = _map[star.y][star.x];
_endPoint = _map[end.y][end.x];
var isOver:Boolean = false;
setStart();
var thisPoint:Object = _starPoint;
while (!isOver) {
thisPoint.isChecked = true;
var checkList:Array = [];
//获取周围四个点
if (thisPoint.y>0) {
checkList.push(_map[(thisPoint.y-1)][thisPoint.x]);
}
if (thisPoint.x>0) {
checkList.push(_map[thisPoint.y][(thisPoint.x-1)]);
}
if (thisPoint.x<_w-1) {
checkList.push(_map[thisPoint.y][(thisPoint.x+1)]);
}
if (thisPoint.y<_h-1) {
checkList.push(_map[(thisPoint.y+1)][thisPoint.x]);
}
//检测开始
var startIndex:int = checkList.length;
for (var i:int = 0; i<startIndex; i++) {
//周围的每一个节点
var checkPoint:Object = checkList;
if(_map[checkPoint.y][checkPoint.x].value==0){
//如果可通过,则先判断是否是指定地点,否则开始计算
if (checkPoint == _endPoint) {
checkPoint.nodeparent = thisPoint;
isOver = true;
break;
}
count(checkPoint, thisPoint);
}
}
if (!isOver) {
//如果未到达指定地点则取出f值最小的点作为循环点
if (_open.length>0) {
thisPoint = getOpen();
} else {
//开发列表为空,寻路失败
return [];
}
}
}
//画路径
var pathPoint:Object = _endPoint;
while (pathPoint != _starPoint) {
_path.unshift(new Point(pathPoint.x, pathPoint.y));
pathPoint = pathPoint.nodeparent;
}
_path.unshift(new Point(pathPoint.x, pathPoint.y));
return _path;
}
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:GameStart;
//装载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;
public function FightMap(mapXmlSrc:String,fun:Function,gameMap:GameStart) {
//添加地图画板
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.y = 360;
_characterShow.face.addChild(_face);
this.addChild(_characterShow);
//鼠标点击时候,光标设定
addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
//载入人物属性Xml
loader = new XMLLoader();
loader.onLoadComplete = initPeople;
loader.load("data/people.xml", XMLLoader.GB2312);
}
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;
_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;
keys = new Object();
keys["playDirection"] = 3;
chara = new CharacterMC(this,obj["face"],obj["moveimage"],obj["attimage"],keys);
chara.x = 50;
chara.y = i * 70 + 20;
chara._nameTxt = obj["name"];
obj["chara"] = chara;
obj["move"] = 0;
_npcFrame.addChild(chara);
}
//初始化敌方人物
for(i=0;i<_listEnemy.length;i++){
obj = _listEnemy;
keys = new Object();
keys["playDirection"] = 2;
chara = new CharacterMC(this,obj["face"],obj["moveimage"],obj["attimage"],keys);
chara.x = 380;
chara.y = i * 70 + 20;
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;
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;
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);
}
};
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.MouseEvent;
import rpg_map4.mains.Main;
import rpg_map4.other.GridLayer;
import rpg_map4.other.ChildFloor;
public class MapImage extends Sprite{
// Constants:
// Public Properties:
// Private Properties:
private var _map:MapFloor;
private var _main:Main;
private var _bakMc:Sprite;
private var _gridMc:Sprite;
private var _gridLayer:GridLayer;
public var _floorList:Array = new Array();
// Initialization:
public function MapImage(main) {
_main = main;
_map = new MapFloor();
addChild(_map);
}
public function setFloor(mapwidth:int,mapheight:int):void{
_bakMc = new Sprite();
_gridMc = new Sprite();
_map.floorImage.addChild(_bakMc);
_map.floorImage.addChild(_gridMc);
for(var i:int = 0;i<(mapwidth);i++){
var floorChild:Array = new Array();
for(var j:int = 0;j<(mapheight);j++){
var bit:ChildFloor = new ChildFloor();
bit.bitmapData = _main._mapList[0][0];
bit.x = i*48;
bit.y = j*48;
_bakMc.addChild(bit);
floorChild.push(bit);
}
_floorList.push(floorChild);
}
// Constants:
// Public Properties:
// Private Properties:
public var valueX:int;
public var valueY:int;
// Initialization:
public function ChildFloor() { }
import rpg_map4.map.MapImage;
import rpg_map4.other.Covert;
import rpg_map4.other.ChildFloor;
import com.ot.BaseRemove;
import com.npc.XMLLoader;
import fl.controls.Button;
import fl.controls.Label;
import fl.controls.TextInput;
import flash.net.FileReference;
import flash.net.FileFilter;
public class Main extends Sprite{
//地图画板
private var _mapImage:MapImage;
//小图片数组
public var _mapList:Array= new Array();
//地形数组
public var _mapTypeList:Array= new Array();
private var _loader:Loader;
private var _image:Bitmap;
private var _mc:Sprite;
//地图画板表示用MC
private var _mcMap:Sprite;
//小图片表示用MC
private var _mcStage:Sprite;
//地形表示用MC
private var _mcMapType:Sprite;
//鼠标Icon用
private var _mcMouse:Sprite;
//按钮表示用MC
private var _backMC:Sprite;
//新建地图按钮
private var _newBtn:Button;
//取消所选按钮
private var _canBtn:Button;
//保存地图按钮
private var _saveBtn:Button;
//载入地图按钮
private var _openBtn:Button;
//修改地形/地图按钮
private var _mapTypeBtn:Button;
//保存地形按钮
private var _typeSaveBtn:Button;
public var _imageMouse:ChildFloor = new ChildFloor();
private var _xleng:TextInput = new TextInput();
private var _yleng:TextInput = new TextInput();
//新建地图后确定按钮
private var _makeBtn:Button = new Button();
//新建地图后取消按钮
private var _canselBtn:Button = new Button();
//新建地图页面表示用MC
private var _mcMake:Sprite;
//XML载入器
private var _xmlloader:XMLLoader;
//文件操作用
private var _file:FileReference;
public function Main() {
_mc = new Sprite();
addChild(_mc);
_mcMouse = new Sprite();
addChild(_mcMouse);
_mcMouse.addChild(_imageMouse);
this..addEventListener(MouseEvent.MOUSE_MOVE,moveMouse);
//载入属性Xml
_xmlloader = new XMLLoader();
_xmlloader.onLoadComplete = initMapType;
_xmlloader.load("mapType.xml", XMLLoader.GB2312);
}
//初始化地形数组
private function initMapType(xml:XML):void{
_mcMapType = new Sprite();
var floor:FLOOR = new FLOOR();
var _lblType:Label;
_mcMapType.addChild(floor);
var i:int;
//根据xml内容,得到地形数组
for each ( var datement:XML in xml.elements( ) ) {
var dates:Array = ("" + datement).split( ",");
var mapTypeChild:Array = new Array();
for(var j=0;j<dates.length;j++){
_lblType = new Label();
_lblType.width = 24;
_lblType.height = 24;
_lblType.htmlText = '<font color="#FF0000" size="20"><b>' + dates[j] + "</b></font>";
_lblType.x = j*24;
_lblType.y = i*24;
mapTypeChild.push(_lblType);
_mcMapType.addChild(_lblType);
}
_mapTypeList.push(mapTypeChild);
i++;
}
floor.width = _mapTypeList.length * 24;
floor.height = _mapTypeList[0].length * 24;
floor.alpha = 0.5;