iDev/Cocos2D

cocos2d v3 for mac keyboard 입력 패치

KraZYeom 2014. 3. 5. 07:58
반응형


* 그냥 급하게 지원하게 코드만 수정한 버전입니다. 공식 버전에서 곧 지원될때 까지만 사용 바랍니다. 전체 코드를 몰라서 그냥 후다닥 Copy&Paste로 지원 가능하게만 했은 성능상에 문제가 있을 수도 있습니다. 



v2까지는 키보드 델리게이트를 사용해서 잘 먹었는데, 왜 v3에서는 빠졌는지 모르겠습니다. 추후 버전에서 지원이 될 거라고 생각합니다. Mac 에서는 기본적으로 키보드 게임이 어울리니까요. 


기본 템플레이트 파일을 빌드해서 키보드를 누르면 '딩' '딩' 소리만 스피커에서 나옵니다. 키 이벤트를 못 받는다는 소리라고 하네요. NSWindow에서 입력을 처리 하도록 할려니 잘 모르겠습니다. 그래서 cocos2d를 까니 mouse&touch 핸들러가 있어서 살짝 수정했습니다. 


CCGLView.m 파일 아래 쯤에 추가.

- (void) keyDown:(NSEvent *)theEvent {

  [[CCDirector sharedDirector].responderManager keyDown:theEvent];

}


- (void) keyUp:(NSEvent *)theEvent {

  [[CCDirector sharedDirector].responderManager keyUp:theEvent];

}



CCResponder.h 파일 아래 쯤에 추가.

- (void)keyDown:(NSEvent *)theEvent;

- (void)keyUp:(NSEvent *)theEvent;


CCResponder.m 파일 아래 쯤에 추가.

-(void)keyDown:(NSEvent *)theEvent{

  [[CCDirector sharedDirector].responderManager discardCurrentEvent];

}

-(void)keyUp:(NSEvent *)theEvent{

  [[CCDirector sharedDirector].responderManager discardCurrentEvent];

}


CCResponderManager.m 파일 아래 쯤에 추가. // 이 부분이 가장 난해해서 걍 적당히 소스를 고쳐서 사용했습니다. 

- (void)keyDown:(NSEvent *)theEvent{

  if (!_enabled) return;

  [[CCDirector sharedDirector].view.window makeFirstResponder:[CCDirector sharedDirector].view];


  if (_dirty) [self buildResponderList];

  

  // scan backwards through mouse responders

  for (int index = _responderListCount - 1; index >= 0; index --)

  {

    CCNode *node = _responderList[index];

    [node keyDown:theEvent];

  }

}


- (void)keyUp:(NSEvent *)theEvent{

  if (!_enabledreturn;

  [[CCDirector sharedDirector].view.window makeFirstResponder:[CCDirector sharedDirector].view];


  if (_dirty) [self buildResponderList];

  

  // scan backwards through mouse responders

  for (int index = _responderListCount - 1; index >= 0; index --)

  {

    CCNode *node = _responderList[index];

    [node keyUp:theEvent];

  }

}


이렇게 하고 키 이벤트를 받게 하고 빌드를 해서 실행을 하면 화면을 한 번 클릭을 하고 나서는 키 이벤트를 잘 받는데 클릭 전에는 이벤트를 받지 못합니다. 클릭을 한번 하면 GLView에서 이벤트를 받는데 그전에는 NSWindow에서 받아서 그런가 봅니다. 그래서 꼼수를 살짝.


AppDelegate.m 에서 아래와 같이 코드를 추가합니다. 걍 GLView에 한번 키 다운을 해주는 겁니다. ... 

  [_glView keyDown:nil];


이렇게 하면 다음 키 다운&업 이벤트를 잘 받습니다.


프로젝트 내에서 소스 코드를 수정하면 매번 프로젝트 생성때 마다 수정을 해줘야 하니.. 

~/Library/Developer/Xcode/Templates/ 디렉토리에서 위 파일에 맞는 곳을 찾아서 수정을 하면 기본 템플릿으로 설정이 됩니다. 

반응형