Cocos2D는 게임을 위한 라이브러리라서 UI관련 컴포넌트들이 상대적으로 부실하다. EAGLView를 지원하므로 UIKit을 함께 쓸 수 있지만. 간단한 UI만 필요한 경우에 굳이 UIKit을 함께 쓰는 것도 그다지 추천할 만한 방법은 아니다.

왜냐하면 UIKit을 함께 쓸경우 잠재적인 버그가 나타날 위험이 있기 때문이다. Cocos2D는 3rd Party 라이브러리 이므로 iOS 업데이트 후에 UIKit 연동에 문제가 생길 확률이 상당히 높다. 예를 들면 iOS5에서 iPad의 경우키보드 스플릿을 지원하게 되었는데 EAGLView에서 UITextField를 사용하고 키보드가 보일때 스플릿 해보면 프리징되면 스플릿이 동작하지 않는다.


COCOS2D에서 지원하는 메뉴 CCMenu는 Touchupinside 이벤트를 지원한다. 터치스크린에서 손이 떨어질 때 이벤트가 발생한다. 

하지만,  다양한 이유(슬라이드 버튼,확장메뉴,즉시 응답이 필요한 경우)로 인해 Touchdown이 필요한 경우가 있다.
TouchDown 이벤트를 지원하는 버튼은 CCSprite를 이용해 만들수도 있고 CCMenu를 상속받아서 CustomCCmenu를 만들 수도 있다.

그 중 CCMenu를 상속하여 TouchDown 이벤트를 지원하는 방법을 소개한다


CCTouchDownMenu.h

//
// CustomCCMenu.h
// MyName
//
// Created by Uzys on 12. 1. 31..
// Copyright 2012 Uzys. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface CCTouchDownMenu : CCMenu {
}
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@end


CCTouchDownMenu.m

//
// CustomCCMenu.m
// MyName
//
// Created by Uzys on 12. 1. 31..
// Copyright 2012 Uzys. All rights reserved.
//
#import "CCTouchDownMenu.h"

@implementation CCTouchDownMenu

-(CCMenuItem *) itemForTouch: (UITouch *) touch
{
CGPoint touchLocation = [touch locationInView: [touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];

CCMenuItem* item;
CCARRAY_FOREACH(children_, item){
// ignore invisible and disabled items: issue #779, #866
if ( [item visible] && [item isEnabled] ) {
CGPoint local = [item convertToNodeSpace:touchLocation];
CGRect r = [item rect];
r.origin = CGPointZero;
if( CGRectContainsPoint( r, local ) )
return item;
}
}
return nil;
}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
if( state_ != kCCMenuStateWaiting || !visible_ )
return NO;

for( CCNode *c = self.parent; c != nil; c = c.parent )
if( c.visible == NO )
return NO;
selectedItem_ = [self itemForTouch:touch];
[selectedItem_ selected];

if( selectedItem_ ) {

        [selectedItem_ unselected];
        [selectedItem_ activate];
        state_ = kCCMenuStateWaiting;
return NO;
}
return NO;
}
@end



CCTouchDownMenu 예제의 경우는 해당링크에서 다운로드 받을 수 있다. 
https://github.com/uzysjung/CCTouchDownMenu

저작자 표시 비영리 변경 금지
신고


티스토리 툴바