Bienvenidos sean a este post, continuaremos con lo creado en el post anterior pero hoy veremos algunas acciones sobre las fisicas un poco mas avanzadas.
En nuestro proyecto vamos a agregar dos nuevos objetos para ello primero crearemos sus sprites, el primer sprite sera un triangulo con un tamaño de 32×32, lo llamaremos spr_triangulo, lo haremos con el editor interno para no complicarlo mucho, les dejo un ejemplo

Al igual que en el post anterior no modificaremos su mascara de colision pero recuerden modificar su origen a Middle Centre, para el segundo sprite vamos a crear un rectangulo, lo llamaremos spr_rectangulo, le definiremos un tamaño de 96×16, usaremos nuevamente el editor interno, les dejo un ejemplo

Al igual que en el caso anterior no modificaremos la mascara de colision pero su origen lo haremos de Bottom Centre a diferencia del anterior, nuestro siguiente paso sera crear los objetos para los sprites, los cuales llamaremos obj_triangulo y obj_rectangulo a los cuales les asignaremos los sprites respectivamente, en estos objetos tildaremos la opcion de Use Physics, presionaremos la opcion de Physics, en este caso modificaremos la densidad (Density) del objeto del triangulo a 0.0 pero no la de rectangulo, esto lo hacemos porque queremos que nuestro triangulo no se mueva y se quede sobre el piso, ya veremos el motivo, lo siguiente sera modificar la forma de colision, presionamos el boton para esto en el objeto del triangulo y seleccionaremos la forma Convex Shape y presionaremos los tres puntos que forman al triangulo, les dejo como debe quedar

Por ultimo debemos verificar que la forma de colision del objeto rectangular este creado y coincida con el sprite, si coincide y no hace falta modificarlo prosigamos con el tema de hoy.
Nuestra siguiente modificacion sera agregar los elementos que creamos y tambien vamos a agregar unos bloques para crear «paredes» en nuestro room, tambien eliminaremos a la pelota que agregamos en el post anterior, les dejo una imagen de como lo hice para este proyecto

Con todo esto realizado vamos a la parte del codigo del proyecto, para ello vamos a ir al objeto pelota y agregaremos un nuevo evento, en este caso uno de colision para el objeto pelota y muy pronto veremos porque, una vez hecho agregaremos el siguiente codigo:
physics_apply_force(x, y , 0,
-1000 * (other.y - (other.sprite_height /2)
- y))
En este caso volvemos a usar la funcion para aplicar una fuerza en las fisicas, la unica diferencia con el caso anterior sera el tema de la fuerza sobre el eje Y, en este caso usaremos un valor de -1000 Newtons y a este lo multiplicaremos por la diferencia obtenida entre el eje Y del otro objeto, la mitad del tamaño del otro sprite y nuestro eje Y, esto lo hara rebotar en direccion opuesta pero ya veremos mas adelante porque es esto necesario, nuestro siguiente paso sera crear un nuevo objeto pero de control al cual llamaremos obj_control, una vez creado le agregaremos un evento de tipo Step, con el evento creado agregaremos el siguiente codigo:
if (mouse_check_button_pressed(mb_left))
{
if (instance_count > 200)
{
for(i = 0; i < instance_count; i++)
{
if (instance_id[i].y < -32 ||
instance_id[i].y > room_height ||
instance_id[i].x < 0 ||
instance_id[i].x > room_width)
{
with(instance_id[i]) instance_destroy();
break;
}
}
}
instance_create_depth(mouse_x, mouse_y, 0, obj_pelota);
}
En este caso tenemos un condicional que verifica si presionamos el boton izquierdo del mouse, en este caso lo usaremos para crear una nueva instancia del objeto pelota en pantalla, para ello usaremos la ubicacion actual del cursor al presionar en el nivel pero antes tenemos un condicional que verifica si la cantidad de instancias es mayor a 200, en caso de ser verdadero usaremos un bucle for para pasar todas las instancias pero usaremos un condicional donde verificaremos si esta instancia cumple alguna de las siguientes condiciones:
- Verificamos si el eje Y esta por arriba del room
- Verificamos si el eje Y esta por debajo del room
- Verificamos si el eje X esta fuera del lado izquierdo del room
- Verificamos si el eje X esta fuera del lado derecho del room
Como pueden ver este condicional es para verificar si alguna de las instancias de las pelotas creadas se encuentra por fuera del room, en cualquiera de las condiciones si se cumple destruimos dicha instancia y usamos un break para salir del bucle, con esto hicimos un evento para crear pelotas en nuestro room y que las mismas no superen las 200 instancias, nuestro siguiente paso sera unir al rectangulo con el triangulo.
Para ello debemos ir al objeto del triangulo, en este crearemos un evento de tipo Create al cual le agregaremos el siguiente codigo:
physics_joint_revolute_create(id, obj_rectangulo,
x, y, 0, 0, false, 0, 0, false, false);
Esta funcion proporcionara un punto de anclaje comun entre dos objetos permitiendo tener un movimiento delimitado entre ambos, para nuestro caso trabajara como un columpio, pasemos a hablar sobre los distintos parametros que tendremos:
- La primera instancia
- La segunda instancia
- La coordenada del eje X de la union en el mundo del juego
- La coordenada del eje Y de la union en el mundo del juego
- El minimo del angulo de la union
- El maximo del angulo de la union
- Si habilitamos el limite del angulo o no
- El torque maximo del motor
- La velocidad a la que el motor debera rotar
- Establece si el motor debe estar activo o no
- Establece si las instanciar pueden colisionar o no
Nota: Cuando hablamos de torque nos referimos al limite maximo de revoluciones del motor.
Con esto establecimos el punto de union de nuestras ultimas dos instancias y con todo establecido solo nos resta agregar al objeto de control, obj_control, en nuestro room, compilarlo y ver como funciona mediante el siguiente video
En el video podemos ver como se generan las pelotas a medida que presionamos el boton izquierdo del mouse, como reaccionan con el piso, como reaccionan contra otras pelotas y como funcionan con el columpio, antes de terminar les dejo el proyecto realizado
En resumen, hoy hemos agregado mas elementos a nuestro engine de fisicas, hemos visto como trabajar con colisiones del mismo elemento, hemos visto como crear instancias con el boton del mouse, tambien hemos visto una funcion que permite unir en un punto a dos instancias para poder trabajar de otra forma, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
