¿Es posible rotar un nodo alnetworkingedor de un punto arbitrario en SpriteKit?

¿Hay alguna manera de rotar un Nodo en SpriteKit alnetworkingedor de un punto arbitrario ? Ahora puedo manipular el anchorPoint de anchorPoint de mi nodo, pero eso no es suficiente si el punto de rotation que quiero usar se encuentra fuera del nodo.

introduzca la descripción de la imagen aquí

¿Cuál es la mejor forma de lograr este tipo de rotation en SpriteKit?

Como estás pidiendo la mejor manera, aquí hay una que funciona bien (lo mejor es subjetivo):

Cree un SKNode y establezca su position en el centro de rotation. Agregue el nodo que debe rotar alnetworkingedor de ese centro como hijo al nodo central. Establezca la position del nodo secundario en el desplazamiento deseado (es decir, radio, digamos x + 100). Cambie la propiedad de rotation del nodo central para hacer que los nodos secundarios giren alnetworkingedor del punto central. Lo mismo funciona para cocos2d btw.

También intenté resolver este problema hace algunas semanas y no implementé la solución de puntos de anclaje porque no quería preocuparme por eliminar el punto de anclaje cuando digamos que el object choca con otro nodo y debería abandonar su órbita y rebotar lejos

En cambio, se me ocurrieron dos soluciones, las cuales funcionan si se ajustan. El primero tardó mucho en perfeccionarse y todavía no es perfecto. Se trata de calcular un cierto número de puntos alnetworkingedor de una position central desplazada por un radio establecido, y luego, si un object determinado llega a una cierta distancia del punto central, usará continuamente la física para enviar el object en una ruta de trayectoria a lo largo del " circunferencia "del círculo, puntos que calculó (ver arriba).

Hay dos forms de calcular puntos con un radio

El primero usa el teorema de Pitágoras, y el segundo usa la trigonometría propiamente dicha. En el primero, incrementa un bucle for en cierta cantidad, mientras que es menor que 361 (grado), y para cada iteración del bucle, calcula usando seno y coseno un punto con ese ángulo en un cierto radio desde el punto central .

El segundo usa el teorema de Pitágoras, y su código está a continuación:

Después de calcular los puntos , debe crear un selector progtwigdo [<object> scheduled selector...]; o un timer en su didMoveToView, o use un método de actualización fijo, además de una variable de instancia llamada int, que mantendrá el índice de la siguiente location a la que se moverá su object. Cada vez que se llama al método del timer, moverá el object al siguiente punto en su matriz de puntos de cálculo usando su propio código o el siguiente código labeldo como física; Puede jugar con los valores de la física, e incluso la frecuencia del timer para diferentes efectos de movimiento. Solo asegúrate de que obtienes el índice correcto. Además, para un mayor realismo, usé un método que calcula el punto más cercano en la matriz de punto calculado para el object, que se llama solo una vez que comienza la colisión. También está debajo de la label nearestPointGoTo. Si necesita más ayuda, solo dígalo en los comentarios. ¡Sigue pirateando!

Utilicé el segundo, y aquí está el código fuente para ello:

El código en sí no pasó

Opción de cálculo de segundo punto

 +(NSArray *)calculatePoints:(CGPoint)point withRadius:(CGFloat)radius numberOfPoints: (int)numberOfPoints{ //or sprite kit equivalent thereof // [drawNode clear]; NSMutableArray *points = [[NSMutableArray alloc]init]; for (int j = 1; j < 5; j++) { float currentDistance; float myRadius = radius; float xAdd; float yAdd; int xMultiplier; int yMultiplier; CCColor *color = [[CCColor alloc]init]; //Will be used later to draw the position of the node, for debugging only for (int i = 0; i < numberOfPoints; i += 1){ //You also have to change the if (indextogoto == <value>) in the moveGumliMethod; float opposite = sqrtf( powf(myRadius, 2) - powf(currentDistance, 2) ); currentDistance = i; switch (j) { case 1: xMultiplier = 1; yMultiplier = 1; xAdd = currentDistance; yAdd = opposite; color = [CCColor blueColor]; break; case 2: xMultiplier = 1; yMultiplier = -1; xAdd = opposite; yAdd = currentDistance; color = [CCColor orangeColor]; break; case 3: xMultiplier = -1; yMultiplier = -1; xAdd = currentDistance; yAdd = opposite; color = [CCColor networkingColor]; break; case 4: xMultiplier = -1; yMultiplier = 1; xAdd = opposite; yAdd = currentDistance; color = [CCColor purpleColor]; break; default: break; } int x = (CGFloat)(point.x + xAdd * xMultiplier); //or sprite kit equivalent thereof int y = (CGFloat)(point.y + yAdd * yMultiplier); //or sprite kit equivalent thereof CGPoint newPoint = CGPointMake((CGFloat)x,(CGFloat)y); //or sprite kit equivalent thereof NSValue *pointWrapper = [NSValue valueWithCGPoint:newPoint]; //or sprite kit equivalent thereof NSLog(@"Point is %@",pointWrapper); [points addObject:pointWrapper]; } } return points; } 

Calcular el punto más cercano a object

 -(CGPoint)calculateNearestGumliPoint:(CGPoint)search point { // MY Character is named Gumli float closestDist = 2000; CGPoint closestPt = ccp(0,0); for (NSValue *point in points) { CGPoint cgPoint = [point CGPointValue]; float dist = sqrt(pow( (cgPoint.x - searchpoint.x), 2) + pow( (cgPoint.y - searchpoint.y), 2)); if (dist < closestDist) { closestDist = dist; closestPt = cgPoint; } } return closestPt; } 

Creo que la mejor manera de hacer que esto funcione es a través de dos SKNode y SKPhysicsJointPin con SKPhysicsJointPin (Mira el ejemplo del pin a continuación)

introduzca la descripción de la imagen aquí

Traté de colgar un letrero de la puerta ( SKSpriteNode ) en mi puerta (`SkScene), y me gustaría girar en el lugar donde alguien toca

Lo que hice es hacer un SKNode 1x1 con una masa SKNode e inhabilitar sus efectos de gravedad.

 var doorSignAnchor = SKSpriteNode(color: myUIColor, size: CGSize(width: 1, height: 1)) doorSignAnchor.physicsBody = SKPhysicsBody(rectangleOf: doorSignAnchor.frame.size) doorSignAnchor.physicsBody!.affectedByGravity = false // MAGIC PART doorSignAnchor.physicsBody!.mass = 9999999999 // MAGIC PART var doorSignNode = SKSpriteNode(imageNamed:"doorSign") doorSignNode.physicsBody = SKPhysicsBody(rectangleOf: doorSignNode.frame.size) 

y creó un SKPhysicsJointPin para conectarlos a todos

 let joint = SKPhysicsJointPin.joint( withBodyA: doorSignAnchor.physicsBody!, bodyB: doorSignNode.physicsBody!, anchor: doorSignAnchor.position) mySkScene.physicsWorld.add(joint) 

Entonces se moverá como el letrero real de la puerta, girará alnetworkingedor de un punto arbitrario (doorSignAnchor)

Referencia:

  • Documento oficial sobre sumtoria de la física
  • Cómo hacer cadenas colgantes con las juntas SpriteKit Physis