Bienvenidos sean a este post, en el post anterior agregamos al objeto del jugador pero hoy nos centraremos en los enemigos.
Hasta ahora hemos creado objetos que no son como los objetos de un lenguaje OOP, Programacion Orientada a Objetos por sus siglas en ingles, sino como un elemento mas de nuestro juego pero GML tiene la posibilidad de trabajar como estos tipos de lenguaje, y en este caso todos los elementos de nuestro juego pueden ser utilizados como objetos, es decir que los objetos, rooms, sprites, sonidos y todo lo que tenemos dentro del mismo se consideran objetos para el lenguaje, pero que es realmente un objeto?
Un objeto para el lenguaje no deja de ser un espacio en memoria donde estan almacenados todas las caracteristicas del mismo, en este caso los datos, las variables o los eventos que posee el mismo
El Tinchicus
Si fueron observadores durante la creacion de nuestros proyectos cuando creabamos un elemento en el Asset Browser podriamos decir que era un tipo de clase, una explicacion basica seria decir que es un molde, y las veces que se agregaban dichos objetos o clases en el room este generaba instancias automaticamente de dicho «molde», las personas que conozcan un poco mas de programacion saben que las instancias que se crean a partir de una clase son denominadas como objetos habitualmente, y como mencionamos anteriormente estos son solo espacios de memoria que almacenan el contenido que asignamos a cada uno, y si bien no todos son iguales ya que algunos permiten manejar algunas caracteristicas y otras no todo esto nos permitira pasar al siguiente nivel.
Con la aclaracion de que los objetos son solamente espacios reservados en memoria podemos hacer que nuestros objetos contengan otros objetos, para el que sabe un poco de programacion conoce el concepto de herencia donde tenemos una clase Padre o Maestra y de este tenemos clases hijas o esclavas de la misma, las cuales heredan todas las caracteristicas de la clase superior, la herencia siempre va hacia abajo nunca para arriba y las clases hijas pueden convertirse en padres siguiendo con la linea de herencia, y como esto tambien nos permite agrupar objetos en lugar de verificar la colision de cada uno de los enemigos podemos verificar la colision con una clase padre y asignarlo a sus respectivos hijos, esto es lo que veremos en este proyecto.
Con todo esto aclarado vamos a continuar con nuestro proyecto, para ello primero crearemos un objeto para nuestro enemigo, tal como lo vinimos haciendo hasta ahora, lo llamaremos obj_Enemigo, luego le asignaremos el sprite que creamos para representarlo en este post, por ahora no haremos nada mas, lo siguiente sera crear un nuevo objeto la que llamaremos clase_enemigo, la cual hara de padre para el objeto enemigo, una vez creado nuestro nuevo objeto a la misma manera anterior, no tendra ningun sprite asignado pero si le agregaremos un evento Step, una vez generado le agregaremos el siguiente codigo:
if (x < 0 || x > room_width || y < 0 ||
y > room_height || ps < 1)
instance_destroy();
En este caso agregamos un condicional donde verifica si el eje X y el eje Y sea menor a 0, o que ambos ejes sean mayor al ancho y alto del nivel o room, o que el valor de ps sea menor a 1, ps sera una variables de los hijos para establecer su salud o energia, en todo caso si se cumplen alguna de las condiciones anteriores procede a eliminar la instancia, con esto establecido pasaremos a crear el parentesco, para ello debemos volver al objeto obj_Enemigo y debemos usar la opcion Parent

Una vez presionado nos abrira una nueva ventana

En esta nueva ventana clickearemos en No Object donde nos aparecera un nuevo cuadro para elegir el objeto que relacionaremos como padre, para ello vamos a Objects -> clase_enemigo, una vez seleccionado nos quedara el objeto obj_enemigo de la siguiente manera

Observen como nos quedo la clase padre (Parent) y vean como «heredamos» el evento Step proveniente de la clase padre, y automaticamente en la clase padre debera quedar de la siguiente manera

Como pueden ver ya se creo la relacion de parentesco entre ambos, con esto terminado continuaremos con nuestro objeto del enemigo, no la clase enemiga, y agregaremos un nuevo evento de tipo Create al cual le agregaremos las siguiente lineas:
puede_disparar = true;
ps = 10;
La primera sera para darle la posibilidad de disparar a nuestros enemigos pero de eso hablaremos mas adelante, la siguiente sera la salud de nuestro enemigo, el siguiente paso sera agregar un evento de Alarma y para este caso usaremos la Alarm 0, una vez creado le agregaremos la siguiente linea:
puede_disparar = true;
Todo esto que hicimos nos servira para mas adelante, lo siguiente sera hacer que nuestra nave rote a medida que se desplaza y para ello utilizaremos el siguiente codigo dentro del evento Step:
event_inherited();
if (ps < 1)
instance_destroy();
if (image_angle < 358)
{
image_angle += 2;
}
else
{
image_angle = 0;
}
La primer linea sera la encargada de seguir utilizando los eventos que heredamos de la clase madre o padre, depende de su nivel de patriarcado xD, que se puede hacer de dos formas, la primera es por medio de la funcion que se ve en el codigo, event_inherited, o por nedio del boton derecho y seleccionar la opcion Inherit event que significa Heredar evento tal como se ve en la siguiente imagen

Esta accion nos agregara la primer linea de nuestro codigo, la opcion anterior abre el codigo de la clase Padre, la siguiente opcion anula el codigo del evento heredado con uno nuevo, esto es muy similar a cuando hablamos de sobrecarga porque nosotros podemos necesitar que muchos objetos creados de la clase utilicen los eventos heredados pero tambien nos puede suceder que algunos objetos necesiten sus propios eventos y con esto los anulamos, en nuestro caso necesitamos las instrucciones del evento maestro pero tambien debemos manejar su propia conducta, con esto aclarado continuemos con el codigo.
Lo siguiente sera un condicional donde verificamos que si la salud de este objeto es menor a 1 procedemos a destruir la instancia que se creo, lo siguiente sera la utilizacion de image_angle para hacer un efecto de rotacion de nuestro objeto, esta tambien es una variable interna del Game engine y se encarga de modificar el angulo de la imagen en el sprite, en este caso trabaja con las mismas coordenadas de cuando hicimos el primer proyecto es decir que 0 sera mirando a la izquierda, 90 hacia arriba, 180 a la derecha y 270 hacia abajo, para este caso lo haremos rotar sutilmente, para ello tenemos un condicional donde verifica que image_angle sea menor que 358 pero porque este valor y no 359? Porque esta variable no comienza a contar desde 1 sino desde 0 y por lo tanto la posicion 358 equivale a 359, en caso de ser verdadero incrementaremos el valor de image_angle en 2, en caso contrario (sea mayor o igual a 358) establecemos que image_angle sea igual a 0 y volvemos a comenzar, esto hara el efecto de rotacion pero por ahora nada mas.
Nota: Pueden agregarlo en el room y probarlo para obtener un enemigo que rota constantemente su sprite pero que por el momento no se desplaza.
En resumen, hoy hemos creado al objeto que sera nuestro enemigo, hemos creado una clase maestra para hacer que nuestros «hijos» tengan evento heredados sin necesidad de estar repitiendo codigo en los mismos, hemos visto como se establece el parentesco, hemos visto como heredar los eventos pero a su vez agregar nuestro propio codigo, proximamente se pondra mas divertido, 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
