iOS – bodyWithPolygonFromPath: Body es igual que la ruta, pero las colisiones no funcionan correctamente

Primero, quiero agradecer a todos los usuarios de este website porque siempre encuentro soluciones aquí y ¡es muy útil!

Estoy tratando de hacer un juego como Xonix, Bix o Jezzball con SpriteKit. De todos modos, tengo una pelota rebotando contra las panetworkinges, y estoy tratando de hacer obstáculos donde no puede ir, esos obstáculos están hechos de CGPathref (el usuario lo hace con sus movimientos)

Estoy usando bodyWithPolygonFromPath para crear el cuerpo físico de skspritenode, está funcionando, pero no siempre. He descargado YMCPhysicsDebugger para ver el contenido del cuerpo, y en todos los casos, está bien, pero he visto que cuando tengo más de 4 puntos en el CGPath, la pelota no choca contra el cuerpo integer, solo choca contra una zona más pequeña … He intentado y buscado mucho sin ningún resultado … He intentado hacer los puntos de CGPath en sentido contrario a las agujas del reloj, no funciona tan bien, incluso en el otro lado …

Te estoy copyndo el código para la creación de SKSpriteNode, pero dudo que sea útil, creo que el problema está en mis puntos, tal vez necesito más explicaciones sobre cómo funciona físicamente el cuerpo con un polígono

SKSpriteNode *zone = [SKSpriteNode spriteNodeWithColor:[UIColor networkingColor] size:CGSizeMake(50, 50)]; zone.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path.CGPath]; // 1 zone.physicsBody.friction = 0.0f; zone.physicsBody.restitution = 0.0f; zone.physicsBody.linearDamping = 0.0f; zone.physicsBody.allowsRotation = NO; zone.physicsBody.categoryBitMask = wallsCategory; zone.physicsBody.dynamic = NO; // 2 [self addChild:zone]; 

Aquí hay dos imágenes de mi "juego", el primero funciona, el balón rebota contra él. El segundo no funciona como debería, solo se detecta la parte superior para la colisión.

http://hpics.li/86a69e2

http://hpics.li/e16d18e

También he intentado detectar cuándo la pelota entra en un obstáculo en la function de actualización para hacer que rebote contra ella, pero, por supuesto, no funciona realmente. Además mis estudios de matemáticas no son tan buenos jajaja

 for(SKSpriteNode *zone in zonesTab) { UIBezierPath *path = [zoneesTab objectAtIndex:i]; // Array of UIBezierPath for the obstacles if(CGPathContainsPoint(path.CGPath, NULL, ball.frame.origin, FALSE)) { ball.physicsBody.velocity=CGVectorMake(ball.physicsBody.velocity.dx*-1, ball.physicsBody.velocity.dy*-1); NSLog(@"Touches iT"); } i++; } 

También he pensado en hacer varios SKSpriteNode cada vez que un CGPath tiene más de 4 puntos, pero realmente no sé cómo hacerlo en matemáticas …

De todos modos, esa es una publicación larga, espero que algunos de ustedes lo lean todo y lo entiendan todo (¡perdón por mi inglés, soy francés!) Y, sobre todo, ¡podrán ayudarme!

Muchas gracias

La forma en la primera captura de pantalla es convexa pero la forma en la segunda captura de pantalla es cóncava.

Las forms del polígono de la física deben ser convexas para que funcionen correctamente. Puedes hacer una de las dos cosas:

  • Crea dos nodos y dos cuerpos cuyas forms individuales son convexas pero juntas forman la forma cóncava. Estos cuerpos pueden ser dynamics. Es posible que desee establecerlos en estáticos o conectarlos junto con una junta de distancia rígida, o de lo contrario asegurarse de que no se separarán.
  • Use bodyWithEdgeLoopFromPath: o bodyWithEdgeChainFromPath: para poder crear forms de colisión cóncava. Estos cuerpos no serán dynamics y no podrán moverse por sí mismos, pero son la solución perfecta para forms de colisión arbitrarias con un campo de juego estático.