2011-04-22 4 views
2

그래서 여기 내 설정이다 :AS3의 KeyboardEvents

내 문서 클래스가 Main.as (가 MovieClip을 확장)이다가. 다음 코드는 내 Main.as에 있습니다. 내 클래스 정의에 모든 변수를 선언 한

: 생성자

private var holder:MovieClip; 
private var leftButton:SimpleButton; 
private var rightButton:SimpleButton; 

...

holder = new MovieClip(); 
addChild(holder); 
holder.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent); 

leftButton = new Arrow(); 
rightButton = new Arrow(); 

holder.addChild(leftButton); 
holder.addChild(rightButton); 

leftButton.x = 50; 
leftButton.rotation = 180; 
rightButton.x = 150; 

leftButton.y = rightButton.y = 50; 

leftButton.addEventListener(MouseEvent.CLICK, handlePaging); 
rightButton.addEventListener(MouseEvent.CLICK, handlePaging); 

... 생성자의 외부 ...

public function handleKeyboardEvent (e:KeyboardEvent) { 
      trace("got a keyboard event"); 

       trace("e.charCode : " + e.charCode); 
       trace("e.keyCode : " + e.keyCode); 
       switch (e.keyCode) { 
        case 37: //left arrow 
         showPreviousMoment(); 
         break; 
        case 39: //right arrow 
         showNextMoment(); 
         break; 
       } 


     } 

두 개의 버튼은 내가 가지고있는 Arrow 무비 클립의 인스턴스입니다. Arrow 무비 클립에는 그래픽이 들어 있습니다 (기본 클래스는 flash.display.SimpleButton이라는 속성 대화 상자에서 나타납니다).

사용자가 화면 화살표를 누르거나 키보드 화살표 키를 눌러 앞으로 및 뒤로 이동할 수 있기를 원합니다.

그래서 ... 동영상을 테스트하거나 앱으로 게시 할 때 왼쪽 및 오른쪽 키보드 키를 눌러도 아무런 변화가 없습니다. 그러나 ... 화면 화살표를 클릭 한 후 키보드 이벤트가 나타납니다 !!! 처음에 키보드 이벤트가 수신되지 않는 이유는 무엇입니까? 화면 버튼을 클릭하면 '보유자'가 이벤트를 받기 시작하는 이유는 무엇입니까?

UPDATE는

또한 바로이 '홀더'인스턴스와 청취자를 추가하는 경우를 제외하고 내 모든 코드를 주석 처리했습니다. 홀더에서 KeyboardEvents를들을 수 없습니다.

UPDATE ... 답변

그래서 나는 내가 KeyboardEvent입니다들을 전체적으로하려는 경우, 나는 청취자로서 무대를 등록해야합니다 것을 알아 냈다. 그래서 이것은 속임수를 썼는지 :

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent); 

콜린 모악의 책에서 정보 : 응용 프로그램 전체 명령 은 일반적으로 플레이어의 플래시 에 등록 청취자에 의해, 전 세계적으로 처리되는 트리거

키보드 입력 이벤트 스테이지 인스턴스. 반대로 특정 인터페이스 요소 응답 을 트리거하는 키보드 입력 이벤트는 일반적으로 에 현재 키보드 포커스가있는 객체에 등록 된 수신기 인 에 의해 처리됩니다.

내 초기 버전에서 화면상의 화살표 버튼을 클릭했을 때 어떻게 든 키보드 초점을 '홀더'에 부여했습니다.

+1

플래시 무비에서 아무 것도 클릭하지 않고 키보드 이벤트가 작동하도록하는 화살표를 클릭 했습니까? 왜냐하면 키보드 이벤트가 작동하기 위해 플래시 창에 집중해야 할 필요가있는 것 같습니다. 플래시 무비 (화살표가 아님)에서 다른 것을 클릭하고 키보드 화살표를 클릭하여 테스트 해보십시오. 이것이 작동하면 코드에 아무런 문제가 없으며 모든 것이 정상적으로 작동한다는 것을 의미합니다. – SimplyZ

