Esquema

Colegio Valladolid de Guatemala. Prácticas Supervisadas. Director: Licenciada Aura Consuelo Morales Álvarez. Asesor: Enr

Views 156 Downloads 5 File size 14MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Colegio Valladolid de Guatemala. Prácticas Supervisadas. Director: Licenciada Aura Consuelo Morales Álvarez. Asesor: Enrique Pérez

Juego acerca de la nutrición.

CORTEZ SANCHEZ, ISMAR LEONEL. Mixco, Guatemala  22 de septiembre de 2020.

Índice Introducción.......................................................................................................................................4 1.Planteamiento de proyecto.............................................................................................................5 2.Cronograma....................................................................................................................................6 2.1. Proyecto 1. Juego en RPG Maker MV (Cancelado)......................................................................6 2.1.1. jueves 3 de septiembre de 2020...........................................................................................6 2.1.2. viernes 4 de septiembre de 2020.........................................................................................6 2.1.3. sábado 5 de septiembre de 2020.........................................................................................6 2.1.4. domingo 6 de septiembre de 2020.......................................................................................6 2.1.5. lunes 7 de septiembre de 2020............................................................................................7 2.1.6. martes 8 de septiembre de 2020..........................................................................................8 2.1.7. miércoles 9 de septiembre de 2020.....................................................................................9 2.1.8. jueves 10 de septiembre de 2020.........................................................................................9 2.1.9. viernes 11 de septiembre de 2020.....................................................................................10 2.2. Proyecto 2. Elaboración de un juego tipo Flappy bird para dispositivos móviles......................11 2.2.1. sabado 12 de septiembre de 2020.....................................................................................11 2.2.2. domingo 13 de septiembre de 2020...................................................................................15 2.2.3. lunes 14 de septiembre de 2020........................................................................................17 2.2.4. martes 15 de septiembre de 2020......................................................................................24 2.2.5. miércoles 16 de septiembre de 2020.................................................................................24 2.2.6. jueves 17 de septiembre de 2020.......................................................................................26 2.2.7. viernes 18 de septiembre de 2020.....................................................................................41 2.2.8. sábado 19 de septiembre de 2020.....................................................................................51 2.2.9. domingo 20 de septiembre de 2020...................................................................................75 3. Recursos.......................................................................................................................................77 4.Estimación de presupuesto...........................................................................................................81 5.Desarrollo......................................................................................................................................82 5.1. Diagramas y algoritmos.........................................................................................................82 5.1.1.Sprites utilizados.............................................................................................................82 5.1.2.Diagrama del viewport....................................................................................................84 5.1.3.Diagrama en el cual se ejemplifica el Viewport y la ejecución de los tubos de forma random en tamaño...................................................................................................................85 5.2. Códigos..................................................................................................................................85

5.2.1.Código de la clase State...................................................................................................85 5.2.2.Código de la clase Flappy Bird en Android Studio...........................................................86 5.2.3. Código de la clase GameStateManager..........................................................................87 5.2.4.Código de la clase MenuState.........................................................................................87 5.2.5. Código de la clase PlayState...........................................................................................89 5.2.6. Código de la clase Bird....................................................................................................92 5.2.7. Código de la clase Tube..................................................................................................93 5.2.8. Código de la clase Animation..........................................................................................95 5.2.9. Código del AndroidManifest.xml....................................................................................96

Introducción. En la actualidad, el desarrollo y gestión de tecnologías ha permitido al ser humano poder desenvolverse de una manera adecuada en relación con su entorno, con las propiedades de la naturaleza y con una amplia extensión en diversos aspectos de la vida del ser humano en la cuales se desarrolla a través de la educación, la nutrición, la vida cotidiana, la salud, la seguridad, entre otros. Siendo que la tecnología y su amplitud han permitido que todo esto sea posible, han permitido, que el ser humano posea herramientas de entretenimiento, y de aprendizaje como tal. Una de las ramas de la tecnología, tiene su énfasis en el entretenimiento y esto deriva en lo que conocemos como videojuegos. Los cuales a lo largo de los años han ganado notoriedad, no solo por el entretenimiento que los mismos pueden ofrecer, sino también por las posibilidades que ofrecen como herramientas educativas, de salud y de carácter social como tal. Los videojuegos pueden ofrecer diversas posibilidades en relación con la educación y la nutrición. A lo largo de los últimos años, diversos han sido los videojuegos que han brindado posibilidades educativas, en muchas ocasiones con juegos que permiten el movimiento de sus jugadores y causar un efecto positivo en su salud, mientras que otros videojuegos se enfocan en los conocimientos del jugador y en mejorar sus conocimientos o formas en que ven determinados temas, siendo en muchos casos en relación con la nutrición. Por lo cual, el presente objetivo de la gestión, desarrollo del proyecto, es el de desarrollar una aplicación, videojuego, en el cual, de una forma clara y sencilla, las personas puedan comprender o determinar lo negativo de los alimentos, estableciéndose en un proyecto sin fines competitivos o de puntajes, con el único objetivo de comprender de forma clara y sencilla la importancia de una buena nutrición, de los alimentos perjudiciales y como lo más importante será la salud de la persona. El desarrollo de la aplicación móvil pretende que la misma pueda llegar de una manera adecuada a todos aquellos usuarios que tengan un dispositivo móvil, pensando en la accesibilidad del mismo, y la manera en la que todas las personas comprendan los aspectos básicos de la misma, siendo que la misma fue realizada en Android Studio, con la implementación de librería LibGDX y el uso de diversos Sprites, de los cuales algunos han sido realizados de forma personalizada, realizada con ejecución del lenguaje de programación Java orientado a objetos, de una manera clara y adecuada con su descripción en el cronograma de la realización del proyecto. La realización de este proyecto sienta en mi las bases para el estudio y desarrollo de aplicación con fines sociales en los cuales la población pueda aprender de una manera adecuada y

sencilla, y que la misma pueda llegar a muchas personas, y el aprendizaje sea el adecuado.

