2012-10-22 3 views
0

내가 읽은 튜토리얼의 대부분은 HelloWorld 클래스의 Cocos2D 예제를 설명하지만 간단한 게임을 만들기 시작 했으므로 이벤트를 보내는 방법을 알아야합니다. 다른 클래스에, 그리고 그것이 일어날 때마다 응답하도록합니다.Cocos2D : 서로 다른 클래스간에 이벤트를 보내는 방법

나는 GameSceneLayer, 스프라이트의 내 다른 CCLayers에로드하는 CCLayer 클래스가 있습니다

@implementation GameSceneLayer 
+ (CCScene *)scene { 
    CCScene *scene = [CCScene node]; // Create a container scene instance 
    GameSceneLayer *gameLayer = [GameSceneLayer node]; // Create an instance of the current layer class 
    [scene addChild:gameLayer]; // Add new layer to container scene 
    return scene; // Return ready-made scene and layer in one 
} 
-(id)init 
{ 
self = [super init]; 
if (self != nil) 
{ 
    Background *background = [Background node]; 
    [self addChild:background z:0]; 
    Player *player = [player node]; 
    [self addChild:player z:1]; 
    MainMenu *mainMenu = [MainMenu node]; 
    [self addChild:mainMenu z:2]; 

} 
return self; 
} 
@end 

하지만, 내 MAINMENU CCLayer START 스프라이트을 터치 할 때 나는 플레이어에서 플레이어 스프라이트에 산란을하고 싶습니다를 CCLayer.

나는 같은과 함께 GlobalVariables.h 필요 같은데요은 :

#define gameStart @"0" 

그래서 START 스프라이트가 플레이어 스프라이트 어딘가에 1 gameStart을 변경하고 눌렀을 때이

입니다
if (gameStart == 1) 
{ 
    [self addChild:PLAYER]; 
} 

그러나 PLAYER 스프라이트가 항상 해당 정보를 찾고 있도록 코드를 설정하는 방법을 모르겠습니다.

+0

NSNotifications를 살펴보십시오. 그들은 당신의 상황에서 당신을 도울 수 있습니다. – miho

+0

당신의 싱글 톤 도그마 키트 외에 ... 계속 보아라 :) – YvesLeBorg

답변

1

당신은 개체 (클래스의 인스턴스)가 있습니다. 하나의 객체가 다른 객체와 통신하기를 원합니다. Objective-C에서는이를 메시지 보내기라고합니다. 다른 언어에서는 단순히 메소드를 호출하는 것입니다.

전역 변수가 필요하지 않습니다. 대신,받는 객체 MainMenu는 Player 객체에 메시지를 보내야합니다 (메서드 호출). 어떻게 서로를 아는 두 대상을 얻습니까? 당신은 악취가 나는, 큰, 과밀 한 디스코텍에 넣을 수 있고 최고를 향한 희망을 가질 수 있습니다.

또는 단순히 서로 이야기 할 수는 있지만 아아, 그들은해서는 안됩니다. 두 가지 모두 GameSceneLayer의 형제이기 때문에 서로 참조하지 않아야합니다 (약한 참조를 사용하지 않는 한 보관주기를 만들 위험성).

하지만 둘 다 같은 부모가 있습니다. 그래서 두 형제가 서로 이야기하지 않을 때 좋은 부모는 무엇을합니까? 그것은 메시지를 중계합니다!

MAINMENU에서

, 부모 GameSceneLayer에 메시지를 보내

[(GameSceneLayer*)self.parent gameWillStart]; 

을 GameSceneLayer은 선택 것을 구현하고, 게임 시작에 대한 정보를해야 다른 객체에 메시지 전달 :

-(void) gameWillStart 
{ 
    [player gameWillStart]; 
    [ingameUI gameWillStart]; 
    // etc. 
} 

그리고 플레이어도 구현 말했다 선택 :

-(void) gameWillStart 
{ 
    [self addChild:PLAYER]; 
} 

J GameSceneLayer에서 플레이어 및 기타 모든 객체 ivars (인스턴스 변수)를 만들어 GameSceneLayer가 이러한 참조를 쉽게 사용할 수있게합니다. 다른 방법으로는 (자주 사용하지 않는) 객체에 태그를 지정하고 getChildByTag를 사용하는 것입니다.

추신 : 어린 시절의 선수를 추가하는 것이 저에게 의심스러워 보입니다. 플레이어 노드가 이미 생성 된 경우 즉시 추가하고 필요한 경우 게임이 아직 시작되지 않은 상태에서 보이지 않거나 일시 중지되도록 설정해야합니다.

+0

그것은 일했다! iOS 6/iPhone5가 출시되었거나 업데이트 예정인 관계로 책의 관련성이 있습니까? 나는 그것을 살거야. –

0

게임 상태에 대한 정보를 유지하는 싱글 톤 GameState Manager를 사용할 수 있습니다.당신은 게임의 상태에 열거 있고, 그것에 대한 속성을 설정할 수 있습니다

+(GameManager*) sharedGameManager { 
if (!_sharedGameManager) { 
    _sharedGameManager = [[self alloc] init]; 
} 
return _sharedGameManager; 
} 

+(id) alloc { 
    NSAssert(_sharedGameManager == nil, @"Cannot create second instance of singleton Game Manager"); 
    return [super alloc]; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 

    } 
    return self; 
} 

그 게임 매니저 :

여기에 약간의 조각입니다. 다시 구현 파일에서 다음

//Header 

typedef enum { 
    kGameStarted, 
    kGameEnded 
}GameState 

@interface GameManager : CCNode { 

} 
@property (nonatomic) GameSate gameState; 

, 당신은 단지에 가입해야 GameState 속성, 당신은 메시지를 얻으려면 클래스에서 자신의 세터

//Implementation 
@synthesize gameState = _gameState; 

//Create your own setter, so you can notify all listeners 
    -(void) setGameState:(GameState) newGameState { 
    if (newGameState != _gameState) { 
     _gameState = newGameState; 

     //Notify listeners via NSNotification 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"gameState" object:nil]; 
    } 
} 

을 만드는 것이 합성은 " gamestate "알림은 다음과 같습니다.

[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(onGameStateChange:) 
     name:@"gameState" 
     object:nil]; 



    -(void) onGameStateChange{ 
      if ([GameManager sharedManager].gameState == kGameStarted){ 
      //start game 
      } 
    }