+0

포커스 문제가 아니라는 점을 깜빡하고 있습니다. 나는 영화 창의 다른 부분을 클릭했는데 키를 '활성화'하지 않습니다. 화면상의 버튼을 클릭 한 후에 만 ​​... 그러면 키가 활성화됩니다. – milesmeow

+0

handlePaging 함수를 질문에 추가 할 수 있습니까? 어쩌면 키보드 이벤트를 활성화시키는 뭔가가있을 수 있습니다. (단지 야생 추측) – SimplyZ

답변

4

일반적으로 클릭 한 개체가 포커스를 얻습니다. 이는 청취자에게 실제로 영향을 주므로 스테이지에 추가 할 때 작동합니다.

그 중 하나를 클릭하면 "홀더"객체에 포커스가 있으므로 이벤트가 실행됩니다.이제 당신은 그것을 잘하고, 그것을 무대에 추가했습니다.

+0

두 가지 주요 속성은 상호 작용으로 인해 포커스가 변경되는지 여부를 결정합니다. mouseEnabled (false 일 경우)는 마우스 및 키보드 이벤트를 모두 중지합니다. mouseEnabled가 true이면 InteractiveObject 하위 클래스 (TextFields, Sprites, MovieClips 등)를 가정합니다.)는 stage.focus 속성을 통해 수동으로 포커스를 할당 할 수 있습니다. 그러나 기본적으로 "tabEnabled"가 true로 설정되어 있지 않으면 개체 (TextField 및 SimpleButton 제외)는 클릭 할 때 자동으로 포커스를받지 않습니다. buttonMode가 true이면 tabEnabled가 true가됩니다. 요약하면, tabEnabled의 값은 클릭 또는 탭으로 객체 포커스를 지정할 수 있는지 여부를 결정합니다. – Triynko

0

@Ascension Systems 권장 사항을 기반으로 내 자신의 질문에 대한 답변을 게시하고 있습니다. 난 그냥 내 업데이 트에서 위의 내 질문에 복사 해요.

UPDATE ... 답변

그래서 나는 내가 KeyboardEvent입니다들을 전체적으로하려는 경우, 나는 청취자로서 무대를 등록해야합니다 것을 알아 냈다. 그래서 이것은 속임수를 썼는지 :

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent); 

콜린 모악의 책에서 정보 : 응용 프로그램 전체 명령 은 일반적으로 플레이어의 플래시 에 등록 청취자에 의해, 전 세계적으로 처리되는 트리거

키보드 입력 이벤트 스테이지 인스턴스. 반대로 특정 인터페이스 요소 응답 을 트리거하는 키보드 입력 이벤트는 일반적으로 에 현재 키보드 포커스가있는 객체에 등록 된 수신기 인 에 의해 처리됩니다.

내 초기 버전에서 화면상의 화살표 버튼을 클릭했을 때 어떻게 든 키보드 초점을 '홀더'에 부여했습니다.

2

더 역동적 인 해결책은 (예를 들어 동적 인스턴스 A 무비 클립을 포함하는 클래스 경우)는 사용하기 :

stage.focus = this; 

을 그래서 당신은 실제로 키를들을 필요가있는 클래스의 인스턴스에 이벤트 리스너를 적용하는 경우 이벤트가 있으면 더 잘 작동 할 것입니다.

런타임시 주 클래스 인스턴스를 추가 할 때 이전 제안 사항이 작동하지 않았습니다. 결국 내 코드는 다음과 같이 보입니다 :

Main.singletron.stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyDown); 
Main.singletron.stage.focus = this; 

...이 두 줄을 작동 시키려면 싱글 렉론을 설정해야합니다.

+0

싱글 레트 론, 롤. singleTON https://en.wikipedia.org/wiki/Singleton_pattern이어야합니다. – Triynko