0

こんにちは、私はプログラミングが初めてで、SpriteKit を学んでいます。(ただし、これは一般的なプログラミングの質問です。)ハードコードされた値があり、同じ画像を何度も再利用しました。私が理解しているコーディングノーノー。私が想定しているループでリファクタリングすることで、誰かがこれを学ぶのを手伝ってくれますか。

20 の破線の空のカード スポットの行を作成し、一度に 4 つを画面の下部の中央の画面サイズに配置しています。これらの空のスポット (繰り返し使用される 1 つのカード画像のみ) を「子」としてラックに追加しました。

補足: これは、SpriteKit に慣れていない場合の一般的なプログラミングの質問であるため、私の CGPoints は画面座標ではなくラック座標系にマップされています...混乱した場合..

一番下にあるリファクタリングされたコードを作成しようとしましたが、node.positions が SKSpriteNodes に関連付けられており、ループが私を困惑させているように見えるため、スタックしています。

ここに私が持っているものがあります:

-(SKSpriteNode*)createBottomRack
{
    self.rack = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor]   size:CGSizeMake(10240.0, 200)];
    self.rack.position = CGPointMake(0.0,150.0);
    self.rack.zPosition = 0;
    self.rack.name = @"bottomRack";

    // Screen 1
    SKSpriteNode *number0 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number1 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number2 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number3 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    // Screen 1 positions
    number0.position = CGPointMake(212, 0.0);
    number1.position = CGPointMake(412, 0.0);
    number2.position = CGPointMake(612, 0.0);
    number3.position = CGPointMake(812, 0.0);

    // Screen 2
    SKSpriteNode *number4 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number5 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number6 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number7 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];

    // Screen 2 positions
    number4.position =CGPointMake(1236.0, 0.0);
    number5.position =CGPointMake(1436.0, 0.0);
    number6.position =CGPointMake(1636.0, 0.0);
    number7.position =CGPointMake(1836.0, 0.0);

    // Screen 3
     SKSpriteNode *number8 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
     SKSpriteNode *number9 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
     SKSpriteNode *number10 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
     SKSpriteNode *number11 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];

    // Screen 3 positions
    number8.position =CGPointMake(2260.0, 0.0);
    number9.position =CGPointMake(2460.0, 0.0);
    number10.position =CGPointMake(2660.0, 0.0);
    number11.position =CGPointMake(2860.0, 0.0);

    // Screen 4
    SKSpriteNode *number12 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number13 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number14 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number15 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];

    // Screen 4 positions
    number12.position =CGPointMake(3284.0, 0.0);
    number13.position =CGPointMake(3484.0, 0.0);
    number14.position =CGPointMake(3684.0, 0.0);
    number15.position =CGPointMake(3884.0, 0.0);

    // Screen 5
    SKSpriteNode *number16 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number17 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number18 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    SKSpriteNode *number19 = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];

    // Screen 5 positions
    number16.position =CGPointMake(4308.0, 0.0);
    number17.position =CGPointMake(4508.0, 0.0);
    number18.position =CGPointMake(4708.0, 0.0);
    number19.position =CGPointMake(4908.0, 0.0);

    // Add dashedCards in position on screen
    [self.rack addChild:number0];
    [self.rack addChild:number1];
    [self.rack addChild:number2];
    [self.rack addChild:number3];
    [self.rack addChild:number4];
    [self.rack addChild:number5];
    [self.rack addChild:number6];
    [self.rack addChild:number7];
    [self.rack addChild:number8];
    [self.rack addChild:number9];
    [self.rack addChild:number10];
    [self.rack addChild:number11];
    [self.rack addChild:number12];
    [self.rack addChild:number13];
    [self.rack addChild:number14];
    [self.rack addChild:number15];
    [self.rack addChild:number16];
    [self.rack addChild:number17];
    [self.rack addChild:number18];
    [self.rack addChild:number19];

    return self.rack;
}

これが私が現在リファクタリングしているところです...

NSMutableArray *dashesArray = [NSMutableArray arrayWithCapacity:20];
for (int i = 0; i<=20; i++) {
    SKSpriteNode *dash = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
    [dashesArray addObject:dash];

}

これは、一般的に番号が付けられた SKSpriteNodes を保持するループを作成すると、それらを位置にマップする方法がわからないためです....?

4

2 に答える 2

0

各ノードのx座標の計算は非常に簡単です。position

  • xは 212 から始まります
  • 後続のノードは、前のノードの右に 200px です。
  • 5 番目のノードごとに、前のノードの右側に (200 ピクセルではなく) 424 ピクセルあります。

そのためのコードは次のようになります。

- (SKSpriteNode *)createBottomRack
{
    self.rack = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(10240.0, 200)];
    self.rack.position = CGPointMake(0.0,150.0);
    self.rack.zPosition = 0;
    self.rack.name = @"bottomRack";

    float x = 212.0, y = 0.0;
    for (NSUInteger i = 0; i < 20; i++) {
        SKSpriteNode *dash = [SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
        dash.position = CGPointMake(x, y);
        [self.rack addChild:dash];

        // Calculate the next x coordinate
        x += (i % 4 == 3) ? 424.0 : 200;
    }

    return self.rack;
}
于 2013-10-16T20:49:49.393 に答える
0

あなたはプログラミングに慣れていないので、配列がどのように機能し、どのように使用されるかを学ぶことに時間を費やすことをお勧めします。

http://en.wikipedia.org/wiki/Array_data_structure

およびその iOS 実装:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

まず、2 つの配列を宣言できます。1 つは SKSpriteNodes を含み、もう 1 つは位置ポイントを含みます。

   //Declare these in @interface
        @property (nonatomic) NSMutableArray *sprites;
        @property (nonatomic) NSMutableArray *points;

    //This will contain the SKSpriteNodes
        self.sprites =[[NSMutableArray alloc] init];

    //This will contain the points, we initialise it with the hard-coded values.
    //You have to wrap the values in an object type of NSValue of the array to accept it
        self.points = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithCGPoint:CGPointMake(212, 0.0)],
                       [NSValue valueWithCGPoint:CGPointMake(412, 0.0)],
                       [NSValue valueWithCGPoint:CGPointMake(612, 0.0)],
                       [NSValue valueWithCGPoint:CGPointMake(812, 0.0)],
                       //Put the rest of the values here... for the moment it will do
                       nil];

    //Now for each declared point, we create a SKSpriteNode, insert it into the array and add it to "rack"

//for will loop over eacg point you have defined.
        for (NSValue *point in self.points){

//This will be a temporary object we create to add it into the array.
            SKSpriteNode *node =[SKSpriteNode spriteNodeWithImageNamed:@"dashedCard"];
            node.position = [point CGPointValue];
            [self.sprites addObject:node];
            [self.rack addChild:node];
        }

経験を積むにつれて、コードを改善する他の多くの方法を見つけることができますが、時間をかけてコードと基本的なデータ構造を学習してください。幸運を!

于 2013-10-16T20:47:06.023 に答える