SpriteKit: hacer que un personaje se mueva en un mundo

Estoy tratando de entender cómo puedes hacer un mundo enorme y hacer que un personaje se mueva dentro del mundo, y luego mueve la parte visible del mundo con el personaje en movimiento. Como el juego de Mario.

Leí la guía de manzanas aquí: https://developer.apple.com/library/IOs/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Actions/Actions.html#//apple_ref/doc/uid/TP40013043-CH4-SW32

sobre "centrar la escena en un nodo", pero realmente no pude entenderlo en absoluto. Intenté implementarlo, pero no funcionó en absoluto.

Entonces, ¿alguien puede ayudarme aquí? Un ejemplo completo con algunos buenos comentarios sería genial.

Espero que mi pregunta tenga sentido, ¡gracias por adelantado a todos!

preguntado el 02 de diciembre de 13 a las 08:12

3 Respuestas

Intentan hablar contigo "Tu mundo de juego es un nodo y lo que tienes que hacer es mover el nodo del mundo con tu personaje". Juego "Adventure": el juego de ejemplo para Sprite Kit te ayudará mucho a crear un mundo enorme como ese.

https://developer.apple.com/LIBRARY/IOS/documentation/GraphicsAnimation/Conceptual/CodeExplainedAdventure/AdventureArchitecture/AdventureArchitecture.html

=> Hay código de ejemplo de este juego en el documental.

Además, puede crear un "mapa de mosaicos" para hacer lo mismo.

Respondido el 02 de diciembre de 13 a las 10:12

Yo uso una clase simple AGMovingNode, heredado de SKNode como capa de fondo.

No es perfecto, pero al menos puedes empezar desde donde.

Aquí hay un código de la clase:

AGMovingNode.h:

#import <SpriteKit/SpriteKit.h>

@interface AGMovingNode : SKNode

@property float pointsPerSecondSpeed;

- (instancetype)initWithPointsPerSecondSpeed:(float)pointsPerSecondSpeed;
- (void)update:(NSTimeInterval)currentTime paused:(BOOL)paused;

@end

AGMovingNode.m:

#import "AGMovingNode.h"

@implementation AGMovingNode
{

    NSTimeInterval _lastUpdateTime;
    NSTimeInterval _deltaTime;

}

- (instancetype)initWithPointsPerSecondSpeed:(float)pointsPerSecondSpeed {
    if (self = [super init]) {
        self.pointsPerSecondSpeed = pointsPerSecondSpeed;
    }
    return self;
}

- (void)update:(NSTimeInterval)currentTime paused:(BOOL)paused {
    if (paused) {
        _lastUpdateTime = 0;
        return;
    }
    //To compute velocity we need delta time to multiply by points per second
    if (_lastUpdateTime) {
        _deltaTime = currentTime - _lastUpdateTime;
    } else {
        _deltaTime = 0;
    }
    _lastUpdateTime = currentTime;

    CGPoint bgVelocity = CGPointMake(-self.pointsPerSecondSpeed, 0.0);
    CGPoint amtToMove = CGPointMake(bgVelocity.x * _deltaTime, bgVelocity.y * _deltaTime);
    self.position = CGPointMake(self.position.x+amtToMove.x, self.position.y+amtToMove.y);
}
@end

Lo encontré en uno de los tutoriales (no recuerdo cuál en este momento) y lo modifiqué ligeramente.

Respondido el 02 de diciembre de 13 a las 10:12

Lo encontré mejor si usas SKActions para mover objetos.

Lo que hago es tener un método para reposicionar a mi personaje también con animaciones de sprites (cuando está de pie y cuando camina):

- (void)moveUser:(CGPoint)position {
  SKSpriteNode *user = (SKSpriteNode*)[self childNodeWithName:@"userSprite"];

  // ... some logic to load correct atlas
  NSArray *animationFrames = ...

  SKAction *animation = [SKAction animateWithTextures:animationFrames timePerFrame:0.05f numberOfFrames:animationFrames.size];
  SKAction *moveToPositionAction = [SKAction moveTo:position duration:0.4f];

  [userNode runAction:[SKAction group:@[animation,moveToPositionAction]]];
}

Respondido el 19 de diciembre de 13 a las 10:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.