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

本文介绍了一种在Flash游戏中实现角色行走的方法,包括基础的四方向行走和扩展的八方向行走,并提供了详细的代码示例。

flash 游戏设计笔记:人物行走一种做法 (1) http://blog.youkuaiyun.com/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://www.cnblogs.com/guoyiqi/archive/2010/01/03/2069246.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值