无停顿的键盘控制方法

本文探讨了在游戏开发中实现快速、精准的键盘响应技术,通过改进传统的键盘监听方式,采用静态变量来记录按键状态,实现了更流畅的游戏体验。具体介绍了如何通过声明变量在按键按下时设置为true,在释放时重置为false,以此来判断和响应用户的输入,尤其针对八方向移动的精确控制进行了优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做游戏的时候需要用到响应键盘行为。一般的单纯键盘侦听可能不能满足我们的使用。先放个普通的键盘侦听。

package

{

        import flash.display.Sprite;

        import flash.events.KeyboardEvent;

        public class commomKeyboard extends Sprite

        {

                public function commomKeyboard()

                {

                        stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);

                }

              private function onKeyDown(evt:KeyboardEvent):void{

                       trace(evt.keyCode);

               }

        }

}

复制代码那是很直接地检测按下什么键,抬起什么键。

       但注意了,像这样单纯的键盘侦听,当按键不松开的话,不会立刻连续响应。会像我们在聊天窗口或者其他输入栏一样,先出现一个,然后停顿一会,才会连续出现。就像上面的trace语句,先是输出一个keyCode,然后稍微停顿,再连续输出。

       为什么呢,因为这是系统的行为,为了防止人们使用键盘时多按了,而这样键盘侦听,也是直接侦听系统键盘信息。所以就会出现这种情况。

       这样的话做一些游戏会感到很不爽,好像角色不能迅速响应。最要命的是,这样的侦听不能八方向移动。

       怎么解决呢?只要我们稍微绕一下。例如,声明一个变量,当侦听的键值Down时,变量为true,否则为false。然后在人物那里判断那个变量是否为true就行了。

Control类代码如下。

package

 

{      import flash.display.Sprite;

        import flash.display.Stage;

        import flash.events.Event;

        import flash.events.KeyboardEvent;

        public class Control extends Sprite

        {

                private static var code:uint;

                private static var KeyAry:Array = new Array();

                public static function init(stage:Stage):void

               {

                        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

                        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

                }       

               private static function onKeyDown(evt:KeyboardEvent):void

                {

                       code = evt.keyCode;

                       trace("按下了" + code);

                       KeyAry[code] = true;

                }

               private static function onKeyUp(evt:KeyboardEvent) :void

                {

                        KeyAry = [];//全部设置为FALSE,这样的目的是为了防止同时按下两个键的时候,最后只置了一个键位FALSE

                }

                public static function isDown(KeyCode:uint):Boolean

                {

                        return KeyAry[KeyCode] == true;

                }

        }

}

       复制代码全场都是静态函数。稍微分析一下吧。声明了codeuint类型(其实这个可有可无),和KeyAry数组

       当键盘按下时,KeyAry数组的第键盘码个元素(= =)就被赋值为true,然后在isDown处返回那个元素是否为true

       在另一边,角色就得到那个元素是否为true了。

       代码如下。

package

 

{

        import flash.display.Graphics;

        import flash.display.Shape;

        import flash.display.Sprite;

        import flash.events.Event;

        public class rectObj extends Sprite

        {

                private var rect:Shape = new Shape();

                public function rectObj()

                {

                        drawRect();

                        addChild(rect);

                        this.addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

                }

               private function drawRect():void

                {

                       var g:Graphics = rect.graphics;

                       g.beginFill(0xFF0000);

                       g.drawRect(0,0,50,50);

                       g.endFill();

                }

              public function EnterFrameHandler(evt:Event):void

              {

                       //w-87,s-83,a-65,d-68

                      if(Control.isDown(87)) rect.y -= 5;

                      if(Control.isDown(83)) rect.y += 5;

                      if(Control.isDown(65)) rect.x -= 5;

                      if(Control.isDown(68)) rect.x +=5;

           }

      }

}

复制代码在EnterFrame里判断键盘是否被按下。不断调用Control类的isDown函数返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值