Realizando sus propios cálculos de física para una colisión en Sprite Kit
collision-detection sprite-kit (3)
No estoy seguro de si esto es exactamente lo que estás tratando de hacer, pero si quisiera calcular los resultados de las colisiones sin la ayuda de SpriteKit mientras dejo todas las otras características físicas a SpriteKit, haría lo siguiente:
- Deje la propiedad
dynamic
siempre establecida enYES
. - Establezca la propiedad
categoryBitMask
para cada tipo de objeto. - Establezca la propiedad
collisionBitMask
para un objeto a la disyunción de todas las categorías BitMasks para las que desee conservar los cálculos de colisión automática (por ejemplo, paredes, pero no otros objetos), o simplemente a cero, si desea manejar todas las colisiones manualmente. - Establezca la propiedad
contactTestBitMask
para un objeto en cualquier cosa para la que desee calcular las colisiones manualmente. - Calcule y configure todas las velocidades resultantes en
didBeginContact
.
(En resumen, excluya sus objetos de su propia collisionBitMask
).
Este enlace puede ser útil: Trabajar con colisiones y contactos
Intento establecer algunas colisiones elásticas con el Kit Sprite. Hay un problema con el caso de múltiples objetos que descansan uno cerca del otro, como pregunté en Sprite Kit Physics Collision Issue
Estoy confundido sobre el momento de la situación de una colisión.
Intenté establecer la dynamic
en NO
en -didBeginContact:
delegar el método, calcular las velocidades finales, y luego en -didEndContact:
configurar dynamic
en YES
y luego configurar las velocidades correctamente.
La razón por la que quiero que sea dinámica fuera de la colisión es porque quiero que esté disponible la fricción / gravedad, etc. ¿Qué está mal con el orden / lógica? Miré el método -didSimulatePhysics
, pero no parecía el camino a seguir.
Use applyImpulse en lugar de setVelocity. Desea utilizar impulsos o fuerzas para garantizar que el motor de física pueda calentarse correctamente. Usar setVelocity producirá resultados impredecibles para objetos muy cercanos o superpuestos.
Asegúrese de que haya alguna distancia entre los objetos y que no se superpongan.
Configure las máscaras de bits de colisión correctamente.
Esto debería funcionar a la perfección.
Intento establecer algunas colisiones elásticas con el Kit Sprite
Creo que estás malinterpretando la física en juego aquí. Una colisión elástica es una simplificación excesiva de una colisión. En realidad, ninguna colisión resulta en una transferencia perfecta de energía. He explicado la física aquí en una respuesta a la pregunta relacionada a la que vinculó.
Sospecho que al leerlo verás que se puede hacer una colisión "elástica" en SpriteKit, pero la mayoría de las personas no se dan cuenta de que necesitas espacio entre los objetos. No deberías necesitar hacer tus propios cálculos de física.