cocos2d v3 for mac keyboard 입력 패치
* 그냥 급하게 지원하게 코드만 수정한 버전입니다. 공식 버전에서 곧 지원될때 까지만 사용 바랍니다. 전체 코드를 몰라서 그냥 후다닥 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 (!_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 keyUp:theEvent];
}
}
이렇게 하고 키 이벤트를 받게 하고 빌드를 해서 실행을 하면 화면을 한 번 클릭을 하고 나서는 키 이벤트를 잘 받는데 클릭 전에는 이벤트를 받지 못합니다. 클릭을 한번 하면 GLView에서 이벤트를 받는데 그전에는 NSWindow에서 받아서 그런가 봅니다. 그래서 꼼수를 살짝.
AppDelegate.m 에서 아래와 같이 코드를 추가합니다. 걍 GLView에 한번 키 다운을 해주는 겁니다. ...
[_glView keyDown:nil];
이렇게 하면 다음 키 다운&업 이벤트를 잘 받습니다.
프로젝트 내에서 소스 코드를 수정하면 매번 프로젝트 생성때 마다 수정을 해줘야 하니..
~/Library/Developer/Xcode/Templates/ 디렉토리에서 위 파일에 맞는 곳을 찾아서 수정을 하면 기본 템플릿으로 설정이 됩니다.