2011-12-20 5 views
0

初めてシングルトンを使用しましたが、実際にそれを実装する方法はわかりません... いいえ何かを説明する必要があります: で、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]; 

答えて

1

まずexistingHexagons配列が最初の場所で初期化されていないので、それはnullを返します。あなたのシングルトンのinit機能に移動し、追加します。

あなたのForループの質問については
existingHexagons = [[NSMutableArray alloc]init]; 

、私はそれを取得できませんでした。私は1つのStackOverflow質問を1つ2つにするのではなく、クエリごとに作成することをお勧めします。

+0

まずはお返事ありがとうございます。残念なことに、辞書を起動することは、もちろん必須ではあるが、問題を解決することはできませんでした。「for」ループのタスクは、それぞれの位置に複数の六角形を作成することです。だから、もし私が 'Hexagon * nHex = [[Hexagon alloc] init];と呼ぶなら、それはループを繰り返し、それらの位置にすべての六角形を作るべきです。クラスメソッドは単一の 'CCprite *'オブジェクトを返さなければならないので、ちょっと混乱しているようですね。だから、複数のスプライトを作成することは不可能でしょうか? –

+0

さて、戻り値の型はCCSpriteなので、そのインスタンスを返すことしかできないようです...しかし、CCSprite型を返す代わりに、代わりにNSArrayを返すことがあります。このような配列には、複数のCCスプライトが含まれます。したがって、ForループはNSMutableArrayに値を設定し、関数の最後にそのような配列を返します。 – Voldemort

関連する問題