闪无忧
 
首 页 业界新闻 业界杂谈 Flash教程 Flash源码 Flash图书 Flash酷站 Flex & AIR 供求信息
   本栏目通告:   有意向写收费精品教程的朋友,请联系本站合作
当前位置 :首页>flash教程>Flash应用开发>列表

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 _transferobjectisplayObject=_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(objisplayObject){
  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());
}

文章如果有错误或者缺少文件,请发邮件提交给我们
上一篇:45度地图编辑器及游戏开发心得
下一篇:Flash 批量上传文件两个比较靠谱的组件
>>> 最新评论:(共有 0 位网友发表了评论)      查看所有评论
  发表评论
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
  教程分类
  基础操作   动画特效
  应用开发   组件学习
  As程序   动画教程
  Flash cs3   AS 3.0
  FCS/FMS教程   Loading教程
  Flash与Web   Flash教程连载
  Flash 3d
  相关文章
·制作rpg风格的文本系统flash造
·使用共享对象实现静音/取消静音
·rpg风格的文本系统游戏制作
·Flash导入MP3时读取文件出现的问
·Flash游戏人工智能-峰会PPT
·Flash CS5开发AIR2与C语言通信的
·用As侦测鼠标的方位
·制作横向滑动的flash导航菜单制
·Flash游戏开发经验提纲分享
·Flash平台处理zip文件Working wi
  热门文章
·Flash进度条的制作详细讲解(组图)
·Flex 3 AdvancedDataGrid的使用(第二
·全Flash动画网站实现的基础教学
·FLASH+XML相册(附源码)
·FLV播放器汇总
·flash幻灯片网页效果
·超酷flash光晕移动效果
·Flash打造简单的飘雪动画视觉特效
·flash水影效果字
·flash春雷闪电效果
·Flash制作大雪纷飞效果动画
关于我们 - 免责声明 - 网站地图 - 商务服务 - 联系我们 - RSS地图
©CopyRight 2006-2008, 5UFlash.COM, Inc. All Rights Reserved
鲁ICP备06034971号