v3 미만 버전에서는 다른 방법이 필요했지만, v3에서는 좀 더 편하게 CCSpriete의 이미지 변경을 지원한다. 


기존 CCSprite에서 spriteFrame만 CCSpriteFrame으로 변경해주면 된다. 


self.gameOverPanel.spriteFrame = [CCSpriteFrame frameWithImageNamed:@"LevelComplete.png"];


저작자 표시 비영리
신고
Posted by KraZYeom

하나의 프로젝트에서 여러개의 플랫폼용으로 빌드 할 때, 아래 코드를 잘 조합해서 하면 하나의 소스로 여러개의 플렛폼으로 빌드를 할 수 있다. 


간단하게 설명.

1. workspace를 만든다. 

2. cocos2d iOS Project를 만든다. Add to, Group(처음 생성하는 프로젝트면 없을 수도 있다) 위치를 workspace root로 정한다. 



3. cocos2d Mac Project를 만든다. Add to, Group 위치를 workspace root로 정한다.  

4. 하나의 프로젝트에서 소스를 생성하고 다른 프로젝트로 옮길 때는 Project > Target > Build Phases > Compile Sources > + > Add Other ... > 원하는 소스코드 추가

(그냥 드래그 앤 드롭으로 하면 에러 남)

5. 소스 코드 외 컴파일 되지 않는 파일은 그냥 드래그 앤 드롭으로 하면 된다. copy는 하지 말고. 


그리고 소스 내부에는 아래 코드를 참조해서 apportable 용, iOS용, Mac 용을 구분해서 구현하면 된다. 


#ifdef ANDROID

#elif defined(__CC_PLATFORM_IOS)

#elif defined(__CC_PLATFORM_MAC)

#endif


저작자 표시 비영리
신고
Posted by KraZYeom

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


어쩌다 보니 제 코드를 pull request 했더니 merge 되었네요. 

https://github.com/cocos2d/cocos2d-iphone/commit/1caaec05b967160c342fa92a9033909ab11f6edb


v3 rc2에서는 풀스크린을 하면 전체 확대가 안되었습니다. 이런 문제를 rc3에서 해결했는데 이것 때문에 다른 버그가 생겨버렸습니다.

cocos2d v3 rc 3에서 레니타 맥에 대한 패치가 있었는데요. 풀스크린상에는 문제가 없는데 작은 화면상에서는 화면이 2배 확대되어 나오는 버그가 발생합니다. 


CCDirector.m에서 아래와 같이 변경하면 됩니다.

-(void) setView:(CCGLView*)view{

...

{ // set size

CGSize size = CCNSSizeToCGSize(__view.bounds.size);

#ifdef __CC_PLATFORM_IOS

CGFloat scale = __view.layer.contentsScale ?: 1.0;

#else

self.view.wantsBestResolutionOpenGLSurface = YES// 이 부분 주석을 풀어줘야 함

CGFloat scale = self.view.window.backingScaleFactor;

#endif


CCDirectorMac.m에서 아래와 같이 추가하면 됩니다. 

- (void) setFullScreen:(BOOL)fullscreen {

...

    if( fullscreen ) {

...
        self.view.wantsBestResolutionOpenGLSurface = NO;

    } else {

...

       self.view.wantsBestResolutionOpenGLSurface = YES;

    }

...
}



저작자 표시 비영리
신고
Posted by KraZYeom


* 그냥 급하게 지원하게 코드만 수정한 버전입니다. 공식 버전에서 곧 지원될때 까지만 사용 바랍니다. 전체 코드를 몰라서 그냥 후다닥 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/ 디렉토리에서 위 파일에 맞는 곳을 찾아서 수정을 하면 기본 템플릿으로 설정이 됩니다. 

저작자 표시 비영리
신고
Posted by KraZYeom

cocos2d v3에는 기본적으로 Chimpunk가 내장되어 있다. 충돌을 했을 때 이벤트 처리를 하기 위해서 이리저리 삽질하다가 알아낸 결과. 이상하게 구글링을 해도 제대로된게 안나온다. 


헤더 파일에 자세하게 나와있는데 감이 안오다가. 구현하고 나서 헤더 파일을 보니 이제야 알겠음.


physicsBody에서 collisionGroup이 같으면 같은놈으로 취급하여 충돌시키지 않는다. 반대로 생각해서 계속해서 통과해서 오랜시간 삽질. 기본적으로 nil값으로 무조건 충돌시킨다. 


가장중요한건 collisionType. collisionType 에 부여된 이름에 따라서 delegate에서 호출하는 메소드 명이 달라진다. 여기서도 오랜시간 삽질. 기본값은 default 이다. 하지만 ccPhysicsCollisionBegin:typeA:typeB로 되어 있어서 삽질. 

ccPhysicsCollisionBegin:default:default 로 변경을 하거나 아니면 collisionType 에 부여된 이름처럼 아래와 같이 메소드 명을 변경한다. 



@interface GameScene : CCScene <CCPhysicsCollisionDelegate>


  _physics.collisionDelegate = self;


  water.physicsBody.collisionType = @"water";

  leap.physicsBody.collisionType = @"leap";

  frog.physicsBody.collisionType = @"frog";


-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair typeA:(CCNode *)nodeA typeB:(CCNode *)nodeB{

  return YES;

}



-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair water:(CCNode *)nodeA frog:(CCNode *)nodeB{

  CCLOG(@"collison frog");

  return YES;

}


-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair frog:(CCNode *)nodeA leap:(CCNode *)nodeB{

  CCLOG(@"collison leap");

//  [nodeB removeFromParent];

  return YES;

}




이건 헤더 파일의 일부분. 

/**

 *  Is this body a sensor? A sensor will call a collision delegate but does not physically cause collisions between bodies.

 *  Defaults to NO.

 */

@property(nonatomicassignBOOL sensor;


/**

 *  The body's collisionGroup, if two physics bodies share the same group id, they don't collide. Defaults to nil.

 */

@property(nonatomicassignid collisionGroup;


/**

 *  A string that identifies the collision pair delegate method that should be called. Default value is @"default".

 */

@property(nonatomiccopyNSString *collisionType;


/**

 *  An array of NSString category names of which this physics body is a member. Up to 32 unique categories can be used in a single physics node.

 *  A value of nil means that a body exists in all possible collision categories.

 *  The deefault is nil.

 */

@property(nonatomiccopyNSArray *collisionCategories;


/**

 *  An array of NSString category names that this physics body wants to collide with.

 *  The categories/masks of both bodies must agree for a collision to occur.

 *  A value of nil means that this body will collide with a body in any category.

 *  The default is nil.

 */

@property(nonatomiccopyNSArray *collisionMask;



저작자 표시 비영리
신고
Posted by KraZYeom