NSCoder 内にゲーム状態シングルトンを使用して保存したいのですが、NSKeyedArchiver/NSCoder ルーチンを使用してデータを保存およびロードする一般的な状態管理を見つけるのは非常に難しいと感じています。
誰かが良いチュートリアル、またはゲーム状態のシングルトンとして使用するための一般的なコードに私を案内してくれるかどうか疑問に思っています.NSCoderに保存/ロードしますか?
ありがとう
NSCoder 内にゲーム状態シングルトンを使用して保存したいのですが、NSKeyedArchiver/NSCoder ルーチンを使用してデータを保存およびロードする一般的な状態管理を見つけるのは非常に難しいと感じています。
誰かが良いチュートリアル、またはゲーム状態のシングルトンとして使用するための一般的なコードに私を案内してくれるかどうか疑問に思っています.NSCoderに保存/ロードしますか?
ありがとう
71squared.com のチュートリアルを見て、基本的なゲーム ステート マネージャーを動作させることができました。
CocoaWithLove の SynthesizeSingleton.h を使用し、NSCoder / アーカイブを使用して状態を保存およびロードできます。
シングルトンを使用しているため、次のように記述して参照できます。
GameStateManager *gsm = [GameStateManager sharedGameStateManager];
以下のように:
// GameStateManager.h file
@interface GameStateManager : NSObject
{
NSMutableArray *listOfPlayers;
}
@property (nonatomic, retain) NSMutableArray *listOfPlayers;
+ (GameStateManager *)sharedGameStateManager;
-(void)loadGameState;
-(void)saveGameState;
// GameStateManager.m
#import "GameStateManager.h"
#import "SynthesizeSingleton.h"
#import "Player.h"
@implementation GameStateManager
SYNTHESIZE_SINGLETON_FOR_CLASS(GameStateManager)
@synthesize listOfPlayers;
#pragma mark - Init
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
self.listOfPlayers = [NSMutableArray array];
}
return self;
}
#pragma mark - Memory management
-(void) dealloc
{
[super dealloc];
}
#pragma mark - Save/Load
-(void)saveGameState
{
NSLog(@"saveGameState");
// Set up the game state path to the data file that the game state will be save to
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *gameStatePath = [documentsDirectory stringByAppendingPathComponent:@"gameState.dat"];
// Set up the encoder and storage for the game state data
NSMutableData *gameData;
NSKeyedArchiver *encoder;
gameData = [NSMutableData data];
encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:gameData];
// Archive the object
[encoder encodeObject:self.listOfPlayers forKey:@"playerObjects"];
// Finish encoding and write to disk
[encoder finishEncoding];
[gameData writeToFile:gameStatePath atomically:YES];
[encoder release];
}
-(void)loadGameState
{
NSLog(@"loadGameState");
// Set up the game state path to the data file that the game state will be save to
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *gameStatePath = [documentsDirectory stringByAppendingPathComponent:@"gameState.dat"];
NSMutableData *gameData;
NSKeyedArchiver *decoder;
gameData = [NSData dataWithContentsOfFile:gameStatePath];
// Check to see if the .dat file exists, and load contents
if (gameData)
{
decoder = [[[NSKeyedUnarchiver alloc] initForReadingWithData:gameData] retain];
self.listOfPlayers = [[[decoder decodeObjectForKey:@"playerObjects"] retain] autorelease];
NSLog(@"Returned %d players", [self.listOfPlayers count]);
for (Player *p in self.listOfPlayers)
{
NSLog(@"p.name = %@", p.fname);
}
// Finished decoding, release
[decoder release];
[decoder autorelease];
} else {
}
}
私の Player.h/.m ファイルでは、次のようにします。
@interface Player : NSObject
<NSCoding>
{
NSString *fname;
}
@property(nonatomic,retain) NSString *fname;
// Player.m file
#pragma mark - Encoding
-(id)initWithCoder:(NSCoder *)aDecoder
{
//[self initWithObject:[aDecoder decodeObject];
self = [super init];
if (self) {
// Initialization code here.
self.fname = [aDecoder decodeObjectForKey:@"fname"];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.fname forKey:@"fname"];
}
// ---
私のフォローアップの質問は次のとおりです。
1) listOfPlayers
GameStateManager に a を入れるつもりですか? --> 新しい質問に移動しました
2) 私のエンコーダでは、各フィールドを個別に保存する必要があります。実際のオブジェクト自体を保存することはできませんか?
3) オブジェクトのエンコーディングは、そのすべての子もエンコードしますか?
親クラス (プレーヤー) と子クラス (武器) があるとします。Player オブジェクトのみをエンコードすると、すべての武器がリンクされているため、すべての武器も自動的にエンコードされますか?
ありがとう。