Por si no sabeis lo que es: https://es.wikipedia.org/wiki/Leyes_de_Newton#Tercera_Ley_de_Newton_o_Principio_de_acci.C3.B3n_y_reacci.C3.B3n
Básicamente que por cada acción hay una reacción. Si yo tengo un objeto que se impulsa en otro para salir despedido (Como puede ser un cohete) como hago que el segundo objeto subra la misma fuerza hacia el otro lado.
Creo que podría averiguar en que dirección se encuentra el objeto con phy_rotation y aplicarle fuerza con physics_apply_force. Pero si el objeto es irregular, ¿Desde que punto creo la fuerza?
Es decir, en el caso en el que sepa en que dirección se encuentra el punto donde tengo que aplicar la fuerza, ¿Como le saco las coordenadas? Descargaos el archivo con un ejemplo de como propongo aplicar esta fuerza.
Cita de: venus en Octubre 27, 2015, 07:29:43 PM
Creo que podría averiguar en que dirección se encuentra el objeto con phy_rotation
No serviría. phy_rotation funciona de manera similar a image_angle, pero en objetos con física. En la imagen de ejemplo el objeto rojo puede tener una rotación de 0, y eso no significa que haya aplicar una fuerza o mejor dicho,
un impulso (local) en un ángulo igual a 0. phy_rotation sirve para establecer un ángulo de GIRO a una instancia, no para determinar la dirección de una instancia respecto de otra.
Para saber en qué dirección se encuentra un objeto se puede usar la función de toda la vida: point_direction() pero esto no sería estrictamente necesario estando en un entorno de física (leer más abajo)
Cita de: venus en Octubre 27, 2015, 07:29:43 PM
en el caso en el que sepa en que dirección se encuentra el punto donde tengo que aplicar la fuerza, ¿Como le saco las coordenadas?
Para esto habría varios métodos, todos con cierto grado de "truculencia" debido a que el objeto es irregular. Se me ocurren varios, pero esto tampoco es necesario ya que el propio motor Box2D incluye variables para saber la dirección de empuje/impulso entre dos instancias que colisionan. Más información:
http://docs.yoyogames.com/source/dadiospice/002_reference/physics/physics%20variables/phy_col_normal_x.html
http://docs.yoyogames.com/source/dadiospice/002_reference/physics/physics%20variables/phy_col_normal_y.html
Si es un impulso, es decir, si la fuerza que se aplica a la roca no es continua y sólo ocurre en un instante infinitesimal, justo en el momento en el que el cohete se separa de la roca, se podría usar la función physics_apply_impulse, tomando como origen del impulso las coordenadas del punto de propulsión del cohete en ese momento, y como componentes del impulso el vector negado de la fuerza que se aplica al cohete.
Pero si el empuje aplicado a la roca es continuo y no ocurre cuando está en contacto con el cohete, sino cuando está en contacto con el fuego que sale de este, entonces se debería hacer la simulación de un fluido. Afortunadamente GMS integra el paquete Liquid Fun. No lo he utilizado aun, pero no parece tan complicado.
Veré si puedo hacer unos ejemplos.
El impulso es momentaneo, no lo provoca el fuego. Pero suena interesante lo que has dicho, puedes poner un ejemplo si consigues hacerlo.
No se como implementar lo que me has dicho, penumbra. Creo que no entiendo bien como funciona.
with (obj_roca) {physics_apply_local_impulse(0, 0, obj_cohete.phy_col_normal_x, obj_cohete.phy_col_normal_y)}
Para que funcione el código, los dos objetos deben estar en contacto, si el cohete está un poco alejado ya no tiene efecto.
Se me ocurrió otra solución, justo antes de separar el cohete de la roca, se podría aplicar un impulso hacia atrás al cohete para que empuje a la roca, y después una fuerza hacia adelante para que se mueva normalmente. Hay que tomar en cuenta la masa de la roca para que la magnitud del impulso sea capaz de moverla, también se debería poner la restitución al mínimo para que el cohete no rebote con demasiada fuerza.
Unas preguntas, ¿cómo está unido el cohete a la roca al principio?, ¿hay una fuerza de gravedad?
Hay fuerza gravitatoria empujando hacia abajo. Pero solo afecta al cohete. Por eso están unidos.