SpriteKit – physicsBody no respetando el borde

Tengo este object que tiene un cuerpo físico creado a partir de un path.

Todo el área de la escena (= toda la pantalla) en sí misma es el límite desde donde este object no debe escaping.

El límite de esta escena está definido por

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 

Todo funciona casi como se esperaba. El object choca y rebota en los bordes y está restringido por ellos la mayor parte del time, pero si insiste varias veces, disparando el object con un impulso alto al borde, el object eventualmente no respetará el borde y se escapingá, lo que probablemente sea otro error de SpriteKit.

La class de object init es así:

 self.physicsBody.dynamic = YES; CGFloat offsetX = self.frame.size.width/2.0f; CGFloat offsetY = self.frame.size.height/2.0f; CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, 60 - offsetX, 79 - offsetY); CGPathAddLineToPoint(path, NULL, 96 - offsetX, 69 - offsetY); CGPathAddLineToPoint(path, NULL, 124 - offsetX, 44 - offsetY); CGPathAddLineToPoint(path, NULL, 120 - offsetX, 23 - offsetY); CGPathAddLineToPoint(path, NULL, 85 - offsetX, 0 - offsetY); CGPathAddLineToPoint(path, NULL, 62 - offsetX, 3 - offsetY); CGPathAddLineToPoint(path, NULL, 37 - offsetX, 19 - offsetY); CGPathAddLineToPoint(path, NULL, 12 - offsetX, 29 - offsetY); CGPathAddLineToPoint(path, NULL, 3 - offsetX, 39 - offsetY); CGPathAddLineToPoint(path, NULL, 7 - offsetX, 58 - offsetY); CGPathAddLineToPoint(path, NULL, 27 - offsetX, 46 - offsetY); CGPathAddLineToPoint(path, NULL, 36 - offsetX, 61 - offsetY); CGPathCloseSubpath(path); self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path]; self.physicsBody.restitution = 0.0f; self.physicsBody.usesPreciseCollisionDetection = YES; 

¿Qué medidas puedo hacer para detectar eso y evitar que el object salga de la pantalla?

Gracias.

No rastrea los puntos, pero parece que tienes un polígono no convexo o uno donde los vértices no siguen el enrollamiento en sentido contrario a las agujas del reloj, o ambos. Asegúrese de que la forma sea convexa y que el order de vértice (bobinado) esté en el sentido contrario a las agujas del reloj.

Si esta forma está destinada a ser un cuerpo estático (no mobile) solo para la detección de colisiones, puede usar bodyWithEdgeLoop o bodyWithEdgeChain donde el enrollamiento y la forma convexa no importan.

PD: no te olvides de liberar la ruta:

 CGPathRelease(path);