SpriteKit: hacer que un personaje se mueva en un mundo
Frecuentes
Visto 3,158 veces
0
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!
3 Respuestas
0
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.
=> 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
0
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
0
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 ios objective-c xcode sprite sprite-kit or haz tu propia pregunta.