flash 游戏设计笔记:人物行走一种做法 (1) http://blog.csdn.net/hero82748274/archive/2009/12/16/5020328.aspx
将上次的源码进行修改一下,可以分离出一些共用的代码。
设计一个主角类,这个主角类实现了一个方向的接口。
player 实现IDirection4 的方向接口 ,意思就是代表上下左右四种方向,以及站立不动的接口。可以看下面的图观看他们的之间关系
这种是适合于四种方向的图的做法。
package com.game{ //人物四方移动方向的接口 public interface IDirection4 { function MoveLeft(directtion:uint,dx:int):void;//向左 function MoveRight(directtion:uint,dx:int):void;//向右 function MoveUp(directtion:uint,dy:int):void;//向上 function MoveDown(directtion:uint,dy:int):void;//向下 function Stand():void;//站立 }}
player.as
package com.game{ import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import com.game.BitmapSplice; public class Player implements IDirection4 { private static var player:Player=null; public var MaxStep:int=3; public var contain:Sprite=new Sprite(); public var speed:int=10; private var vx:Number; private var vy:Number; private var Step:int=0;//步数 private var Direction:uint=0;//方向 private var bitmap:BitmapSplice=new BitmapSplice();//位图切割 private var IamgeList:Array; public function Player() { } //为主角对象进行贴图 public function setBody(source:BitmapData,rows:int,cols:int):void { IamgeList=bitmap.Splice(source,rows,cols);//将位图分成很多块 } public function MoveLeft(directtion:uint,dx:int):void { Move(directtion,dx,0); } public function MoveRight(directtion:uint,dx:int):void { Move(directtion,dx,0); } public function MoveUp(directtion:uint,dy:int):void { Move(directtion,0,dy); } public function MoveDown(directtion:uint,dy:int):void { Move(directtion,0,dy); } public function Stand():void { Step=0; } public function getX():Number { return contain.x; } public function getY():Number { return contain.y; } public function Move(directtion:uint,dx:int,dy:int):void { Direction=directtion; Step++; vx=dx*speed; vy=dy*speed; if (Step>MaxStep) { Step=0; } contain.x+=vx;//产生位移 contain.y+=vy;//产生位移 } //渲染图片 public function render():void { contain.graphics.clear(); contain.graphics.beginBitmapFill(IamgeList[Direction][Step]); contain.graphics.drawRect(0,0,IamgeList[Direction][Step].width,IamgeList[Direction][Step].height); contain.graphics.endFill(); } }}
代码测试:
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.ui.Keyboard; import flash.utils.getDefinitionByName; import com.game.Player; public class Main extends MovieClip { private var Isup:Boolean; private var Isdown:Boolean; private var Isleft:Boolean; private var Isright:Boolean; private var bitmapdata:BitmapData=new Player2(0,0);//人物图片 private var mapcontain:MovieClip=new MovieClip();//地图容器 private var player:Player=new Player(); public function Main() { init(); } //初始化 private function init():void { addChild(mapcontain); addChild(player.contain);//人物的容器,装载里面的图片 player.setBody(bitmapdata,4,4); var map:Object=getDefinitionByName("map1");//库链接的地图元件 var temp:MovieClip=new map() as MovieClip; temp.x=temp.y=0; mapcontain.addChild(temp);//地图容器,添加地图序列号 addEventListener(Event.ENTER_FRAME,gameLoop); keyboardListener(); } //游戏循环 private function gameLoop(event:Event):void { control(); player.render();//绘制填充 } //键盘监听 private function keyboardListener():void { stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler); } private function KeyDownHandler(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.UP : Isup=true; break; case Keyboard.DOWN : Isdown=true; break; case Keyboard.LEFT : Isleft=true; break; case Keyboard.RIGHT : Isright=true; break; } } private function KeyUpHandler(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.UP : Isup=false; break; case Keyboard.DOWN : Isdown=false; break; case Keyboard.LEFT : Isleft=false; break; case Keyboard.RIGHT : Isright=false; break; break; } } //控制人物走动 private function control():void { if (Isup &&!Isdown && !Isleft &&!Isright) { player.MoveUp(3,-1);//向上走 } if (Isdown && !Isup && !Isleft &&!Isright) { player.MoveDown(0,1);//向下走 } if (Isleft && !Isup && !Isdown && !Isright) { player.MoveLeft(1,-1);//向左走 } if (Isright && !Isup && !Isdown && !Isleft) { player.MoveRight(2,1);//向右走 } if (!Isup && !Isdown && !Isleft && !Isright) { player.Stand();////站立 } } }}
为了可以实现扩展,依然可以对上面的代码进行改造。例如如果对8个方向的图,那么该怎样做好呢?
这里是一种方法,不过并不完善。但是基本的功能可以实现到。
补充斜角的角度:
package com.game{ //人物补充的另外四个移动方向的接口 public interface IDirection8 { function MoveLeftUp(directtion:uint,dx:int,dy:int):void;//向左上 function MoveRightUp(directtion:uint,dx:int,dy:int):void;//向右上 function MoveLeftDown(directtion:uint,dx:int,dy:int):void;//向左下 function MoveRightDown(directtion:uint,dx:int,dy:int):void;//右下 }}
写一个role 扩展Player 类 同时实现另外四个方向。
package com.game{ import com.game.Player; import com.game.IDirection8; public class Role extends Player implements IDirection8 { public function Role() { } public function MoveLeftUp(directtion:uint,dx:int,dy:int):void { this.Move(directtion,dx,dy); } public function MoveRightUp(directtion:uint,dx:int,dy:int):void { this.Move(directtion,dx,dy); } public function MoveLeftDown(directtion:uint,dx:int,dy:int):void { this.Move(directtion,dx,dy); } public function MoveRightDown(directtion:uint,dx:int,dy:int):void { this.Move(directtion,dx,dy); } }}
选择一张8方的图片。网上下载一张
将其切割成8x8的模块:
最后,进行测试,库连接里面连接一个位图。
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.ui.Keyboard; import flash.utils.getDefinitionByName; import com.game.Player; import com.game.Role; public class Main extends MovieClip { private var Isup:Boolean; private var Isdown:Boolean; private var Isleft:Boolean; private var Isright:Boolean; //private var bitmapdata:BitmapData=new Player2(0,0);//人物图片 private var bitmapdata:BitmapData=new boy(0,0);//人物图片 private var mapcontain:MovieClip=new MovieClip();//地图容器 //private var player:Player=new Player(); private var player:Role=new Role(); public function Main() { init(); } //初始化 private function init():void { addChild(mapcontain); addChild(player.contain);//人物的容器,装载里面的图片 player.setBody(bitmapdata,8,8); var map:Object=getDefinitionByName("map2");//库链接的地图元件 var temp:MovieClip=new map() as MovieClip; temp.x=temp.y=0; mapcontain.addChild(temp);//地图容器,添加地图序列号 addEventListener(Event.ENTER_FRAME,gameLoop); keyboardListener(); } //游戏循环 private function gameLoop(event:Event):void { control(); player.render();//绘制填充 } //键盘监听 private function keyboardListener():void { stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler); } private function KeyDownHandler(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.UP : Isup=true; break; case Keyboard.DOWN : Isdown=true; break; case Keyboard.LEFT : Isleft=true; break; case Keyboard.RIGHT : Isright=true; break; } } private function KeyUpHandler(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.UP : Isup=false; break; case Keyboard.DOWN : Isdown=false; break; case Keyboard.LEFT : Isleft=false; break; case Keyboard.RIGHT : Isright=false; break; break; } } //控制人物走动 private function control():void { if (Isup ) { player.MoveUp(3,-1);//向上走 trace("shang"); } if (Isdown ) { player.MoveDown(0,1);//向下走 } if (Isleft ) { player.MoveLeft(1,-1);//向左走 trace("xia"); } if (Isright ) { player.MoveRight(2,1);//向右走 } if (!Isup && !Isdown && !Isleft && !Isright) { player.Stand();////站立 } if (Isup && Isleft ) { player.MoveLeftUp(6,-0.7,-0.7); trace("jiayou"); } if (Isup && Isright ) { player.MoveRightUp(7,0.7,-0.7); } if ( Isleft && Isdown ) { player.MoveLeftDown(4,-0.7,0.7); } if ( Isright && Isdown ) { player.MoveRightDown(5,0.7,0.7); } } }}
最后贴上一个背景,人物看起来就像在哪里行走一样。不过,让我觉得奇怪的时候,在斜角的时候的速度依然不能满意,有点加快了,可能是代码的判断上存在一些问题。这个问题,目前还没有想到一个好的办法去解决。只能去慢慢完善一下。
待续探讨!
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow