2017-01-25 4 views
-1

Я был looking for этот ответ и не повезло. One place I looked на самом деле имел очень обескураживающий ответ: «Вы не можете форсировать мыши или события клавиатуры - им нужно приходить с мыши или клавиатуры».as3 Как отправить конкретное событие клавиатуры

Да?

Я попробовал «перебор» и придумал это решение. Может быть, я буду делать это неправильно или глупо; Есть ли способ лучше?

У меня было событие клавиатуры, которое запустило класс и захотелось поставить спрайт на сцену, который инициировал бы это же действие - нажатие на спрайт запустило бы клавиатурное событие (Escape key).

В функции EventListener я traced это событие е сам:

private function keys(e:KeyboardEvent):void { 
     trace("EscapeKey: ",e); 
     if (e.keyCode == 27) { 
     ...  
     } 
    } 

Выход был

EscapeKey: [KeyboardEvent type="keyDown" bubbles=true cancelable=false eventPhase=2 charCode=27 keyCode=27 keyLocation=0 ctrlKey=false altKey=false shiftKey=false]  

Я тогда был слушатель Mouseclick создать и послать новую KeyboardEvent, используя значения Я получил от вышеуказанного следа:

private function pauseClick(e:MouseEvent):void { 
     var a:KeyboardEvent = new KeyboardEvent("keyDown", true, false, 27, 27, 0, false, false, false); 
     stage.dispatchEvent(a); 
    } 

Presto!
Надеюсь, это сообщение пригодится другим, которые ищут подобные сокращения мышь/клавиатуры.

EDIT --- Полный пример класса просил в комментариях:

package{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.KeyboardEvent; 

    public class KeyboardMouse extends Sprite { 
     private var pauseInfo:PauseInfo; 

     private var escapeKey:EscapeKey; 

     public function KeyboardMouse() { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      stage.addEventListener(KeyboardEvent.KEY_DOWN, keys); 

      escapeKey = new EscapeKey(); 
      stage.addChild(escapeKey); 

      pauseInfo = new PauseInfo(); 
      pauseInfo.x = stage.stageWidth; 
      pauseInfo.y = stage.stageHeight; 
      pauseInfo.addEventListener(MouseEvent.CLICK,pauseClick); 
      addChild(pauseInfo); 
     } 

     private function keys(e:KeyboardEvent):void { 
      trace("KeyboardEvent ",e); 
      if (e.keyCode == 27) { // esc key 
       if (stage.contains(escapeKey)){ 
        trace("remove escape"); 
        escapeKey.visible = false; 
       } 
       else { 
        trace("show escape"); 
        escapeKey.visible = true; 
       } 
      } 
     } 

     private function pauseClick(e:MouseEvent):void { 
     // The trace in 'keys' gives this: 
     //[KeyboardEvent type="keyDown" bubbles=true cancelable=false eventPhase=2 charCode=27 keyCode=27 keyLocation=0 ctrlKey=false altKey=false shiftKey=false]  

      var a:KeyboardEvent = new KeyboardEvent("keyDown", true, false, 27, 27, 0, false, false, false); 
      stage.dispatchEvent(a); 
     } 
    } 
} 
+0

Очень интересно, и немного непонятно. Не могли бы вы показать короткую, простую, но полную программу, демонстрирующую эту «избыточность»? – Craig

+0

Интересно! Я всегда использовал общую функцию, например 'pause()', и тогда у меня было бы несколько eventlisteners, вызывающих эту функцию. Мне кажется, что все, что плавает на лодке, мне легче. –

+0

@Craig Я думаю, это было бы так, если вы хотите, чтобы игра приостанавливалась (например), когда игрок нажимает кнопку паузы, а также когда мышь выкатывается из окна, а также когда игрок нажимает клавишу P. Для этого требуется 3 разных прослушивателя событий. Таким образом, OP имеет ключевое нажатие на одно рабочее место и выяснил способ вызова этого же события из другого слушателя событий. Я думаю, что гораздо проще просто, чтобы все eventlisteners просто вызывали одну и ту же функцию pause(); –

ответ

0

+1 и большой реквизит @ Нил Дэвис за его комментарии!

Как он предполагает, имея один слушателя для обоего событий с аргументом (е: Event) является экологически чистым, менее замысловатым способом достижения того же результата:

pauseInfo.addEventListener(MouseEvent.CLICK,keys); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keys); 

    private function keys(e:Event):void { 
     trace("EscapeKey: ",e); 
     if (e.keyCode == 27) { 
     ...  
     } 
    } 

Оба слушатели должны быть все еще в какой-то момент удаляется, хотя, конечно, только одна функция прослушивателя работает с обоими, конечно!

0

Хорошо, теперь я получаю это. Я просто не понимаю его цели. Также есть, я думаю, раздражающая ошибка в коде.

Во-первых: вы показали, что вы можете «отличить» один тип события (например, MouseEvent) как другой (KeyboardEvent). Но у вас все еще есть функция прослушивания, зарегистрированная для каждого типа события (который в какой-то момент вам нужно будет удалить для целей управления памятью) и недавно отправленное событие, так что вы точно не минимизируете код. Что, собственно, значение этого трюка? Почему бы просто не зарегистрировать одну функцию прослушивателя с несколькими типами событий? В рамках этой функции вы можете различать типы событий и делать такие вещи, соответственно, например, с линией, как это:

 if(e.type == 'keyDown' || e.type == 'click') 

Второе: вы говорите: если (stage.contains (escapeKey)), а затем вы пытаетесь чтобы свойство «видимого» escapeKey зависело от этого. Но, создав escapeKey.visible = false, вы не меняете тот факт, что на этапе все еще есть escapeKey. Таким образом, escapeKey никогда не станет видимым снова, потому что условие «else» не существует. Я считаю, что вы хотите сказать, «RemoveChild (escapeKey)», а затем «AddChild (escapeKey)» вместо установки «escapeKey.visible = ложь», а затем «escapeKey.visible = истинный». Тогда вы маленькая программа делает то, что я думаю, вы хотите.

+0

«Видимость» была просто (плохим) примером того, как делать вещи, когда был нажат побег. Я мог бы просто написать «...» или «// сделать что-то здесь». Причина, по которой я придумал это решение ** вообще **, заключается в том, что я не мог найти, как имитировать нажатие клавиши. У меня создалось впечатление, что MouseEvent должен обрабатываться с аргументом e: MouseEvent и KeyboardEvent, который обрабатывается с помощью e: KeyboardEvent. Обработка обоих событий с помощью e: Событие в одной функции - это ответ на мой * актуальный вопрос: «есть ли лучший способ?» – Chowzen

Смежные вопросы