Der Ankerpunkt der Spritekit-Szene wirkt sich auf die Positionierung des untergeordneten Knotens aus

StackOverflow https://stackoverflow.com//questions/21016863

  •  21-12-2019
  •  | 
  •  

Frage

Ich habe meine SKScene-Unterklasse erstellt, die den Ankerpunkt festlegt und dann einen SKSpriteNode für die Welt hinzufügt. Die Welt hat mehrere SKSpriteNodes für die Hindernisse, Spieler usw.Ich konzentriere mich auch auf die

Das Problem, das ich habe, ist, dass, da ich den Ankerpunkt der Szene auf (0,5, 0,5) gesetzt habe, die Position jedes untergeordneten Knotens, den ich der Welt hinzufüge, im Mittelpunkt der Welt beginnt.Wie kann ich die Position der Knoten so festlegen, dass Position = (0,0) unten links im Weltknoten und allen ihm hinzugefügten untergeordneten Knoten und nicht in der Mitte liegt?

@implementation LevelScene

-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {

    NSLog(@"width:%f height:%f", self.view.bounds.size.width, self.view.bounds.size.height);


    // set the physics body
    self.physicsWorld.gravity = CGVectorMake(0,-5);
    self.physicsWorld.contactDelegate = self;
    self.anchorPoint = CGPointMake(0.5, 0.5);

    NSMutableDictionary *plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"LevelScene" ofType:@"plist"]];
    NSString *backgroundImage = [plistDict objectForKey:@"background"];

    // add a node that holds the background
    background = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:backgroundImage] size:CGSizeMake(1024, 768)];
    background.position = CGPointMake(0, 0);
    [self addChild:background];

    world = [SKSpriteNode spriteNodeWithColor:[SKColor brownColor] size:CGSizeMake(1024, 768)];
    world.position = CGPointMake(0, 0); // this should be bottom-left
    world.size = CGSizeMake(1024, 768);
    world.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:world.frame];
    world.physicsBody.categoryBitMask = worldCategory;
    [self addChild:world];

    // load in the game tiles (these are non-dynamic tiles the player can use)
    [self loadInTiles];

    // add in game object to the world skspritenode - this just creates a subclass of skspritenode and sets position to 0,0
    [self addGameObject:CGPointMake(0, 0)];

...
}

// ...setup functions, input handling, etc

-(void)didSimulatePhysics {

    // setup the player to move depending on their direction
    [player updatePosition];

    [self centreOnNode:player];
}

-(void)centreOnNode: (SKSpriteNode *)node {
    CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent];

    CGFloat x = node.parent.position.x - cameraPositionInScene.x;
    CGFloat y = node.parent.position.y - cameraPositionInScene.y;
    NSLog(@"camera x:%f y:%f", x, y);

    NSLog(@"world frame origin x:%f y:%f", world.frame.origin.x, world.frame.origin.y);

    node.parent.position = CGPointMake(x, y);
}
War es hilfreich?

Lösung

Wenn Sie den Ursprung des World Sprite auf die untere linke Seite setzen möchten, stellen Sie einfach einen Ankerpunkt ein.

generasacodicetagpre.

Damit ist das Koordinatensystem des World Sprite ebenso wie der der Standardeinstellung des Szenens.

Vergewissern Sie sich, dass die Zeile entfernen:

generasacodicetagpre.

Andere Tipps

Ersetzen Sie diese Zeile:

world.position = CGPointMake(0, 0);

dadurch:

world.position = CGPointMake(-CGRectGetMidX(self.frame), -CGRectGetMidY(self.frame));

(0,0) ist der Mittelpunkt der Szene, da Sie den Ankerpunkt festlegen SKScene bis (0,5,0,5)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top