【问题标题】:How to update gamehud in a CCSprite or CCNode, Cocos2d如何在 CCSprite 或 CCNode、Cocos2d 中更新 gamehud
【发布时间】:2012-12-20 19:45:06
【问题描述】:

我有一个Gamehud,我想在其中显示一个对象的名称。主场景中有很多对象/精灵我想做的是在Gamehud 上显示选定(触摸)对象的名称。

问题是如果我在CCsprite 类中分配Gamehud,它会创建新实例并且不会更新当前Gamehud。如果我使用 GameHUD *gamehud= (GameHUD *)[self.parent getChildByTag:99]; 之类的东西,我无法将对象发送到 GameHud 类。

那么在ccsprite or ccnodeclass 中更新游戏界面的正确方法是什么?

主场景;

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

我的游戏界面

+(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];
}

【问题讨论】:

  • 也许你可以在那个 CCSprite 对象上创建一个委托方法。当它被选中时会火。然后在你的主场景中获取对象名称并调用[gameHud showName:objectName]
  • 你肯定不想从对象内部设置 hud。
  • 另一种选择是检查 mainScene 中哪些子视图被触摸,然后在那里进行。

标签: objective-c ios xcode cocos2d-iphone ccsprite


【解决方案1】:

首先使用单例,否则每次调用+(id) gamehud 时都会创建一个新的 GameHub。我认为这可能是您的问题:您将一个 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];
}

祝你好运!

【讨论】:

  • return self; 只是我的代码中出现的复制粘贴错误。感谢您的回答
【解决方案2】:

您可能需要创建一个单例或类似半单例的东西。只需将新的 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];

}

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多