sprite kit - Establecer un cuerpo físico a una velocidad constante
sprite-kit swift (2)
Además de la respuesta de Steffen (LearnCocos2D), los métodos mencionados en el pseudocódigo se pueden encontrar en este muy buen tutorial de Ray Wenderlich.
static inline CGPoint rwAdd(CGPoint a, CGPoint b) {
return CGPointMake(a.x + b.x, a.y + b.y);
}
static inline CGPoint rwSub(CGPoint a, CGPoint b) {
return CGPointMake(a.x - b.x, a.y - b.y);
}
static inline CGPoint rwMult(CGPoint a, float b) {
return CGPointMake(a.x * b, a.y * b);
}
static inline float rwLength(CGPoint a) {
return sqrtf(a.x * a.x + a.y * a.y);
}
// Makes a vector have a length of 1
static inline CGPoint rwNormalize(CGPoint a) {
float length = rwLength(a);
return CGPointMake(a.x / length, a.y / length);
}
Usan CGPoint
como los parámetros y el valor de retorno, pero esto se puede convertir fácilmente para usar CGVector
.
Estos métodos son muy útiles para los cálculos de física, y encontrará uso para ellos en muchos puntos. Lo mejor es mantener estos métodos en un archivo de encabezado separado y usarlos en el código de todo el proyecto.
Moviendo una pelota con velocidad constante
Traté de hacer una caja de bolas donde las bolas se mueven con velocidad constante. El no debe disminuir la velocidad cuando colisionan entre sí. Creo que he configurado todas las propiedades correctamente pero no funcionó y después de los 30s todas las bolas se detuvieron para moverse.
El cuadro está configurado así:
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody.dynamic = false
self.physicsBody.restitution = 1
self.physicsBody.friction = 0
Las bolas se establecen de esta manera:
¿Es esto un error del motor de física o me falta algo?
Si desea que tengan una velocidad constante todo el tiempo, sin cambios en absoluto, tendrá que establecer su velocidad en un vector de longitud fija en la actualización de SKScene. Los motores físicos no están diseñados para adherirse estrictamente a la ley de conservación de la energía ... o se podría argumentar que parte de la energía se disipa calentando el dispositivo. ;)
Principio general para mantener la misma dirección pero ajustando la longitud / velocidad del vector a un valor fijo (pseudo-código):
CGPoint velocity = somePhysicsBody.velocity;
velocity = normalized(velocity);
velocity = multiply(velocity, desiredSpeed);
somePhysicsBody.velocity = velocity;