Move&Move游戏键盘控制方法浅析 |
| [来源:闪吧论坛 | 作者:深闪 | 时间:2009-06-28 | 点击: | 收藏本文 【大 中 小】] |
|
|
| 5uflash文章摘要: 在Flash中关于侦听键盘事件的移动,最普通的方法莫过于此:
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.MouseEvent;
&n |
在Flash中关于侦听键盘事件的移动,最普通的方法莫过于此: package { import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.events.MouseEvent; public class main extends Sprite { private function keyEvt(event:KeyboardEvent):void { trace(event.keyCode); switch (event.keyCode) { case Keyboard.UP : event.target.y-=10; break; case Keyboard.DOWN : event.target.y+=10; break; case Keyboard.LEFT : event.target.x-=10; break; case Keyboard.RIGHT : event.target.x+=10; break; default : break; } } public function main():void { var sp:Sprite=new Sprite(); sp.graphics.beginFill(0x0000ff); sp.graphics.drawRect(200,200,100,100); sp.graphics.endFill(); addChild(sp); sp.buttonMode=true; sp.addEventListener(KeyboardEvent.KEY_DOWN,keyEvt); } } }
这段代码的确可以让我们的主角沿着四个方向移动,但是很快我们就发现这个代码不能让我们满意,为什么呢?因为利用KeyDown的事件是由键盘触发的,当我们按下键盘的一个键不松开的时候,受到键盘重复速率的影响,主角的移动并不平滑。那怎么办呢? 最好的办法是改变一个思路,当我们按下一个键,在松开之前,主角的移动不受到键盘重复事件的影响。 最容易想到的思路,就是利用时间触发器,当按下一个键,主人公按照触发器指定的时间间隔进行移动。松开按键,计时停止。主人公也当然的停止下来。
在这个例子里,我建立了一个名叫player的MC,在第一帧中加入如下代码: var _player:MovieClip=new player(); _player.x=stage.stageWidth/2; _player.y=stage.stageHeight/2; var timer:Timer=new Timer(30); var movespeed=2;//移动速度; addChild(_player); var _transferobject isplayObject=_player;//为了方便改动,设立了一个中间变量 var _direction:uint=0;//准备一个存储方向的变量 stage.addEventListener(KeyboardEvent.KEY_DOWN,handler_Keydown,false,0,true); stage.addEventListener(KeyboardEvent.KEY_UP,handler_Keyup,false,0,true); timer.addEventListener(TimerEvent.TIMER,handler_time,false,0,true); function handler_Keydown(event:KeyboardEvent):void{ trace(event.keyCode); switch (event.keyCode) { case Keyboard.UP : _direction=1; break; case Keyboard.DOWN : _direction=3; break; case Keyboard.LEFT : _direction=2; break; case Keyboard.RIGHT : _direction=4; break; default : break; } timer.start(); } function handler_Keyup(event:KeyboardEvent):void{ timer.stop(); _direction=0; } function handler_time(event:TimerEvent):void{ _move(_transferobject); } function _move(obj isplayObject){ switch (_direction) { case 0: timer.stop(); break; case 1: obj.y-=movespeed; break; case 2: obj.x-=movespeed; break; case 3: obj.y+=movespeed; break; case 4: obj.x+=movespeed; break; default : break; } }
测试一下,OK,平滑了许多,但是能不能在精简一些资源呢,不用时间触发呢?答案是肯定的,那就是利用ENTER_FRAME事件(这两者的资源消耗我也把握不准,我认为是不用时间触发器更节约资源) 另外,在基本的八方向游戏中由于有组合键的问题,而且人物移动的方向将影响到人物表现,所以我们采用了这样的方案 下面是改良后的8方向移动的代码,涉及倒组合键的判断,抛砖引玉,请高手优化指教。 package{
/** by深闪 键盘控制 8 1 2 \ | / 7- X - 3 / | \ 6 5 4 **/ import flash.display.* import flash.display.InteractiveObject; import flash.events.KeyboardEvent; import flash.events.Event; public class KeyListener extends MovieClip{ private static var current_stage:InteractiveObject; private static var key:Array; private static var dir:uint; private static var eventHandler:Function; public static function init(io:InteractiveObject,keyfun:Function){ current_stage=io; eventHandler=keyfun; key=new Array(false,false,false,false); current_stage.addEventListener(KeyboardEvent.KEY_DOWN,keydownHandler); current_stage.addEventListener(KeyboardEvent.KEY_UP,keyupHandler); } private static function keydownHandler(e:KeyboardEvent):void { switch (e.keyCode) { case 38 : key[0]=true; break; case 39 : key[1]=true; break; case 40 : key[2]=true; break; case 37 : key[3]=true; break; default : break; } current_stage.addEventListener(Event.ENTER_FRAME,eventHandler); } private static function keyupHandler(e:KeyboardEvent):void { switch (e.keyCode) { case 38 : key[0]=false; break; case 39 : key[1]=false; break; case 40 : key[2]=false; break; case 37 : key[3]=false; break; default : break; } !key[0]&&!key[1]&&!key[2]&&!key[3]&&(current_stage.removeEventListener(Event.ENTER_FRAME,eventHandler)); } //返回方向 public static function getDirection():uint{ key[0]&&(dir=1); key[1]&&(dir=3); key[2]&&(dir=5); key[3]&&(dir=7); key[0]&&key[1]&&(dir=2); key[1]&&key[2]&&(dir=4); key[2]&&key[3]&&(dir=6); key[3]&&key[0]&&(dir=8); return dir; } } } 使用方法: KeyListener.init(stage,eventHandler); function eventHandler(e:Event):void{ //使用的时候这里加个判断就可以根据不同方向进行不同操作了 trace(KeyListener.getDirection()); }
|
|
| 文章如果有错误或者缺少文件,请发邮件提交给我们 |
|
|
|
|
|
|
| >>> 最新评论:(共有 0 位网友发表了评论) 查看所有评论 |
|
|
| 发表评论 |
|
| ·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂 |
| ·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任 |
| ·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据 |
| ·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为 |
|
|
|
 |
教程分类 |
|
|
|
|
|
|