En esta tercera entrega, vamos a ver como mover el personaje por el escenario, así como hacer que la cámara lo siga, y que ninguno de los dos se salga del escenario.

Para que la cámara siga el personaje, debemos cambiar el enfoque en nuestro código.Cuando se pulse una tecla, se desplazará el personaje, y después situaremos la cámara dónde esté el personaje.

Organizando el código (Refactoring)

Cómo el código empieza a ser cada vez más grande, y con el objetivo de hacerlo más legible, antes de continuar vamos a hacer algunos cambios en el código.

En la parte privada de TViewMain declara las siguientes funciones para mover el personaje:

Tras declararlas, si pulsas shift+c sobre cada una de ellas, el IDE Lazarus, creará el código correspondiente. Cada una de estas funciones se ocupará de realizar una acción sobre el personaje. En cada una de ellas, se evaluará si se ha pulsado la tecla correspondiente a la acción, en tal caso devolverá TRUE, sino devolverá FALSE. Además cuando la tecla es pulsada, se realizarán ciertas operaciones sobre el personaje.

Veamos el código de las funciones que se encargan de mover el personaje hacia la derecha y la izquierda.


En estas funciones, en el caso que se pulse la tecla correspondiente, aparte de retornar TRUE, se comprobará si el personaje se le ha aplicado alguna rotación. Por defecto el personaje, tal como creamos el sprite, está mirando a la izquierda.

Personaje a 0º

Observa que su ángulo de rotación “Angle(W)” es cero, esto indica que el sprite del personaje “está tal cual”. Ya además no se aplica sobre ningún eje (aunque se aplicara, al ser el ángulo igual a cero no se produciría ninguna rotación).

Si, cambiamos el valor del ángulo a 180 grados, e indicamos que la rotación sea sobre el eje Y, cambiando su valor de cero a uno, el personaje rotará 180 grados sobre su eje Y.

Personaje rotada 180º

Es operación que hemos hecho sobre las propiedades del personaje, es lo que se realiza por código en estas funciones.

Ten en cuenta que los ángulos, en CGE, son en radianes. Por eso se usa la función Deg para convertir un valor en grados a radianes. Esta función está la unidad CastleUtils, por lo cual debemos añadirla para poder usarla.

Así que justo al empezar la implementación añade esta unidad a la clausula uses.

Unidades añadidas en la sección implementación

La función PlayerOnGround, devuelve el estado de la variable OnGround. Define esta variable en la parte privada de TViewMain.


Las funciones restantes, simplemente devolverán si la tecla correspondiente ha sido pulsada.


La variable OnGround, indicará si el personaje está sobre el suelo o no. Necesitamos saber dónde está para activar o desactivar ciertas acciones. Su estado dependerá si el personaje colisiona con el suelo, o deja de colisionar con este. Así que definiremos dos eventos para el suelo, OnCollisionEnter, y OnColisionExit, esto lo haremos evento Start.

Para definir automáticamente los procedimientos asignados a cada evento, puedes pulsar CLTR+C, sobre cada uno de ellos, para que se genere la código correspondiste.

Recuerda que debes definir en la sección Published de TmainView, los elementos que usemos en el código.


Cuando entre en colisión algún objeto con el suelo, se ejecutará Suelo1CollisionEnter, así que dentro de este evento, comprobaremos si el objeto que ha colisionado es nuestro personaje, en tal caso pondremos la variable OnGround a TRUE.

De la misma manera, cuando un objeto deje de colisionar con el suelo, se ejecutará Suelo1CollisionExit, si el objeto que sale de la colisión es el personaje, pondremos la variable OnGround a False.

Reescribir el evento Update

El objetivo de los cambios que vamos a realizar es simplificar el evento Update.

Lo primero que hacemos en guardar en una variable la velocidad actual del personaje.


Luego comprobar si se ha pulsado si el personaje debe ir a la izquierda o la derecha, y si está en el suelo. De esta manera si el personaje no estuviera en el suelo, no se le aplicaría ninguna velocidad en el X, ya que queremos que se desplaza solamente cuando esté en el suelo.

Lo siguiente, es comprobar si se ha pulsado la tecla saltar( jump), y si está en el suelo, se aplica una velocidad en eje Y, que es el eje vertical.

Por último comprobamos que sino se ha pulsado ninguna tecla , y el personaje está en el suelo, ajustamos la velocidad del eje X a cero.

Para terminar, aplicamos la velocidad al personaje.

Ahora debemos actualizar la animación del personaje, en función de su velocidad y si está en el suelo o no.

Por último, guardamos en la variable llamada PosicionCamara, un vector que contiene en el eje X la posición del personaje, y en la coordenada Y, la posición de la cámara. Y eso será posición de la cámara.

Si probamos el juego ahora, veremos que, tanto,el jugador como la cámara se salen del escenario. Para ello, vamos a limitar el movimiento de ambos. Definimos al inicio de la unidad, una clase llamada TLevelBounds.

Esta nos contendrá 4 propiedades, las cuales representaran los límites del escenario.

En su constructor definimos los límites.

Y en el evento OnStart, creamos el objeto.

Usando logging

Para conocer dónde está el jugador en cualquier momento, y así conocer los límites del escenario, use la técnica del logging. Esto es que el juego muestre información en cualquier momento.

Ventana de salida

En la parte de abajo del editor, existe la pestaña Output, está muestra información cuando el juego se inicia. Y también puede mostrar información que nuestro programa quiera.

Añade la unidad castlelog, justo debajo de la implementación.

Clausula uses en la sección de implementación.

Ahora en el evento Press, escribe lo siguiente

Este código mostrará por la ventana output la posición de Arthur.

Ahora, podemos limitar la posición del personaje con las siguiente instrucciones, de nuevo en el evento Update.


Ahora, el personaje no se sale de escenario, pero la cámara si, ya que siempre lo mantiene en el centro. Para evitar este efecto, vamos limitar el movimiento de la cámara, de manera que si su centro, más la mitad de su ancho del campo de visión, es menor o mayor a los límites, corregiremos su posición.

Campo de visión de la cámara.

Debemos obtener el ancho del campo de visión de esta manera:

Recuerda definir es la parte published de la unidad la variable ViewPort1 para acceder al componente ViewPort1 del editor.

Obtenemos la posición de la cámara, centrada en el eje X, con respecto al personaje.

Y antes de asignar la nueva posición a la cámara hacemos unas comprobaciones. Si la posición en el eje X, menos la mitad del ancho es menor del límite izquierdo, cargamos la posición del límite más la mitad del ancho del campo de visión. Hacemos lo mismo para el límite izquierdo.

Y asignamos la nueva posición a la cámara.

Tienes todo el código completo en el Github.

Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.