【问题标题】:In Flash Actionscript 3.0 how do I create smooth keyboard controls for player movement?在 Flash Actionscript 3.0 中,如何为玩家移动创建流畅的键盘控件?
【发布时间】:2011-01-16 08:10:18
【问题描述】:

我是 Flash Actionscript 3.0 编程的初学者。我正在尝试为游戏中的玩家移动创建流畅的键盘控制。

我目前正在使用 addEventListener(KeyboardEvent.KEY_DOWN) 监听键盘按键,然后在处理程序函数中通过将数字添加到其 .x 或 .y 属性来移动图形。

这会在开始时产生缓慢而缓慢的混蛋。我知道有一种更流畅、更灵敏的方式来做到这一点,但不知道从哪里开始。任何帮助将不胜感激!

【问题讨论】:

    标签: actionscript-3 flash-cs3


    【解决方案1】:

    对于平滑键,我建议使用 Timer 或 onEnterFrame 经常轮询键以获得平滑控制。它会完成工作,但要付出一定的代价。如果您的其余逻辑都很好,那么这应该可以:

    var key:int = NaN;
    
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true);
    this.addEventListener(Event.ENTER_FRAME,update,false,0,true);
    
    function onKeyPress(event:KeyboardEvent):void {
        key = event.keyCode;
        event.stopPropagation();
    }
    function onKeyRelease(event:KeyboardEvent):void {
        key = NaN;
        event.stopPropagation();
    }
    function update(event:Event):void{
        if(key) trace(key);
    }
    

    我通过阻止它的传播来确保事件不会冒泡,并且它被设置在应该是最顶层的舞台上,事件明智。另外我只使用了键,否则我会在 enterFrame 处理程序中忽略它。

    HTH, 乔治

    【讨论】:

    • 这样做。需要明确的是,提问者版本的问题是,您仅在实际按下某个键时才移动,因此当您第一次按下该键时它会移动一次,然后仅在操作系统开始发出重复事件时进一步移动,因为键被按住。你不希望角色移动一个键被按下,你希望它在帧更新一个键被按下时移动,所以移动应该发生在ENTER_FRAME 处理程序,而不是按键处理程序。
    【解决方案2】:

    你把监听器放在哪里?它是在应用程序中,还是在应该移动的精灵中?按键时精灵有焦点吗?

    另外,在添加事件侦听器时,您是否使用捕获?也就是说,您是否将第三个参数设置为 true,如

    addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)
    

    如果您使用捕获,如果应用程序本身正在侦听事件,您必须这样做,那么您将获得一定的延迟,并且接口越复杂,延迟会越大。如果这些事件必须在一个巨大的层次结构中上升,这可能会很明显。如果有很多精灵,这会加剧问题。

    您可以做的是让具有焦点的精灵调度一个自定义事件,控制器类为每个精灵侦听该事件。控制器类将有一个处理程序来移动 event.currentTarget 但是您计划完成它。

    还阅读了有关自定义事件以及如何使用 SystemManager 动态添加和删除侦听器的信息:http://livedocs.adobe.com/flex/3/langref/index.html

    【讨论】:

      【解决方案3】:

      最简单的例子就是这个。
      在这里,您有一个可控的 Ship 类(Ship.as)。

      import flash.display.MovieClip;
      import flash.events.KeyboardEvent;
      import flash.events.Event;
      
      public class Ship extends MovieClip {
      
          private var speedX;
          private var speedY;
      
          public function Ship() {
              //constructor
              stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown);
              stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp);
              stage.addEventListener(Event.ENTER_FRAME, update);
          }
      
          public function keyDown(e:KeyboardEvent) {
              if(e.keyCode == 37) {
                  speedX = -5;
              }
              if(e.keyCode == 38) {
                  speedY = -5;
              }
              if(e.keyCode == 39) {
                  speedX = 5;
              }
              if(e.keyCode == 40) {
                  speedY = 5;
              }
          }
      
          public function keyUp(e:KeyboardEvent) {
              if(e.keyCode == 37 || e.keyCode == 39) {
                  speedX = 0;
              }
              if(e.keyCode == 38 || e.keyCode == 40) {
                  speedY = 0;
              }
          }
      
          public function update(e:Event) {
              x += speedX;
              y += speedY;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2013-04-22
        • 2015-03-04
        • 1970-01-01
        相关资源
        最近更新 更多