0

我有一个方向和一个冲刺按钮。我想要发生的是:按住冲刺按钮时,玩家的移动速度是原来的两倍。然后当释放冲刺按钮时,玩家应该继续以正常速度行走。发生的情况是当释放冲刺按钮时,即使方向按钮仍被按住,玩家也会停止。

public function addControllerListeners(){
        controller.leftButton.addEventListener(TouchEvent.TOUCH_ROLL_OVER, moveCharLeft);
        controller.leftButton.addEventListener(TouchEvent.TOUCH_BEGIN, moveCharLeft);
        controller.leftButton.addEventListener(TouchEvent.TOUCH_END, playerStop);
        controller.leftButton.addEventListener(TouchEvent.TOUCH_OUT, playerStop);
        controller.leftButton.addEventListener(TouchEvent.TOUCH_ROLL_OUT, playerStop);

        sprintButton.addEventListener(TouchEvent.TOUCH_ROLL_OVER, playerSprint);
        sprintButton.addEventListener(TouchEvent.TOUCH_BEGIN, playerSprint);
        sprintButton.addEventListener(TouchEvent.TOUCH_END, playerStopSprint);
        sprintButton.addEventListener(TouchEvent.TOUCH_OUT, playerStopSprint);
        sprintButton.addEventListener(TouchEvent.TOUCH_ROLL_OUT, playerStopSprint);
}

public function playerSprint(e:Event = null) {
        playerChar.sprint = true;
        trace("Player Sprint");
}
public function playerStopSprint(e:Event = null) {
        playerChar.sprint = false;
        trace("stopSprinting");
}
public function moveCharLeft(event:TouchEvent):void{
        playerChar.setWalk("left");
}
public function playerStop(event:TouchEvent):void {
        var target:String = event.target.name;
        if(target == "upButton" || target == "rightButton" || target == "downButton" || target == "leftButton"){
            trace("Player Stopped from: " + event.target.name + " - " + event.currentTarget.name);
            playerChar.direction = "idle";
        }
    }

停止播放器功能中的跟踪表明目标名称是按住的控制器按钮。即使被释放的按钮是冲刺按钮。

如果它有助于在舞台上添加按钮。我不认为这应该有所作为,但你永远不知道。

4

1 回答 1

1

事件(触摸)不是持久的。当一个事件触发时,它就完成了,您必须轮询下一个触发事件。自动重复是操作系统的一项功能,并且(通常)会被另一个类似事件打断(我认为第二次触摸将停止第一次)。

使用一个标志来指示是否满足某个条件。您必须手动打开和关闭此布尔值,但它能够跟踪您需要知道的内容。(在此 SO 评论中可以找到类似的示例:https ://stackoverflow.com/a/7976038/516537 。这恰好适用于可以重复并与其他键盘事件共存的键盘事件,但您可以请参阅标志的使用。)因此,请收听您的事件,但也要:

  1. 当条件变为活动状态时标记。
  2. 当条件变为非活动状态时标记关闭。
  3. 检查多个标志是否打开以激活复杂条件。

您获得的是事件的持久性。如果TOUCH_BEGIN触发(或其他开始)事件,但没有触发TOUCH_END(或其他结束)事件,则标志将是您知道触摸事件仍然存在的方式。

所有这一切的警告是,您将不得不以稍微不同的方式轮询事件。您必须添加一个Event.ENTER_FRAME事件侦听器以继续检查哪些事件仍然处于活动状态。

HTH。

于 2012-04-23T03:55:07.873 回答