Koordinatensystem in SpriteKit

Ich bin ziemlich verwirrt mit dem Spritekit-Koordinatensystem. Ich muss zwei Fälle klären.

Fall 1

Wenn der Szene ein Sprite-Knoten als untergeordnetes Element hinzugefügt wird:

SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
blueBall.name=@"blueball";
blueBall.size=CGSizeMake(75, 75);
blueBall.position=point; //I am varying this point
[self addChild:blueBall];

Ich habe den Knoten jedes Mal an verschiedenen Punkten hinzugefügt. Dies sind die Punkte, an denen ich den Knoten hinzugefügt habe:(100x100)(200x200)(300x300)(400x400)(900,600)

Und in meinem iPhone 5-Gerät sehen sie folgendermaßen aus:

Wenn Sie auf 100x100 schauen, wenn ich das Sprite am Punkt (100,100) auf dem Gerät hinzufüge und die Knotenposition aufzeichne, wird mir (99,9,138,17) angezeigt, was ein großer Unterschied zum Punkt (100,100) ist.

Obwohl es auch bei den anderen Punkten Änderungen gibt, vernachlässige ich sie, da der Unterschied für andere Punkte viel zu gering ist.

-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */
      [self bounceTheBlueBallAtPoint:CGPointMake(100, 100)];

}

    -(void)bounceTheBlueBallAtPoint:(CGPoint)point{


    SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
    blueBall.name=@"blueball";
    blueBall.size=CGSizeMake(75, 75);

    blueBall.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:blueBall.frame.size.width/2];


    blueBall.physicsBody.categoryBitMask=blueBallHitCategory;
    blueBall.physicsBody.collisionBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;
    blueBall.physicsBody.contactTestBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;

    blueBall.physicsBody.dynamic=YES;
    blueBall.physicsBody.affectedByGravity=NO;
    blueBall.physicsBody.restitution=1.0;
    blueBall.physicsBody.friction=0.0;
    blueBall.physicsBody.linearDamping=0.0;
    blueBall.physicsBody.angularDamping=0.0;

    blueBall.position=point;

    [self addChild:blueBall];


    //applying impulse to bounce off
//    CGVector impulse = CGVectorMake(30.0,60.0);
//    [blueBall.physicsBody applyImpulse:impulse];
//    

}

Ich überprüfe die Ballposition in dieser Methode:

      -(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */

    [self checkSpriteMovement];

   }

    -(void)checkSpriteMovement{

    [self enumerateChildNodesWithName:@"blueball" usingBlock:^(SKNode * _Nonnull node, BOOL * _Nonnull stop) {

        SKSpriteNode *ball=(SKSpriteNode *)node;

        if (ball.physicsBody.resting) {

            NSLog(@"The ball position is %@",NSStringFromCGPoint(ball.position));
        }

    }];

}

Fall 2:

Nehmen wir an, ich habe einen Hintergrund-Sprite-Knoten und füge den Kugelknoten zu diesem Hintergrundknoten hinzu, anstatt den Kugelknoten zur Szene hinzuzufügen.

 _background = [SKSpriteNode spriteNodeWithImageNamed:@"parkImage.jpg"];
_background.size = self.frame.size; //frame size is (1024x768)
_background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:_background];

und dann füge ich den Kugelknoten zu diesem Hintergrund hinzu:

[_background addChild:blueBall];

Dies ist der hinzugefügte Hintergrundknoten:

Jetzt habe ich versucht, dem hinzugefügten Hintergrund eine Kugel hinzuzufügen:

Zeitpunkt: (100, 100):

Zeitpunkt: (- 280, -150)

Ich möchte auch den dritten Fall diskutieren:

Fall 3:

Ich möchte, dass ein anderer Knoten Backgorund namens Ring spritet. Und später möchte ich Ball in den Hintergrund hinzufügen. Es werden also 2 untergeordnete Knoten vorhanden sein.

   _ringNode=[SKSpriteNode spriteNodeWithImageNamed:@"hue_ring.png"];
_ringNode.size=CGSizeMake(80, 80);
_ringNode.position=CGPointMake(0, 0);  //center point of background in this case
_ringNode.anchorPoint=CGPointMake(0.5,0.5);
_ringNode.name=kRingNodeName;
[_background addChild:_ringNode];

so wird der Ring hier sein:

Und jetzt möchte ich dem Hintergrundknoten einen Kugelknoten hinzufügen:

Ich habe den gleichen Code verwendet, um den Ball am Punkt (-280, -150) hinzuzufügen:

Warum ändert sich das Koordinatensystem der Szenen- und Sprite-Knoten?

Ein weiteres Problem ist:

Die Knoten werden der Szene nicht ordnungsgemäß hinzugefügt. Obwohl die Szene gestartet wurde, sind die Knoten für den Benutzer nicht sichtbar, aber ich kann die Knotenzahl sehen, die besagt, dass sich Knoten auf dem Bildschirm befinden. Ich muss den Code erneut ausführen, um Siehe die der Szene korrekt hinzugefügten Knoten. Dies geschieht alle vier Male. Ich muss nur den Code anhalten und erneut ausführen, um die Kugeln auf dem Geröll zu sehen. Andernfalls sehe ich nur den Hintergrund ohne Kugeln, obwohl ich sie dem Hintergrund hinzufüge.

Warum passiert dies

Ich füge alle Knoten in @ hindidMoveToView

Antworten auf die Frage(4)

Ihre Antwort auf die Frage