Я был 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);
}
}
}
Очень интересно, и немного непонятно. Не могли бы вы показать короткую, простую, но полную программу, демонстрирующую эту «избыточность»? – Craig
Интересно! Я всегда использовал общую функцию, например 'pause()', и тогда у меня было бы несколько eventlisteners, вызывающих эту функцию. Мне кажется, что все, что плавает на лодке, мне легче. –
@Craig Я думаю, это было бы так, если вы хотите, чтобы игра приостанавливалась (например), когда игрок нажимает кнопку паузы, а также когда мышь выкатывается из окна, а также когда игрок нажимает клавишу P. Для этого требуется 3 разных прослушивателя событий. Таким образом, OP имеет ключевое нажатие на одно рабочее место и выяснил способ вызова этого же события из другого слушателя событий. Я думаю, что гораздо проще просто, чтобы все eventlisteners просто вызывали одну и ту же функцию pause(); –