Vraag Een camera verplaatsen in SpriteKit


//BIJWERKEN  De bijgewerkte code is toegevoegd die werkt zoals ik verwachtte. Zie didSimulatePhysics-methode in de bijgewerkte code hieronder. In mijn geval geef ik er alleen om een ​​teken naar links of rechts te verplaatsen op de x-as, waarbij 0 op de x-as absoluut links en rechts op de x-as een instelbare waarde is. De Apple-adventure-game heeft ook echt veel geholpen.

// ORIGINELE POST HIERONDER

Ik werk met Apple SpriteKit en ik heb moeite om een ​​camera te implementeren zoals ik zou willen dat hij zich gedraagt. Wat ik in de code heb gedaan, is het laden van een sprite-teken, twee knoppen en een rood vak dat aan de rechterkant van de weergave aan het begin is uitgeschakeld. Wat ik zou willen kunnen doen is het personage verplaatsen met de knoppen, en zodra de speler het midden of einde van het scherm bereikt, zal de camera zich opnieuw aanpassen om te onthullen wat niet in de weergave te zien was. Dus als je naar rechts beweegt, moet je uiteindelijk het rode vak dat buiten de weergave staat aanvankelijk tonen zodra de speler daar is. Met de code die ik hieronder gebruik, kan ik de camera echter niet volgen en de coördinaten helemaal niet aanpassen aan het hoofdpersonage. Ik heb gekeken naar Apple's geavanceerde scèneverwerkingsdocument evenals naar een paar andere stack-overloopposten, maar het lijkt me niet goed te doen. Als iemand advies zou kunnen geven, zou het op prijs worden gesteld.

enter image description here

#define cameraEdge 150

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        /* Setup your scene here */
        //320 568


        self.backgroundColor = [SKColor whiteColor];

        myWorld = [[SKNode alloc] init];
        [self addChild:myWorld];

        mainCharacter = [SKSpriteNode spriteNodeWithImageNamed:@"0"];
        mainCharacter.physicsBody.dynamic = YES;
        mainCharacter.name = @"player";

        mainCharacter.position = CGPointMake(20, 20);

        CGRect totalScreenSize = CGRectMake(0, 0, 800, 320);

        SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(60, 60)];

          SKSpriteNode *boxTwo = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(60, 60)];
           SKSpriteNode *boxThree = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(60, 60)];
        boxThree.position = CGPointMake(40, 50);

        [myWorld addChild:boxThree];

        boxTwo.position = CGPointMake(1100, 50);

        box.position = CGPointMake(650, 50);

        [myWorld addChild:box];
        [myWorld addChild:boxTwo];


       self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:totalScreenSize];

        self.physicsWorld.gravity = CGVectorMake(0, -5);
        mainCharacter.name = @"mainCharacter";


        mainCharacter.physicsBody.linearDamping = 0;
        mainCharacter.physicsBody.friction = 0;
        mainCharacter.physicsBody.restitution = 0;
        mainCharacter.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:mainCharacter.size];

       [myWorld addChild:mainCharacter];

        [self addChild:[self buildLeftButton]];
        [self addChild:[self buildRightButton]];

    }

    return self;
}

- (void)didSimulatePhysics
{
    SKSpriteNode *hero = mainCharacter;

    if(hero)
    {
        CGPoint heroPosition = hero.position;
        CGPoint worldPosition = myWorld.position;

        NSLog(@"%f", heroPosition.x);

        CGFloat xCoordinate = worldPosition.x + heroPosition.x;

        if(xCoordinate < cameraEdge && heroPosition.x > 0)
        {
            worldPosition.x = worldPosition.x - xCoordinate + cameraEdge;
            self.worldMovedForUpdate = YES;
        }

        else if(xCoordinate > (self.frame.size.width - cameraEdge) && heroPosition.x < 2000)
        {
            worldPosition.x = worldPosition.x + (self.frame.size.width - xCoordinate) - cameraEdge;
            self.worldMovedForUpdate = YES;
        }

        myWorld.position = worldPosition;
    }
}

-(SKSpriteNode *)buildLeftButton
{
    SKSpriteNode *leftButton = [SKSpriteNode spriteNodeWithImageNamed:@"left"];
    leftButton.position = CGPointMake(20, 20);
    leftButton.name = @"leftButton";
    leftButton.zPosition = 1.0;
    return leftButton;
}

-(SKSpriteNode *)buildRightButton
{
    SKSpriteNode *leftButton = [SKSpriteNode spriteNodeWithImageNamed:@"right"];
    leftButton.position = CGPointMake(60, 20);
    leftButton.name = @"rightButton";
    leftButton.zPosition = 1.0;
    return leftButton;
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];

    if([node.name isEqualToString:@"leftButton"])
    {
             [mainCharacter.physicsBody applyImpulse:CGVectorMake(-120, 0)];
    }

    else if([node.name isEqualToString:@"rightButton"])
    {
       [mainCharacter.physicsBody applyImpulse:CGVectorMake(120, 10)];
    }
}

12
2018-05-25 01:46


oorsprong


antwoorden:


Als je wilt dat de weergave altijd gecentreerd is op de positie van je speler, pas dan je code aan met deze punten in gedachten:

1) Maak een SKNode en noem deze myWorld, worldNode of een andere naam als deze.

2) Voeg de worldNode toe [self addChild:worldNode];

3) Voeg alle andere knooppunten toe aan de worldNode, inclusief uw speler.

4) In de didSimulatePhysics methode, voeg deze code toe:

worldNode.position = CGPointMake(-(player.position.x-(self.size.width/2)), -(player.position.y-(self.size.height/2)));

Je beeld zal nu altijd gecentreerd zijn op de positie van je speler.

Update mei 2015:

Als u een kaart gebruikt die met Tiled Map Editor is gemaakt, kunt u de gratis gebruiken SKAToolKit-framework. Functies omvatten speler camera automatisch volgen, test speler, test HUD en sprite knoppen.


22
2018-05-25 14:44