1.Planteamiento de proyecto El desarrollo de aplicaciones móviles se ha constituido en los últimos años como una forma de desarrollo de programación orientada a objetos, sin embargo, la amplitud de esta ha permitido diferentes enfoques en las cuales las aplicaciones móviles han ganado un lugar más adecuado en relación con la manera en la que son usadas por los usuarios. El planteamiento del proyecto se consolida como el desarrollo de una aplicación móvil, un videojuego que de forma clara y sencilla permita a los usuarios jugar con un bird, el cual evitara dos comidas poco saludables (Hot Dog y Tacos) en la parte de abajo y de arriba, de una manera en la que el jugador tendrá que tocar la pantalla para poder evitar dichas comidas y en el caso de que colisionen, el mismo sera devuelto a la pantalla de título para que comience nuevamente la partida. Teniendo también la pantalla del titulo un mensaje diciendo lo siguiente “Recuerda tu salud es lo más importante. Juega con el bird y salta la comida”, haciendo énfasis en la salud del usuario y una mini instrucción al jugador como tal. Siendo el principal objetivo del desarrollo del proyecto, el de mostrar la importancia de una correcta nutrición, de la salud y el de como debemos evitar de una manera adecuada, la ingesta de toda aquella comida que sea perjudicial para nuestra salud, de la manera en la que nos alimentamos y pensamos de una crítica en nuestra alimentación, en la alimentación de nuestro entorno, de nuestra familia y nuestro contexto. La realización de la investigación de Seminario sentó las bases en mi persona del pensamiento nutricional adecuado y como la misma nutrición se encuentra presente en el hogar de muchas personas a nivel de Guatemala, nuestra percepción alimenticia y como influye verdaderamente en nosotros y afecta diversos aspectos de la vida diaria. El desarrollo de este proyecto de igual manera sienta las bases en mi persona para una correcta alimentación, mejorar la nutrición en mi núcleo familiar y pensar de una mejor manera en relación de mi salud. Pensar en el desarrollo social y en comunicar a los demás una buena alimentación, adecuada en relación con la manera en la que vivimos, sin importar el área urbana o rural como tal. Con el objetivo de ayudar de una manera adecuada. El proyecto sera realizado de forma simultánea con su cronograma, para poder así comprender mejor diversos aspectos de su planteamiento y de la manera en

la que el mismo, y los aspectos estéticos que serán agregados en el mismo para poder así comprender mejor los aspectos relaciones con el mismo, siendo su desarrollo con el propósito de ayudar de una manera adecuada como tal.

2.Cronograma. 2.1. Proyecto 1. Juego en RPG Maker MV (Cancelado). 2.1.1. jueves 3 de septiembre de 2020. -

Descargue e instale el programa RPG Maker MV y ajuste lo necesario para poder comenzar con el desarrollo del juego.

-

Hice el desarrollo de un interior, de la casa del personaje principal y eliminé a los demás acompañantes del personaje principal.

-

Agregue un skin al personaje principal (aparentando la similitud a una comunidad indígena)

-

Agregue eventos, al acercarse a la puerta de la casa podrá salir.

2.1.2. viernes 4 de septiembre de 2020. -

Trabaje el mapa exterior de la casa del personaje principal, agregando árboles y una casa.

2.1.3. sábado 5 de septiembre de 2020. -

Busque modelos y referencias para el desarrollo de los exteriores, y poder pensar en el desarrollo de los enemigos

2.1.4. domingo 6 de septiembre de 2020. -

Mi computadora sufrió un error en el disco duro. Y no pude trabajar de una manera correcta en la realización del trabajo.

2.1.5. lunes 7 de septiembre de 2020. -

No pude continuar con la elaboración de mi proyecto en RPG Maker MV. Seguí con los problemas en la computadora y decidí reestablecer la computadora a fabrica, iniciando el proceso aproximadamente a las 5:00 pm

-

Esperé el proceso todo el martes hasta que me fui a dormir, pero siguió el proceso.

2.1.6. martes 8 de septiembre de 2020. -

En la mañana, la computadora seguía en proceso de instalación de Windows.

-

A las 2 pm, se logró restablecer el equipo. Pero no se logró reestablecer del todo. Presentando el mismo fallo.

-

Luego del error, la misma se logró reiniciar a causa del error. Y comenzó otro proceso.

2.1.7. miércoles 9 de septiembre de 2020.

-

Comencé a trabajar en la computadora de escritorio y reinstalé el programa nuevamente para poder continuar y replantear diversos aspectos del desarrollo

-

Busque diversos sprites para poder agregar al trabajo

2.1.8. jueves 10 de septiembre de 2020. -

Replante diversos aspectos de la elaboración del juego como tal. Elabore la siguiente lista para poder llevar mejor la elaboración del juego.         

-

Pantalla de inicio Mapas Casas Interiores Personajes o Skins (sprites) (enemigos) o Nombres Diálogos Misiones Cumplir con todas Créditos

Desarrolle el interior de la primera casa, la casa del personaje principal.

Ilustración 1. Aproximación del modelo realizado.

-

Modifique la pantalla de inicio, con el logo del Colegio Valladolid y con el título de “Proyecto Practicas Nutrición”.

2.1.9. viernes 11 de septiembre de 2020. -

No pude continuar con la realización del proyecto, debido a que salió el mismo error de la computadora inicial, en la nueva computadora en la que estoy trabajando el proyecto.

El proyecto inicial de la elaboracion de un juego en RPG Maker MV fue cancelado. Debido a que el programa con el cual se estaba realizando el proyecto, es el causante de los problemas en las respectivas computadoras de mi uso. Por lo cual al verificar y desintalar dicho programa en la computadora de escritorio, el problema dejo de aparecer, sin embargo el riesgo de perder o arruinar la computadora es alto. Por lo cual el proyecto queda cancelado y se continuara con otro.

2.2. Proyecto 2. Elaboración de un juego tipo Flappy bird para dispositivos móviles. 2.2.1. sabado 12 de septiembre de 2020. -

Realice la instalacion de android studio. Utilizando un tutorial

-

Ahora instale el motor LibGDX, el cual utilizaremos en la realización del juego.

