2012-12-20 2 views
1

나는 Gamehud에 개체의 이름을 표시하고 싶습니다. 메인 씬에 많은 오브젝트/스프라이트가 있는데, 내가하려고하는 것은 Gamehud에 선택한 (터치로) 오브젝트 이름을 표시하는 것입니다.CChrite 또는 CCNode, Cocos2d에서 gamehud를 업데이트하는 방법

문제 GamehudCCsprite 클래스에 할당하면 새 인스턴스가 생성되고 현재 Gamehud은 업데이트되지 않습니다. GameHUD *gamehud= (GameHUD *)[self.parent getChildByTag:99];과 같은 것을 사용하면 GameHud 클래스에 객체를 보낼 수 없습니다.

그럼 ccsprite or ccnode 클래스의 게임 허드를 업데이트하는 올바른 방법은 무엇입니까?

메인 장면; 객체 클래스에서

-(id) init 
{ 
    if ((self = [super init])) 
    {    
     gameHud = [GameHUD gamehud]; 
     [self addChild:gameHud z:2 tag:99]; 
    } 
} 

내 GameHud

+(id) gamehud 
{ 
    return [[self alloc] init]; 
} 

-(id) init 
{ 
    if ((self = [super init])) 
    { 
     //bunch of labels 
    } 
} 


-(void)showName: :(Object *)obj 
{ 
    NSLog(@"Object name is %@", obj.name); 
    [_labelSpeed setString:obj.name]; 
} 

: CCSprite 모든

-(void) onTouch 
{ 
    //obj is the object with name property that I want to use 
    GameHUD *gamehud= (GameHUD *)[self.parent getChildByTag:99]; // does not send the obj to gamehud and showName is not called 
    //GameHud *gamehud= [GameHud alloc] init]; // this displays nslog but doesnt update _label 
    [gamehud showName:obj]; 
} 
+0

아마도 해당 CCSprite 객체에 대한 대리자 메서드를 만들 수 있습니다. 그것이 선택되었을 때 불이났다. 그런 다음 주요 장면에서 객체 이름을 가져오고'[gameHud showName : objectName]'을 호출하십시오. – mkral

+0

당신은 분명히 객체 내부에서 허드를 설정하고 싶지는 않습니다. – mkral

+0

또 다른 옵션은 mainScene에서 어떤 서브 뷰가 터치되었는지 확인한 다음 거기에서 확인하는 것입니다. – mkral

답변

0

싱글 톤 또는 세미 싱글 톤과 같은 것을 만들어야 할 수도 있습니다. 그냥 당신의 게임 장면 호출

SingletonGameHud.h

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

//create singleton class to use gamehud in movingobject class 
@interface SingletonGameHud : NSObject 
{ 
    GameHUD *gamingHud; 

} 

@property(nonatomic,strong) GameHUD *gamingHud; 

+(SingletonGameHud *)sharedInstance; 


@end 

에게 앱에

SingletonGameHud *sharedInstance= [SingletonGameHud sharedInstance]; 
hud = sharedInstance.gamingHud; 
[self addChild:hud z:2 tag:99]; 

을 SingletonGameHud.m

#import "SingletonGameHud.h" 
#import "GameHUD.h" 

@implementation SingletonGameHud 

@synthesize gamingHud=_gamingHud; 


+ (SingletonGameHud *)sharedInstance 
{ 
    static SingletonGameHud *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[SingletonGameHud alloc] init]; 
     // Do any other initialisation stuff here 
    }); 
    return sharedInstance; 
} 

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

    } 
    return self; 
} 

@end 

새로운 NSObject의 클래스 이름 "SingletonGameHud"를 추가하여 온 터치 방식 전화

-(void) onTouch 
{ 
    SingletonGameHud *sharedInstance= [SingletonGameHud sharedInstance]; 
    [sharedInstance.gamingHud showName:obj]; 

} 
1

첫 번째는 singlton를 사용하거나 당신이 +(id) gamehud 전화 새로운 GameHub 매번 생성됩니다. 나는 이것이 당신의 문제 일 수 있다고 생각한다 : 당신은 하나의 GameHUD를 씬에 추가하고 GameHUD의 다른 객체의 showName :을 호출한다. 또 다른 문제는 -(id)init입니다. self을 반환하지 마십시오! 그래서 당신은 당신이 원하는 모든 지점에서 HUD에 액세스 할 수 있습니다 지금부터

static GameHUD *sharedInstance = nil; 
+(id) gamehud { 
    if(!sharedInstance) { 
     sharedInstance = [[GameHUD alloc] init] 
    } 
    return sharedInstance; 
} 

-(id) init { 
    self = [super init]; 
    if (self) { 
     //bunch of labels 

     sharedInstance = self; 
    } 
    return self; //i dont see this in your code! 
} 

당신의 GameHUD

을 결코 당신은 태그로 처리 할 필요 없어요. 조심하세요. 싱글 톤을 만드는 가장 좋은 방법은 아닙니다 (Google에 문의하십시오). ..alloc] 초기화]만을 사용 [GameHUD gamehud];

-(void) onTouch { 
    [[GameHUD gamehud] showName:obj]; 
} 

행운을 빕니다를 호출하지 말라!

+0

'return self;'는 내 코드에서 복사 한 붙여 넣기 오류입니다. 답변 해주셔서 감사합니다 –