1

Gamehudオブジェクトの名前を表示したい場所があります。メインシーンにはたくさんのオブジェクト/スプライトがあります。私がやろうとしているのは、選択した(タッチした)オブジェクトの名前をに表示することです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];
}
4

2 に答える 2

1

まず、シングルトンを使用するか、を呼び出すたびに新しいGameHubを作成します+(id) gamehud。これがあなたの問題かもしれないと思います。シーンに1つのGameHUDを追加し、GameHUDの別のオブジェクトのshowName:を呼び出します。もう一つの問題はあなた-(id)initです-あなたは戻らselfない!だからあなたはあなたのGameHUDを決して手に入れません

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!
}

これからは、必要なすべてのポイントからhudにアクセスでき、タグで処理する必要はありません。注意してください、それはシングルトンを作成するための最良の方法ではありません(グーグルに聞いてください)。..alloc]init]を呼び出さないでください]使用のみ[GameHUD gamehud];

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

幸運を!

于 2012-12-21T15:47:44.950 に答える
0

シングルトンまたはセミシングルトンのようなものを作成する必要があるかもしれません。新しいnsobjectクラス名「SingletonGameHud」をアプリに追加するだけです

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.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

あなたのゲームシーンの呼び出しで

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

オンタッチメソッド呼び出しで

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

}
于 2012-12-21T16:49:44.663 に答える