-

sin embargo, antes debemos descargar Java

-

Ahora para poder descargar el motor LibGDX, creamos una carpeta con el nombre LibGDX en documentos y lo descargamos

-

Ya descargado, lo ponemos en una carpeta en documentos.

-

Lo podemos ejecutar

2.2.2. domingo 13 de septiembre de 2020.

-

luego de la instalación de todo lo necesario, comencé con la configuración de LibGDX

Modificando lo que es el nombre, el paquete, la clase del juego, el destino y el Android SDK como tal.

-

Configure todo lo necesario del entorno de Android Studio también y de igual manera al ejecutar se presentaba un error.

-

Logre solucionar el error gracias a un video de YouTube en inglés.

-

Logre correr el proyecto, el cual es como un hola mundo en Android Studio

-

Cree la carpeta states, la cual va a servir para poder crear los estados del juego como tal, en qué momento del juego nos encontramos

2.2.3. lunes 14 de septiembre de 2020. -

El día de hoy comencé con la realización de la definición de la clase State.

Un estado de un juego es para poder determinar que estamos haciendo, menú, jugando, perdí etc. Se refiere a qué momento del juego nos encontramos.

Creamos una clase en Java, con el nombre de “State” y tiene que ser abstracta.

Agregue diversos parámetros y cambie la clase de Java a “Abstract” para poder continuar programando, agregue comentarios en el código para poder ir comprendiendo mejor como funciona cuando lo lea

-

Ahora se cambia el tamaño de la ventana y el nombre

Cambiamos el tamaño de la ventana. package com.leonel.flappybird; import import import import import

