初めてシングルトンを使用しましたが、実際にそれを実装する方法はわかりません... いいえ何かを説明する必要があります: で、Hexagon.h(CCNodeから継承)では、複数のスプライト(ここでは「六角形」と呼ばれます)を作成したいと思います。しかし、彼らはまだシーンに追加されていません。それらはHelloWorldLayer.mクラスに追加されており、Hexagon *nHex = [[Hexagon alloc]init];
と呼びます。あれは正しいですか ?その後、forループを繰り返して、すべての六角形または1つだけを作成していますか?
まあ、パブリックゲームの状態情報をすべて処理するシングルトンクラスがありますが、取り込みはまだできません。たとえばexistingHexagons
の値を取得することはできません。(null)
というオブジェクトが返されるためです。オブジェクトを間違って設定するか、シングルトンからデータを誤って取得しています。実際には、私はこれらの質問の1つに答えていただければ幸いです。私を助けてください。何かが明確でない場合は、コメントを追加してください。私はそれを明確にしようとします。シングルトンで何かが間違っています...子供がいないので追加できません
私が今持っていることは以下の通りです:
GameStateSingleton.h
#import <Foundation/Foundation.h>
@interface GameStateSingleton : NSObject{
NSMutableDictionary *existingHexagons;
}
+(GameStateSingleton*)sharedMySingleton;
-(NSMutableDictionary*)getExistingHexagons;
@property (nonatomic,retain) NSMutableDictionary *existingHexagons;
@end
GameStateSingleton.m
#import "GameStateSingleton.h"
@implementation GameStateSingleton
@synthesize existingHexagons;
static GameStateSingleton* _sharedMySingleton = nil;
+(GameStateSingleton*)sharedMySingleton
{
@synchronized([GameStateSingleton class])
{
if (!_sharedMySingleton)
[[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
+(id)alloc
{
@synchronized([GameStateSingleton class])
{
NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedMySingleton = [super alloc];
return _sharedMySingleton;
}
return nil;
}
-(id)init {
self = [super init];
if (self != nil) {
}
return self;
}
@end
Hexagon.m
-(CCSprite *)init{
if((self=[super init])) {
NSString *mainPath = [[NSBundle mainBundle] bundlePath];
NSString *levelConfigPlistLocation = [mainPath stringByAppendingPathComponent:@"levelconfig.plist"];
NSDictionary *levelConfig = [[NSDictionary alloc] initWithContentsOfFile:levelConfigPlistLocation];
NSString *currentLevelAsString = [NSString stringWithFormat:@"level%d", 1];
NSArray *hexPositions;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
hexPositions = [[levelConfig valueForKey:currentLevelAsString] valueForKey:@"hexpositionIpad"];
}
else{
hexPositions = [[levelConfig valueForKey:currentLevelAsString] valueForKey:@"hexpositionIphone"];
}
NSString *whichType = [NSString stringWithFormat:@"glass"];
CGSize screenSize = [CCDirector sharedDirector].winSize;
if ([whichType isEqualToString:@"stone"]){
hexagon = [CCSprite spriteWithFile:@"octagonstone.png"];
}else if([whichType isEqualToString: @"glass"]){
hexagon = [CCSprite spriteWithFile:@"octagoncolored1.png"];
}else if([whichType isEqualToString: @"metal"]){
hexagon = [CCSprite spriteWithFile:@"octagonmetal.png"];
}
NSMutableDictionary *eHexagons =[[GameStateSingleton sharedMySingleton] getExistingHexagons];
for (int i=0;i < [hexPositions count];i++){
CGPoint location = CGPointFromString([hexPositions objectAtIndex:i]);
CGPoint nLocation= ccp(screenSize.width/2 + 68 * location.x,screenSize.height/2 + 39 * location.y);
NSString *aKey = [NSString stringWithFormat:@"hexagon%d",i];
hexagon =[CCSprite spriteWithFile:@"octagoncolored1.png"];
hexagon.position = nLocation;
[eHexagons setObject:hexagon forKey:aKey];
[self addChild:[eHexagons valueForKey:aKey] z:3];
[[GameStateSingleton sharedMySingleton]setExistingHexagons:eHexagons];
}
NSLog(@"these are the existinghexagons %@", existingHexagons);
//This returns a dictionary with one (null) object
}
return hexagon;
}
HelloWorldLayer.m - すべての>-(id)init
方法
Hexagon *nHex = [[Hexagon alloc]init];
まずはお返事ありがとうございます。残念なことに、辞書を起動することは、もちろん必須ではあるが、問題を解決することはできませんでした。「for」ループのタスクは、それぞれの位置に複数の六角形を作成することです。だから、もし私が 'Hexagon * nHex = [[Hexagon alloc] init];と呼ぶなら、それはループを繰り返し、それらの位置にすべての六角形を作るべきです。クラスメソッドは単一の 'CCprite *'オブジェクトを返さなければならないので、ちょっと混乱しているようですね。だから、複数のスプライトを作成することは不可能でしょうか? –
さて、戻り値の型はCCSpriteなので、そのインスタンスを返すことしかできないようです...しかし、CCSprite型を返す代わりに、代わりにNSArrayを返すことがあります。このような配列には、複数のCCスプライトが含まれます。したがって、ForループはNSMutableArrayに値を設定し、関数の最後にそのような配列を返します。 – Voldemort