flash 游戏设计笔记 人物行走一种做法 2

               

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

猜你喜欢

转载自blog.csdn.net/truhfcg/article/details/86617237
今日推荐