com.badlogic.gdx.ApplicationAdapter; com.badlogic.gdx.Gdx; com.badlogic.gdx.graphics.GL20; com.badlogic.gdx.graphics.Texture; com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class FlappyBird extends ApplicationAdapter { public static final int WIDTH = 480; public static final int WEIGHT = 720;

-

Con el Desktop Launcher vamos a modificar algunas características

Se le dan los datos al desktop Launcher, siempre todo tiene que ir dentro del core, porque es el núcleo de la aplicación como tal

Ya ejecutando todo nos saldrá esto.

Se logro cambiar el título y las proporciones de la pantalla.

Ahora creamos la clase dentro de state de “GameStateManager”

-

Esta parte servirá para poder ir actualizando el juego, con los parámetros dados, en los cuales el delta time determinará el mismo para ir cambiando dentro del juego

public void update(float dt){/*tiene delta time que determina su tiempo de ejecucion*/ states.peek().update(dt); }

-

Va a servir para ir renderizando el juego como tal,

public void render(){/*va a renderizar toda la aplicacion con lo que le pongamos*/ }

agregamos un SpriteBatch

public void render (SpriteBatch sb){/*va a renderizar toda la aplicacion con lo que le pongamos*/

SpriteBatch

El cual nos va a servir como un contenedor en el que se pueden almacenar cosas importantes para el juego (sprites) las imágenes del juego, el personaje.

La clase “GameStatManager” va a administrar todas las clases de nuestro juego a través de una pila (state) Almacenar. /*administra los estados dentro del juego (Clase para cualquier tipo de estado) */ public class GameStateManager { private Stack states;/*pila donde se almacenara el juego*/ public GameStateManager(){ states = new Stack(); Iniciarlizar la pila } public void push(State state){ states.push (state); poner un estado } public void pop(){/*elimina el ultimo estado de la pila*/ states.pop(); Eliminar un estado } public void set(State state){/**reeemplaza el ultimo estado*/ states.pop(); states.push(state); Setear un estado, eliminar el que esta ahorita e ingresar otro } public void update(float dt){/*tiene delta time que determina su tiempo de ejecucion*/ states.peek().update(dt); Actualizar un estado } public void render(SpriteBatch sb){/*va a renderizar toda la aplicacion con lo que le pongamos*/ states.peek().render(sb); Renderizar un estado } }

Cada uno es como una pantalla.

-

Eliminamos las imágenes predeterminadas, la imagen de “Bad Logic” que se mostraba al principio como tal.

-

Creamos otra clase llamada “MenuState”, la cual será la pantalla del menú como tal.

-

Generamos otros métodos de igual manera en la clase State

-

Ahora cuando ejecutamos podremos ver la pantalla en rojo

-

De igual manera si cambio el “Red: 0” y “Green: 1”, será de color verde

2.2.4. martes 15 de septiembre de 2020. -

Descargue todos los sprites que se utilizarían para el juego.

Sin embargo, tuve problemas encontrando en PNG la animación del bird y de igual manera tengo que buscar la música más adecuada.

2.2.5. miércoles 16 de septiembre de 2020. -

Carecía de un documento importante en la realización de este, llamado “sfx_wing.ogg”, el cual me serviría como sonido cuando el pájaro flotara o se moviera.

-

Tengo que buscar una canción adecuada, personal.

-

Tuve que descargar GitHub para poder descargar el archivo Ogg.

-

Descargar GitHub no me permitió de una manera adecuada descargar el archivo, de igual manera lo pude descargar de otra página. La cual estaba en ruso.

-

Elegí la música personal.

-

Sin embargo, uno de los sprites era todavía una foto con fondo

-

La tenia que volver un PNG normal.

2.2.6. jueves 17 de septiembre de 2020. -

Hoy voy a colocar las imágenes en la librería gdx, poner el background y a colocar el botón de play.

-

En la carpeta assets agregamos todo.

-

Agrego la imagen “bg.png” y “playbtn.png” en la carpeta assets de Android, si no me deja en el programa, lo hago en el directorio de forma directa.

-

Los agregue manualmente.

-

En la clase de menú, cree las 2 variables para objetos, para el fondo y el botón.

private Texture background; private Texture playButton;

-

Ahora inicializamos los objetos

public MenuState(GameStateManager gameStateManager) { super(gameStateManager); background = new Texture("bg.png"); playButton = new Texture("playbtn.png"); }

SpriteBatch (tiene la capacidad de administrar lo grafico del juego)

-

Iniciamos el SpriteBatch y luego ya definimos el fondo, en la coordenada 0 en x y 0 en y, con el alto y ancho establecido en la clase de “FlappyBird”.

@Override public void render(SpriteBatch spriteBatch) { spriteBatch.begin();/*inicializa y luego podemos comenzar a dibujar*/ spriteBatch.draw(background, 0,0, FlappyBird.WIDTH, FlappyBird.WEIGHT); spriteBatch.end(); }

-

Ahora cuando ejecutamos sale el fondo

-

Ahora agregare el botón de play.

Agrego otro SpriteBatch, en el cual solo debemos poner el objeto y ya no señalamos el width y weight spriteBatch.draw(playButton, 0,0);

y aparecer así.

-

Para encontrar la mitad de la pantalla para colocarlo, dividimos el width entre 2 para poder obtener la mitad.

spriteBatch.draw(playButton, FlappyBird.WIDTH /2 ,0);

Y sale así:

Por lo cual también, el botón de play es muy grande y tengo que modificarlo de tamaño. Cambie las proporciones de la imagen en una página web llamada bloggif.

Ahora sale así

-

Ahora bien, tengo que configurar que el mismo este en la parte de arriba, para eso agrego en la coordenada Y, modificando la altura, por lo cual agrego lo siguiente en el SpriteBatch del botón. spriteBatch.draw(playButton, FlappyBird.WIDTH /2 ,FlappyBird.WEIGHT/2 );

-

Ahora el mismo sale más alto.

-

De igual manera, debemos de ajustar la posición, para que el mismo se encuentre en medio directamente

Para eso debemos ajustar lo establecido en la coordenada X, en la cual, el valor de width lo dividimos entre dos y luego le restamos la cantidad que establecemos

al llamar el valor de la anchura de la imagen del botón y la dividimos dentro de dos. De la misma manera lo hacemos con el valor de la altura de la imagen. Así: spriteBatch.draw(playButton, (FlappyBird.WIDTH /2)- (playButton.getWidth()/ 2) , (FlappyBird.WEIGHT/2 ) - (playButton.getHeight() / 2));

Y ahora saldrá en medio de la pantalla. De la misma manera y de forma personal agregue una imagen con el nombre “Titulo.PNG”, la cual dice “Proyecto Ismar Cortez”. Y de la cual modifique lo necesario como se vio anteriormente, para que quedara en el centro de la pantalla.

Así:

spriteBatch.draw(Titulo, (FlappyBird.WIDTH/2)- (Titulo.getWidth()/ 2), (FlappyBird.WEIGHT/2)- (Titulo.getHeight()/4));

y se mira de la siguiente manera:

-

Ahora se utiliza el método “Dispose”, el cual nos sirve para poder borrar algo de la pantalla. Para evitar problemas con la memoria, que cuando cambiemos de estado durante la ejecución del juego. Eliminar su disposición de la imagen como tal

-

Detecta un error al hacer Refactor

-

Pude solucionar el error nombrando solo “state”

-

Agregamos el método Dispose, en el cual lo anterior de la pantalla se borrará. Se hace de la siguiente manera

@Override public void dispose() { background.dispose(); playButton.dispose(); Titulo.dispose(); } }

Se borrará el fondo, el botón de play y el título.

-

Ahora creare la clase PlayState dentro del paquete state, en el cual debemos de agregar los diferentes métodos, y agregar un constructor

-

Ahora, creamos la textura privada llamada bird e inicializamos el “bird” como una nueva textura, agregando la imagen “bird.png”

public class PlayState extends State { private Texture bird; public PlayState (GameStateManager gsm) { super(gsm); bird = new Texture("bird.png"); }

-

En la clase “PlayState”, agregamos en el render lo siguiente:

@Override public void render(SpriteBatch spriteBatch) { spriteBatch.begin(); spriteBatch.draw(bird, 50, 50 ); spriteBatch.end();

}

Lo cual nos servirá para dibujar lo que se esté haciendo, ósea dibujar el pájaro como tal.

Ya en el “MenuState”, en el HandleInput, la cual es la parte que regula las entradas.

-

Agregamos un nuevo estado, con un ciclo condicional if, en el cual, si se toca la pantalla, se seteara un nuevo estado, el cual será el de PlayState

public void handleinput() { if (Gdx.input.justTouched()){ gsm.set(new PlayState(gsm)); }

Y agregamos el Dispose, el cual borrara de la memoria lo anterior que había.

-

Para que el mismo se pueda ejecutar y ver el cambio, debemos llamar el método o hacer que se ejecute en “Update”

protected void update(float dt) { handleinput(); }

A lo cual saldrá la pantalla.

Y si damos clic cambiara.

-

Ahora se modifica el Viewport (el cual, es la manera en la que el usuario va a ver nuestro juego, se define como la parte de adelante y de atrás que se va a ir viendo)

Ejemplo:

-

En el constructor del “PlayState” asignamos la cámara, con los tres parámetros, el segundo método.

public PlayState(GameStateManager gsm) { super(gsm); bird = new Texture("bird.png"); camera.setToOrtho(); }

Con el cual vamos a definir el ancho y alto de la cámara. Agregamos los tres parámetros, el primero es falso, ya que es un valor booleano y el segundo valor es la anchura y el tercer parámetro es el alto.

camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2);

-

Agregamos en el SpriteBatch, un projection Matrix (Dibujar solo lo que vamos a ver), el cual ajustara la cámara y servirá para que se vaya dibujando lo necesario de la manera adecuada. Se va a ir dibujando en relación con la cámara

-

Sin embargo, el mismo lo tengo que añadir dentro del SpriteBatch, ya que si no lo hago no se podrá ejecutar el mismo de una manera adecuada como tal.

spriteBatch.begin(); spriteBatch.setProjectionMatrix(camera.combined); spriteBatch.draw(bird, 50, 50 ); spriteBatch.end();

y la diferencia se mira de la siguiente manera.

Se mira mas cerca el pájaro, y no solo eso, se adapta de una manera a la pantalla y no aparece a lo lejos como antes, de la manera predeterminada.

Ejemplo de la diferencia.

-

Ahora cree un nuevo paquete llamado “sprites”, en el cual adentro tengo que crear la clase Java “Bird”.

-

Luego de crear la clase, agregamos los vectores, de posición y velocidad y la textura, los objetos. Luego de ello creamos una clase con el nombre de bird y establecemos parámetros en X y Y. Luego ya creamos la clase donde daremos los valores a cada uno. E iniciando el valor de “bird” como nueva textura y con el valor de la imagen.

package sprites; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.math.Vector3; public class Bird {

private Vector3 position; private Vector3 velocity; private Texture bird; public Bird(int x, int y){/*la posicion en la que estara el bird*/ position = new Vector3(x,y,0 ); velocity = new Vector3(0,0,0); bird = new Texture("bird.png"); }

-

Cree una constante que de igual manera va a ser útil para almacenar el valor de gravedad del juego. Cada segundo va cayendo unos pixeles

private static final int GRAVITY = -15;

la cual se establece con un valor de -15, que ira cayendo el bird.

-

De igual manera en el Update agrego los parámetros, en los cuales en velocity, en x será 0, en y será el valor de la gravedad que cae y en z será 0.

public void update(float dt){ velocity.add(0, GRAVITY, 0) velocity. }

agregamos los otros valores que se iran agregando en relación con el bird public void update(float dt){ velocity.add(0, GRAVITY, 0); velocity.scl(dt); position.add(0,velocity.y,0); velocity.scl(1/dt); }

-

Ahora en Generate, selecciones el “getter”, en el cual, genere los métodos de la posición y textura.

-

En la clase de “PlayState” elimino texture, el cual contenía datos de la imagen del bird, siendo que ahora crea una “Private Bird bird” exportando la clase y luego inicializando los valores del bird en 50 pixeles en x, y 320 en y.

private Bird bird; public PlayState(GameStateManager gsm) { super(gsm); bird = new Bird(50,320); camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2); }

Siendo que ahora, el valor inicial del bird está establecido para que vaya cayendo.

-

En update agrego el método HandleInput (); y el método update, para que el bird se vaya actualizando.

protected void update(float dt) { handleinput(); bird.update(); }

-

Cree el método saltar. Lo que se realiza es que cuando se de clic, se le agregara un valor en Y para que suba.

-

Agregamos en el método “HandleInput()” de la clase Java “PlayState”, un ciclo condicional if en el cual cuando se toque se dé una acción. La cual será la de irse para arriba

protected void handleinput() { if(Gdx.input.justTouched()); }

-

ahora de esta manera parecera que vuela

@Override protected void handleinput() {/*Esta es la que permite que vuele*/ if(Gdx.input.justTouched()){ bird.jump(); } }

2.2.7. viernes 18 de septiembre de 2020. -

Hoy voy a agregar el background a el PlayState.

-

Creamos el objeto y luego no inicialice.

private Bird bird ; private Texture bg; public PlayState(GameStateManager gsm) { super(gsm); bird = new Bird(50,320); camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2); bg = new Texture("bg.png"); }

-

En el render, agregamos un spritebatch, en el cual, se dibujara el fondo.

public void render(SpriteBatch spriteBatch) {

spriteBatch.begin(); spriteBatch.setProjectionMatrix(camera.combined); spriteBatch.draw(bg, 0,0); spriteBatch.draw(bird.getBird(), bird.getPosition().x, bird.getPosition().y); spriteBatch.end();

}

-

Cambio el Spritebatch y luego los parámetros en x y y de el fondo. Determinando cada uno como la posición de la cámara, junto con su largo. Modifico las proporciones del fondo en relación con la cámara.

spriteBatch.draw(bg, camera.position.x-(camera.viewportWidth)/2 ,camera.position.y -(camera.viewportHeight/2));

-

De la misma manera, ahora se modificó la caída del bird, en relación con que el mismo no podrá caer, no se ira de largo en el fondo como tal.

public void update(float dt){ if(position.y>0){ velocity.add(0, GRAVITY, 0); }

velocity.scl(dt); position.add(0,velocity.y,0); if(position.y groundpos2.x + ground.getWidth()) groundpos2.add(ground.getWidth()*2, 0);

}

-

Sin embargo, el bird atraviesa el ground. Se agrega un ciclo condicional if, en el cual se establece la colisión del bird con el ground, reiniciara el juego como tal.

for(int i =0; i tube.getPosTopTube().x + tube.getTopTube().getWidth()){ tube.reposition(tube.getPosBotTube().x + ((Tube.TUBE_WIDTH + TUBE_SPACING ) *TUBE_COUNT)); } if(tube.collides(bird.getBounds())){//Setaer un nuevo estado de juego, Game OVer si colisionan gsm.set(new PlayState(gsm)); } } if (bird.getPosition().y = frameCount){ frame= 0; } }

-

Cree los dos objetos en la clase de Bird, y luego se inicializan.

private Animation birdAnimation; private Texture texture;

-

Eliminamos el primer bird.

-

Agregamos una nueva textura, el cual mandará a llamar a la animación, y supondrá también, que dividirá la animación, la imagen.

position = new Vector3(x,y,0 ); velocity = new Vector3(0,0,0); texture = new Texture("birdanimation.png"); birdAnimation = new Animation(new TextureRegion(texture), 3, 0.5f); bounds = new Rectangle(x,y, bird.getWidth(), bird.getHeight());

-

Modificamos al ejecutar tambien el SpriteBatch, ya que detecta un error.

Ya que cambiamos por completo el “bird” por “Texture” y por lo cual sale el error.

-

Tenia un error en la ejecución, en la cual se arruinan las tuberías.

-

Encontré el error, era la imagen, la reemplacé por la imagen “animation.png” y ahora tiene animación.

-

Ahora añadiré la música.

Pego la música en Assets

-

Creamos el objeto Music, con el cual podemos inicializar el archivo.

-

Creamos un método para la música y la incializacion

private void seUpMusic(){ music = Gdx.audio.newMusic(Gdx.files.internal("Bob-Omb Battlefield - Super Mario 64.mp3")); music.setLooping(true);//para que se siga repitiendo music.setVolume(0.10f);//el volumen music.play(); }

y registramos el método en el GameState y se puede oír la música.

-

Ahora agregare el sonido del aleteo del bird. Agrego el archivo de sonido de aleteo en la carpeta de Assets.

-

Establecemos el objeto y luego lo inicializamos.

private Sound flap; public Bird(int x, int y){/*la posicion en la que estara el bird*/ position = new Vector3(x,y,0 ); velocity = new Vector3(0,0,0); texture = new Texture("animation.png"); birdAnimation = new Animation(new TextureRegion(texture), 3, 0.5f); flap = Gdx.audio.newSound(Gdx.files.internal("sfx_wing.ogg")); bounds = new Rectangle(x,y, texture.getWidth()/3, texture.getHeight()); }

-

Con cada clic, se debería de escuchar el sonido del aleteo.

-

El mismo se ejecutará dentro del método de Jump y se debe de colocar en dispose

public void jump(){ velocity.y=250; flap.play();

} public void dispose(){ texture.dispo

-

Ahora lo probare en mi dispositivo móvil. o Ajuste  Acerca del teléfono  Miramos el número de compilación del teléfono.

El mío es 43.0.A.7.106

-

abrí Android manifest.

-

Define como queremos la orientación

android:screenOrientation="landscape"

por defecto ejecuta la orientación en horizontal

cambiamos a portrait:

android:screenOrientation="portrait"

-

Agrego el siguiente código de la cámara en el menú state

camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2);

Completo

public MenuState(GameStateManager gameStateManager) { super(gameStateManager); camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2); background = new Texture("bg.png"); playButton = new Texture("playbtn.png"); Titulo = new Texture( "Titulo.png"); }

-

Agrego un spriteBatch

spriteBatch.setProjectionMatrix(camera.combined);

spriteBatch.begin();/*inicializa y luego podemos comenzar a dibujar*/ ---

spriteBatch.setProjectionMatrix(camera.combined);

--- aquí borramos el width y weight spriteBatch.draw(background, 0,0, FlappyBird.WIDTH, FlappyBird.WEIGHT);

cambiamos este--- spriteBatch.draw(playButton, (FlappyBird.WIDTH /2)(playButton.getWidth()/ 2) ,(FlappyBird.WEIGHT/2 ) - (playButton.getHeight() / 2)); spriteBatch.draw(Titulo, (FlappyBird.WIDTH/2)- (Titulo.getWidth()/ 2), (FlappyBird.WEIGHT/2)- (Titulo.getHeight()/4)); spriteBatch.end(); }

Por este spriteBatch.draw(playButton, camera.position.x - playButton.getWidth()/2, camera.position.y);

Queda así

spriteBatch.begin();/*inicializa y luego podemos comenzar a dibujar*/ spriteBatch.setProjectionMatrix(camera.combined); spriteBatch.draw(background, 0,0); spriteBatch.draw(playButton, camera.position.x - playButton.getWidth()/2, camera.position.y); spriteBatch.draw(Titulo, (FlappyBird.WIDTH/2)- (Titulo.getWidth()/ 2), (FlappyBird.WEIGHT/2)- (Titulo.getHeight()/4)); spriteBatch.end();

-

Ahora seleccionamos la opción Android

-

Le doy ejecutar

-

Realiza una ejecución

-

Comienza a instalar en el teléfono

-

Se logro ejecutar, sin embargo, no salía el título.

-

Modifique lo siguiente y ya salió el titulo

spriteBatch.draw(playButton, camera.position.x - playButton.getWidth()/2, camera.position.y-40); spriteBatch.draw(Titulo, camera.position.x - ((Titulo.getWidth()/7)*3+22)*1, camera.position.y-150); spriteBatch.end();

2.2.9. domingo 20 de septiembre de 2020. -

Hoy modifique lo que es el menú del juego, cambie el background, agregue también un mensaje

-

Modifique también los sprites del tubo, y el fondo, y cambia para que cuando se pierda, se vuelva al menú.

-

Modifique el Return cuando se pierde, y doy por finalizado del proyecto.

3. Recursos 1. Video tutorial de instalación de Android Studio. https://www.youtube.com/watch?v=L2M8mi7W_fo 2. video tutorial de la configuración de los entornos. https://www.youtube.com/watch?v=iixnlnQqhmY&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=2 3. Video tutorial en el que resolví el error https://www.youtube.com/watch?v=g789PvvW4qo 4. Video tutorial en el aprendí a definir la clase State. https://www.youtube.com/watch?v=iox074MwRoQ 5. Video en el pude aprender a configurar la ventana del juego. https://www.youtube.com/watch?v=N3WK_SEbVYU&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=4 6. Video tutorial en el que logre crear la clase GameStateManager. https://www.youtube.com/watch?v=C4C4AHoLFK0 7. Video tutorial en el que aprendí a crear la clase Menu State https://www.youtube.com/watch?v=Vx7c0rrgUwI&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=6 8. Video en el que identifique los Assets. https://www.youtube.com/watch?v=MlFvv7Fpxl4&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=7 9. Video en el que aprendí a colocar el Background. https://www.youtube.com/watch?v=TO1wBmZfmgA&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=8 10. Video en el que logre colocar el Botón de Play. https://www.youtube.com/watch?v=M2zwigedP1k&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=9 11. Video en el que aprendí del dispose, y de las funciones del mismo. https://www.youtube.com/watch?v=LcQ37qa0uyM&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=10

12. Video tutorial en el que cree la clase PlayState y la configure y se agregó el bird. https://www.youtube.com/watch?v=gv8LT3GIDqE&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=11 13. Video tutorial en el que comprendí la vista de la cámara y como funciona. https://www.youtube.com/watch?v=BOVpiaHfJAQ&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=12 14. Video tutorial en el que aprendí a crear la clase del bird y poder darle sus características. https://www.youtube.com/watch?v=m6pVnhQx0ss&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=13 15. Video tutorial en el que aprendí a modificar el bird y darle gravedad y que el mismo cambié de posición. https://www.youtube.com/watch?v=wJP7RReC60U&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=14 16. Video tutorial en el que pude aprender a darle vuelo al bird. https://www.youtube.com/watch?v=Bi2AyGTWssQ&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=15 17. Video tutorial en el cual pude aprender a poner el background en el PlayState. https://www.youtube.com/watch?v=0qKAAZOGuyE&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=16 18. Video tutorial en el cual pude aprender a crear la clase de tubo y modificarla en el PlayState. https://www.youtube.com/watch?v=GMHFw-QVxzg&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=17 19. Video tutorial en el cual ya pude aprender a colocar los tubos. https://www.youtube.com/watch?v=ZLZgUh4QMus&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=18 20. Video tutorial en el cual ya pude aprender a reposicionar los tubos y como se presentarían en la pantalla. https://www.youtube.com/watch?v=Umea22nBAZk&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=19

21. Video tutorial en el que pude aprender ya a mover el bird de forma horizontal. https://www.youtube.com/watch?v=9bGkno7AR3k&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=20 22. Video tutorial en cual pude comprender lo que son los rectángulos y su uso en las colisiones https://www.youtube.com/watch?v=yY7fuWhV9_Q&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=21 23. Video tutorial en el cual pude aprender ya a poner las colisiones como tal. https://www.youtube.com/watch?v=KWJFy4JxaNY&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=22 24. Video tutorial en el cual aprendí a limpiar memoria con el dispose, cuando se pierda, se limpiarán esos datos. https://www.youtube.com/watch?v=nZpU9-AsD_A&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=23 25. Video en el cual pude aprender a poner el ground (suelo), pero no salía completo. https://www.youtube.com/watch?v=74XAb5uDaVI&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=24 26. Video tutorial en el cual aprendí a reposicionar el ground. https://www.youtube.com/watch?v=lcxuOjBfGI8&list=PLAzlSdU-KYwUVmqlA6ZUt_8Zr3kfwXhb&index=25 27. Video en el cual aprendí a crear los parámetros de la animación del bird. https://www.youtube.com/watch?v=w5On0eBq_hg&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=26 28. Video tutorial en el que aprendí a darle animación al bird. https://www.youtube.com/watch?v=dQIue_XJpAg&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=27 29. Video tutorial en el cual pude aprender a colocar la música y a manejarla. https://www.youtube.com/watch?v=9WKv-wpNu4M&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=28 30. Video tutorial en el cual pude aprender a colocar el sonido al aleteo del bird.

https://www.youtube.com/watch?v=esSx4n6kTIs&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=29 31. Video tutorial en el que pude aprender a ejecutar el juego de una forma directa en mi celular https://www.youtube.com/watch?v=HzfDPxYU9rs&list=PLAzlSdUKYwUVmqlA6ZUt-_8Zr3kfwXhb&index=30

-

Internet

-

Youtube

-

Github

-

Editor de fotos (para los sprites)

-

Android Studio

-

Librería LibGDX

-

Microsoft Word

-

Paint

-

Google Chrome

-

Teléfono Android

4.Estimación de presupuesto. *Precios establecidos en quetzales

Objetos utilizados

Precio

1.Internet

380

2.Energía eléctrica

600

3.Android Studio

0

4.Google Chrome

0

5.Computadora Acer Total

6000 6980

1. El gasto del internet es un gasto que se produce todos los meses en el ámbito familiar como tal, por lo que su uso en el proyecto fue de suma importancia para adquirir y verificar los medios de conocimiento a consultar. 2. De igual manera, el gasto de energía eléctrica es un gasto mensual, el es siempre necesario y parte del presupuesto como tal. 3. El uso de Android Studio como entorno de desarrollo, la descarga de la licencia original del mismo es gratis, sin embargo, se especifica ya que algunas funciones de este llegan a ser de paga. 4. El uso de Google Chrome como motor de búsqueda, es importante ya que a través de este se solicitó toda la información y conocimiento para poder consultar el contenido multimedia determinado. 5. El gasto más grande se produjo en la adquisición de un equipo de computo nuevo, el cual me permitió desarrollar mis actividades en relación con el proyecto, ya que las fallas presentes en el computador anterior dificultaron mi avance en el proyecto y se considero de una mejor manera la adquisición de un nuevo equipo de cómputo.

5.Desarrollo. 5.1. Diagramas y algoritmos. 5.1.1. Sprites utilizados.

5.1.2.Diagrama del viewport.

5.1.3. Diagrama en el cual se ejemplifica el Viewport y la ejecución de los tubos de forma random en tamaño.

5.2. Códigos. 5.2.1. Código de la clase State. package States; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; public abstract class State { protected OrthographicCamera camera; //es para mostrarle al usuario un pedazo pequeño de lo que pasa protected Vector3 mouse; protected GameStateManager gsm; //Controla los estados como tal y el tiempo en el que se da protected State(GameStateManager gameStateManager){ this.gsm = gameStateManager; camera = new OrthographicCamera(); mouse = new Vector3(); } protected abstract void handleinput(); protected abstract void update(float dt); public abstract void render (SpriteBatch spriteBatch);//Se encargan de ver el loop Game para determianr en que momento se ejecutan los estados y actulizarlos //Cargartodo lo necesario para el metodo public abstract void dispose();}

5.2.2. Código de la clase Flappy Bird en Android Studio. package com.leonel.flappybird;

import import import import import

com.badlogic.gdx.ApplicationAdapter; com.badlogic.gdx.Gdx; com.badlogic.gdx.audio.Music; com.badlogic.gdx.graphics.GL20; com.badlogic.gdx.graphics.g2d.SpriteBatch;

import States.GameStateManager; import States.MenuState; public class FlappyBird extends ApplicationAdapter { public static final int WIDTH = 480; public static final int WEIGHT = 720; public static final String TITLE = "FlappyBird Nutrición para Android"; private Music music; private GameStateManager gsm; private SpriteBatch batch;

@Override public void create () { batch = new SpriteBatch(); gsm = new GameStateManager(); Gdx.gl.glClearColor(0, 1, 0, 1); gsm.push(new MenuState(gsm)); seUpMusic(); } @Override public void render () { Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); gsm.update(Gdx.graphics.getDeltaTime()); gsm.render(batch); } @Override public void dispose () { batch.dispose(); music.dispose(); } private void seUpMusic(){ music = Gdx.audio.newMusic(Gdx.files.internal("Bob-Omb Battlefield - Super Mario 64.mp3")); music.setLooping(true);//para que se siga repitiendo music.setVolume(1.0f);//el volumen music.play(); } }

5.2.3. Código de la clase GameStateManager. package States;

import com.badlogic.gdx.graphics.g2d.SpriteBatch; import java.util.Stack; /*administra los estados dentro del juego (Clase para cualquier tipo de estado)*/ public class GameStateManager { private Stack states;/*pila donde se almacenara el juego*/ public GameStateManager(){ states = new Stack(); } public void push(States.State state){ states.push (state); } public void pop(){/*elimina el ultimo estado de la pila*/ states.pop().dispose(); }

public void set(States.State state){/**reeemplaza el ultimo estado*/ states.pop().dispose(); states.push(state); } public void update(float dt){/*tiene delta time que determina su tiempo de ejecucion*/ states.peek().update(dt); } public void render(SpriteBatch sb){/*va a renderizar toda la aplicacion con lo que le pongamos*/ states.peek().render(sb); } }

5.2.4. Código de la clase MenuState. package States; import import import import

com.badlogic.gdx.Gdx; com.badlogic.gdx.graphics.Texture; com.badlogic.gdx.graphics.g2d.SpriteBatch; com.leonel.flappybird.FlappyBird;

public class MenuState extends State { private Texture background; private Texture playButton; private Texture Titulo;

private Texture Mensaje;

public MenuState(GameStateManager gameStateManager) { super(gameStateManager); camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2); background = new Texture("fast4.png"); playButton = new Texture("playbtn.png"); Titulo = new Texture( "Titulo.png"); Mensaje = new Texture("MensajeFinal3.png"); }

@Override public void handleinput() { if (Gdx.input.justTouched()){ gsm.set(new PlayState(gsm)); }

} @Override protected void update(float dt) { handleinput(); } @Override public void render(SpriteBatch spriteBatch) {

spriteBatch.begin();/*inicializa y luego podemos comenzar a dibujar*/ spriteBatch.setProjectionMatrix(camera.combined); spriteBatch.draw(background, 0,0); spriteBatch.draw(playButton, camera.position.x playButton.getWidth()/2, camera.position.y-40); spriteBatch.draw(Titulo, camera.position.x ((Titulo.getWidth()/7)*3+22)*1, camera.position.y-150); spriteBatch.draw(Mensaje, camera.position.x((Mensaje.getWidth()/7)*3+27)*1, camera.position.y-200); spriteBatch.end(); } @Override public void dispose() { background.dispose(); playButton.dispose(); Titulo.dispose();

Mensaje.dispose(); System.out.println("MENU STATE DISPOSED"); } }

5.2.5. Código de la clase PlayState. package States; import import import import import import import

com.badlogic.gdx.Gdx; com.badlogic.gdx.graphics.Texture; com.badlogic.gdx.graphics.g2d.SpriteBatch; com.badlogic.gdx.math.Interpolation; com.badlogic.gdx.math.Vector2; com.badlogic.gdx.utils.Array; com.leonel.flappybird.FlappyBird;

import java.sql.Time; import sprites.Bird; import sprites.Tube; import static com.badlogic.gdx.graphics.g2d.SpriteBatch.*; import static sprites.Tube.TUBE_WIDTH; public class

PlayState extends State {

private static final int TUBE_SPACING = 125; private static final int TUBE_COUNT = 4; private static final int GROUND_Y_OFFSET = -30; private Bird bird ; private Texture bg; private Texture ground; private Vector2 groundpos1; private Vector2 groundpos2;

private Array tubes; public PlayState(GameStateManager gsm) { super(gsm); bird = new Bird(50,320); camera.setToOrtho(false, FlappyBird.WIDTH/2, FlappyBird.WEIGHT/2); bg = new Texture("fast4.png"); ground = new Texture("ground.png"); groundpos1 = new Vector2(camera.position.x - camera.viewportWidth/2, GROUND_Y_OFFSET ); groundpos2 = new Vector2((camera.position.xcamera.viewportWidth/2)+ground.getWidth(), GROUND_Y_OFFSET ); tubes = new Array();

for(int i= 1; i groundpos2.x + ground.getWidth()) groundpos2.add(ground.getWidth()*2, 0);

} }

5.2.6. Código de la clase Bird. package sprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound;

import import import import

com.badlogic.gdx.graphics.Texture; com.badlogic.gdx.graphics.g2d.TextureRegion; com.badlogic.gdx.math.Rectangle; com.badlogic.gdx.math.Vector3;

public class Bird { private static final int MOVEMENT = 100; private static final int GRAVITY = -15; private Vector3 position; private Vector3 velocity; private Texture bird; private Animation birdAnimation; private Texture texture; private Rectangle bounds; private Sound flap; public Bird(int x, int y){/*la posicion en la que estara el bird*/ position = new Vector3(x,y,0 ); velocity = new Vector3(0,0,0); texture = new Texture("animation.png"); birdAnimation = new Animation(new TextureRegion(texture), 3, 0.5f); flap = Gdx.audio.newSound(Gdx.files.internal("sfx_wing.ogg")); bounds = new Rectangle(x,y, texture.getWidth()/3, texture.getHeight()); } public void update(float dt){ birdAnimation.update(dt); if(position.y>0){ velocity.add(0, GRAVITY, 0); } velocity.scl(dt); position.add(MOVEMENT * dt,velocity.y,0); if(position.y= frameCount){ frame= 0; }

} public TextureRegion getFrame(){ return frames.get(frame); }

}

5.2.9. Código del AndroidManifest.xml.