2012-07-24 83 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