2012-07-24 84 views
1

我有一個派生自CCNode的PlayerData類,我想在遊戲的各個場景中以靜態單例實例的形式分享它。Cocos2d:如何在場景之間共享玩家數據

我曾嘗試以下實現:

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
@interface PlayerData : CCNode { 

} 

@property (readwrite, nonatomic) int data; 
+(id) playerData; 
+(PlayerData*) sharedPlayerData; 

#import "PlayerData.h" 
@implementation PlayerData 
@synthesize data; 
static PlayerData* instanceOfPlayerData; 

+(id) playerData 
{ 
    if(instanceOfPlayerData==nil){ 
     return [[self alloc] init]; 
    }else { 
     return [self sharedPlayerData]; 
    } 
} 

+(PlayerData*) sharedPlayerData{ 
    NSAssert(instanceOfPlayerData != nil, @"PlayerData instance not yet initialized!"); 
    return instanceOfPlayerData; 
} 


-(id) init 
{ 
    if ((self = [super init])) 
    { 
     instanceOfPlayerData=self; 
     data=0; 
     } 
    return self; 
} 
@end 

哪裏是分配這個正確的地方?我想過要添加並訪問它到AppDelegate類,但我無法安靜地瞭解如何。

我從sharedDirector中看到,我可以訪問delagate的值,但我不認爲是正確的,除非我必須將它轉換爲我的AppDelegate類。任何建議?

[[CCDirector sharedDirector] delegate]; 

這是我AppDelegate類從模板:

#import <UIKit/UIKit.h> 
#import "cocos2d.h" 

@interface AppController : NSObject <UIApplicationDelegate, CCDirectorDelegate> 
{ 
    UIWindow *window_; 
    UINavigationController *navController_; 

    CCDirectorIOS *__unsafe_unretained director_;       // weak ref 
} 

@property (nonatomic) UIWindow *window; 
@property (readonly) UINavigationController *navController; 
@property (unsafe_unretained, readonly) CCDirectorIOS *director; 

@end 

PS:我使用cocos2d的版本2.x與ARC啓用

回答

2

這是一個偉大的單身教程中,我使用對於我的遊戲和偉大的作品:http://getsetgames.com/2009/08/30/the-objective-c-singleton/

+0

我絕對推薦這個,但你也可以初始化你的場景與所有的遊戲呃數據。 – tallen11 2012-07-26 16:16:29

+0

@Omega謝謝,我確實使用了單例模式,我喜歡它。我在AppDelegate中分配類,然後在需要的地方訪問它。雖然,爲了清晰起見,我正考慮在啓動遊戲時將其加載到「加載場景」中,所以我不會使用遊戲特定類「應用程序代理」「骯髒」。 – mm24 2012-07-26 16:26:44

+1

@ mm24:好的,是的,如果有東西你不需要全球舉行,單身的方法可能沒有必要。但對於諸如保存文件數據這樣的事情來說,這非常棒 - 您需要將這些內容保存到遊戲中,以備後期使用,例如玩家等級,統計數據,貨幣,遊戲時間等等。而且您仍然可以讓代碼更加乾淨。也許把所有特定於玩家的數據放在單例內的NSDictionary中,等等。 – Voldemort 2012-07-26 21:55:59