Hemos recorrido un largo camino en esta guía para principiantes a la programación orientada a objetos, discutiendo los principios de cohesión, acoplamiento, encapsulamiento, y abstracción. En este artículo final, discutiremos el principio OOP de herencia y sus usos en el desarrollo de juegos..
Nota: Aunque este tutorial está escrito con Java, debería poder usar las mismas técnicas y conceptos en casi cualquier entorno de desarrollo de juegos.
La herencia es el principio de la jerarquía de clases. Es la capacidad de un objeto para asumir los estados, comportamientos y funcionalidad de otro objeto..
Un ejemplo real de herencia es la herencia genética. Todos recibimos genes de nuestros padres que luego definen quiénes somos. Compartimos las cualidades de nuestros padres, y al mismo tiempo son diferentes de ellos..
Los objetos en OOP pueden hacer lo mismo. Las clases primarias pueden tener clases secundarias (también conocidas como superclases y subclases, respectivamente) que pueden tener las mismas propiedades de la clase principal y pueden definir nuevos estados, comportamientos y funcionalidades propias..
Como ejemplo, considere la siguiente clase que podría usarse como clase principal para diferentes formas:
Clase pública Forma protegido int altura; ancho int protegido; Forma pública (int h, int w) altura = h; ancho = w; public int area () return altura * ancho; public int getHeight () return height; public int getWidth () ancho de retorno; public void setHeight (int h) return height; public void setWidth (int w) ancho de retorno;
Para extender esta clase para implementar un triángulo, se vería así:
clase pública Triángulo extiende Forma triángulo público (int h, int w) super (h, w); public int area () return super.area () / 2;
Triángulo
tiene todos los mismos estados y funciones que Forma
, pero redefine el zona()
función para devolver el área adecuada de una Triángulo
(media base veces la altura).
La palabra clave súper
se utiliza para hacer referencia a la superclase y cualquiera de sus estados y funciones. Por eso podemos usar súper()
llamar al constructor de la superclase y super.area ()
llamar al zona()
Función de la superclase. Entonces, en este caso, super.area ()
devoluciones anchura altura
.
los protegido
La palabra clave es el último modificador de nivel de acceso. Actúa como el modificador de nivel de acceso privado, pero también permite que cualquier subclase tenga acceso a la variable o función..
Como puede ver, la herencia puede ayudar enormemente a reducir la redundancia de código entre objetos similares al tomar lo que esos objetos tienen en común y colocarlos en un lugar. Esto también crea un código más mantenible porque ayuda a cumplir con el principio de SECADO y evita el efecto de onda en los cambios de código..
Si todo esto parece familiar, es probable que la abstracción tenga beneficios muy similares (al igual que la mayoría de los otros principios de la POO). La abstracción está estrechamente relacionada con la herencia, ya que una clase abstracta puede usarse como una superclase para crear subclases. La única diferencia entre una clase abstracta y una clase normal es que una clase abstracta no se puede usar para crear un objeto.
Volvamos a nuestros tres juegos una vez más para describir cómo aplicar la herencia..
Recuerde que definimos una clase abstracta para mover objetos a través de una pantalla. Recuerda también que definimos un Enviar
Clase para el objeto de la nave. Para aplicar la herencia a los asteroides, podemos tener la Enviar
clase extender el Móvil
clase de la siguiente manera:
/ ** * La clase de barco * / clase pública El barco extiende Movable / ** * Función para girar el barco * / public void rotate () // Código que hace girar el barco / ** * Función para disparar * / público void fire () // Code to fire
El código necesario para mover el barco está cuidado en el Móvil
clase abstracta, por lo que podemos eliminarlo de la Enviar
clase. Todos los demás objetos para asteroides también podrían heredarse de la Móvil
clase, lo que hace que sea extremadamente fácil cambiar la forma de mover un objeto.
Una cosa a tener en cuenta sobre la herencia es la capacidad de tener herencia múltiple, o la capacidad de una clase para heredar de varias clases al mismo tiempo. Algunas lenguas lo permiten, otras no..
Java es uno de los lenguajes que no permite la herencia múltiple. Por lo tanto, no se puede heredar el objeto Ship tanto de un Movible
clase y un Dibujable
clase.
La herencia se puede aplicar a Tetris al tener el Tetrimino y todos los elementos visuales del juego heredados de la Dibujable
Clase, que definimos en el último artículo..
Recuerde que para Pac-Man identificamos sus objetos: Pac-Man, un Fantasma y un pac-dot. A lo largo de esta serie, solo hemos discutido estos tres objetos y hemos postergado mencionar algo sobre la última pieza crítica de Pac-Man: el granulado de poder. Con la herencia, ahora estamos listos para hablar de ello..
Una bolita de poder es un pac-dot especial que permite a Pac-Man comer fantasmas. Sus estados y comportamientos son exactamente iguales a los de un punto de pac, siendo la única diferencia realmente su tamaño y la capacidad de parpadear (recuerde que para mantener el juego débilmente acoplado, queremos que otra clase monitoree cuándo se consume una gran cantidad de energía). activa el cambian de estado()
método de los fantasmas). Esto es cuando la herencia es útil.
Dado que un pac-dot y power pellet son prácticamente el mismo objeto, podemos crear un PowerPellet
clase que extiende el PacDot
clase. los PowerPellet
la clase solo tendría que modificar algunos estados para agrandarla y agregar el comportamiento de crecer y encogerse para crear un efecto de parpadeo. Y eso es todo: ahora tenemos una bolita de poder con poco trabajo adicional. No está nada mal.
El código de cómo se vería esto podría ser el siguiente:
/ ** * La clase Pac-dot * / la clase pública PacDot extiende Drawable protected int size; puntaje int protegido; PacDot público () tamaño = 10; puntuación = 10; / ** * Devuelve el valor del pac-dot para agregar a la puntuación del jugador cuando se consume * / public int getScore () return score; / ** * Devuelve el tamaño del pac-dot * / public int getSize () return size; / ** * La clase de Power Pellet * / clase pública PowerPellet extiende PacDot private int sizeModifier; // no es necesario definir el tamaño y la puntuación porque // ya están definidos en PacDot: PowerPellet los hereda. PowerPellet público () tamaño = 20; puntuación = 50; sizeModifier = -2; / ** * La función de parpadeo que se llamaría cada vez que se dibuje el pellet de energía *. Cambia el sizeModifier para simular un efecto de parpadeo * / public void blink () size + = sizeModifier; si < 10 || size > 20) sizeModifier = -sizeModifier;Vale la pena mencionar que para ayudar a mantener un registro de todas nuestras clases y la herencia de clases de Pac-Man, puedes usar un diagrama de clase para ver visualmente cómo todo está relacionado..
La herencia es muy útil para crear un código más mantenible porque nos permite crear objetos similares sin duplicar el código entre ellos. También ayuda a crear código organizado mostrando jerarquía de clases.
¡Y eso es! Ahora hemos terminado con la serie OOP aquí en Gamedevtuts +. Espero que hayas disfrutado de estos artículos y que te hayan ayudado a comprender mejor cómo se pueden aplicar los principios de OOP al desarrollo de juegos. Asegúrese de seguirnos en Twitter, Facebook o Google+ para mantenerse al día con las últimas publicaciones..