{"id":5743,"date":"2022-05-13T23:19:30","date_gmt":"2022-05-13T21:19:30","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=5743"},"modified":"2022-05-15T18:01:17","modified_gmt":"2022-05-15T16:01:17","slug":"gameduino-advance","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/","title":{"rendered":"Gameduino Advance"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introducci\u00f3n al proyecto<\/h2>\n\n\n\n<p>Cuando comenzamos a plantearnos de qu\u00e9 quer\u00edamos que tratase nuestro proyecto, ca\u00edmos en el enfoque de planteamiento m\u00e1s com\u00fan: eficiencia y utilidad. Estuvimos unos d\u00edas d\u00e1ndole vueltas sin llegar a ninguna conclusi\u00f3n que nos llegase a satisfacer.<\/p>\n\n\n\n<p>Entonces se nos ocurri\u00f3 darle un cambio completo al enfoque del proyecto. \u00bfPor qu\u00e9 no en lugar de crear algo que cumpliera las condiciones anteriores no hacemos algo distinto? \u00bfPor qu\u00e9 no le damos un enfoque l\u00fadico?<\/p>\n\n\n\n<p>As\u00ed se nos ocurri\u00f3 la idea de crear una consola. Pero claro, debido a los recursos con los que cont\u00e1bamos est\u00e1bamos bastante limitados. As\u00ed pues, decidimos crear una especie de consola port\u00e1til.<\/p>\n\n\n\n<p>Y naci\u00f3 la idea de Gameduino Advance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware<\/h2>\n\n\n\n<p>Dado que la dificultad del proyecto realmente fue el software, el apartado de hardware no tiene un contenido excesivo. Los materiales utilizados fueron:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>1 Bot\u00f3n<\/li><li>Cables varios<\/li><li>1 potenci\u00f3metro<\/li><li>1 pantalla lcd<\/li><li>1 joystick<\/li><li>Placa de arduino<\/li><li>Buzzer<\/li><li>1 resistencia de 10k ohmios<\/li><li>2 resistencias de 20k ohmios<\/li><\/ul>\n\n\n\n<p>Como apuntes importantes, el potenci\u00f3metro es usado para modular el contraste de la pantalla lcd de forma que pueda verse de forma \u00f3ptima y la resistencia utilizada para el joystick es la de 10k ohmios.<\/p>\n\n\n\n<p>Y la implementaci\u00f3n del circuito quedar\u00eda algo as\u00ed, siendo los cables rojos las conexiones al voltaje, los negros a tierra, el amarillo el del potenci\u00f3metro con respecto a la pantalla y el resto los cables de se\u00f1al:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"288\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png\" alt=\"\" class=\"wp-image-5776\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png 567w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito-300x152.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Software<\/h2>\n\n\n\n<p>El c\u00f3digo del proyecto ha sido bastante extenso debido a la complejidad de implementar juegos con varios elementos que deb\u00edan procesarse a distintos ritmos y en ocasiones a la vez. En total el proyecto cuenta con 581 l\u00edneas de c\u00f3digo. Obviando el funcionamiento m\u00e1s simple como el men\u00fa, el uso de los controles o de la pantalla lcd casi toda la complejidad del proyecto resid\u00eda en mantener un framerate que no incomodara al jugador mientras manten\u00edamos la informaci\u00f3n fiable para proporcionar una experiencia de juego agradable y encontrar los tiempos de actualizaci\u00f3n correctos para cada funci\u00f3n de tal manera que en caso de ser necesaria una ejecuci\u00f3n paralela se pudiera resolver de manera secuencial con el timing correcto.<\/p>\n\n\n\n<p>BLOQUES:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>ESPECIFICACION DE VARIABLES:<\/li><\/ol>\n\n\n\n<p>En este bloque encontramos todas las variables necesarias para el funcionamiento de la pr\u00e1ctica. Entre las variables generales encontramos la localizaci\u00f3n de los pines, los valores de los input y las variables comunes a los dos juegos implementados. Despu\u00e9s tendr\u00edamos variables espec\u00edficas para cada uno de los juegos, teniendo sustancialmente m\u00e1s variables el juego \u00abimpostor invader\u00bb respecto a \u00absus jump\u00bb debido a su mayor complejidad y la cantidad de objetos necesarios. Por \u00faltimo, tenemos los arrays de bits que representaran m\u00e1s tarde nuestros \u00absprites\u00bb dentro de los juegos.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>SETUP:<\/li><\/ul>\n\n\n\n<p>Aqu\u00ed es donde empieza la ejecuci\u00f3n propiamente dicha del proyecto, en el setup se inicializa la pantalla lcd, el buzzer, los caracteres que se dibujaran a partir de los mapas de bits previamente especificados con \u00ablcd.createChar();\u00bb, las variables temporizadoras con \u00abmillis();\u00bb y por \u00faltimo el Serial. Una vez ejecutado saltamos al bloque Men\u00fa.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>MENU:<\/li><\/ul>\n\n\n\n<p>El prop\u00f3sito de este bloque es de servir de entrada al bloque Loop ya que los inputs registrados al final de la partida de cada juego al volver al men\u00fa pod\u00edan ser registrados antes de renderizar de nuevo la selecci\u00f3n de juego y creando as\u00ed una sensaci\u00f3n incomoda en el jugador al no entender que ha ocurrido. En este bloque simplemente bloquearemos durante unos milisegundos la entrada y mostraremos una peque\u00f1a explicaci\u00f3n del men\u00fa antes de saltar al Loop.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>LOOP:<\/li><\/ul>\n\n\n\n<p>Aqu\u00ed es donde el jugador seleccionara el juego que quiera con el uso del \u00abJoyStick\u00bb movi\u00e9ndolo a izquierda o derecha, al solo tener dos juegos implementados se alternara de uno a otro de manera sencilla, si hay un modo de juego seleccionado y se mueve el \u00abJoyStick\u00bb alternara el juego seleccionado y renderizara la nueva selecci\u00f3n. Primero se comprueba si quiere cambiar la selecci\u00f3n y despu\u00e9s si ha pulsado el bot\u00f3n para acceder al juego, una vez lo haga se lanzar\u00e1 el juego seleccionado.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>SUS JUMP:<\/li><\/ul>\n\n\n\n<p>El primer juego implementado y el m\u00e1s simple, cuenta con solo dos objetos, el primero, nuestro personaje \u00abamogus\u00bb y los cactus que deber\u00e1 saltar.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Variables:<\/li><\/ul>\n\n\n\n<p>\u00b7 int score: puntos adquiridos durante la partida.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 bool gameOver: estado del juego (si es \u00abfalse\u00bb no ha acabado).<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int cactusPosition: posici\u00f3n del objeto cactus;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 bool amogusUp: estado del salto del personaje (si es \u00abfalse\u00bb no est\u00e1 saltando).<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int cactusDelay: delay con el que se mover\u00e1 el cactus.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int cactusDecrease: cantidad que descender\u00e1 el delay con cada nivel.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int level: nivel en el que nos encontramos.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Funcionamiento:<\/li><\/ul>\n\n\n\n<p>Antes de empezar se inicializan las variables con los valores correspondientes. El bucle del juego se realiza en un bucle \u00abwhile(!gameOver)\u00bb que se ejecutara mientras \u00abgameOver\u00bb no sea \u00abtrue\u00bb. Con cada ciclo del bucle comprobamos el estado de todos los objetos del juego y solo actualizamos los que hayan pasado su temporizador correspondiente, este funciona de la siguiente manera, tenemos una variable temporizadora correspondiente al objeto y cada vez que lo actualizamos su valor cambia al tiempo actual desde el inicio de la placa con \u00abmillis()\u00bb, de esta manera solo entraremos a actualizarlo cuando la resta del \u00abmillis()\u00bb actual menos la variable temporizadora sea mayor que la variable delay correspondiente. Este m\u00e9todo es el que nos permite tener varios objetos ejecut\u00e1ndose simult\u00e1neamente de manera secuencial adem\u00e1s de mantener los ritmos adecuados para el juego.<\/p>\n\n\n\n<p>Explicado esto el funcionamiento de cada objeto es sencillo, en cada actualizaci\u00f3n el cactus se mueve a la izquierda tanto en la pantalla como su variable posici\u00f3n, las actualizaciones del \u00abamogus\u00bb suceden mucho mas frecuentemente y son las que permiten saltar (saltar tiene su propio delay para que no se pueda saltar de manera permanente) y las que actualizan el \u00absprite\u00bb seg\u00fan su situaci\u00f3n (suelo o aire), la actualizaci\u00f3n del salto propiamente dicho, es decir cuanto debe durar saltando, que al actualizarse vuelve al suelo, y por \u00faltimo la actualizaci\u00f3n de la puntuaci\u00f3n que comprueba si el \u00abamogus\u00bb est\u00e1 en el aire cuando un cactus est\u00e1 en su posici\u00f3n. <\/p>\n\n\n\n<p>En caso negativo se acaba el juego y en caso afirmativo aumenta la puntuaci\u00f3n. Si la puntuaci\u00f3n es m\u00faltiplo de 5, o dicho de otra manera cada 5 cactus, aumenta el nivel. Esto implica que el delay del objeto cactos desciende en base a la variable decrease hasta un l\u00edmite donde no aumentara m\u00e1s la dificultad (con la configuraci\u00f3n por defecto que tenemos el nivel m\u00e1ximo se alcanzar\u00eda a los 25 saltos, es decir el nivel 5). Una vez perdi\u00e9ramos ir\u00edamos a la secci\u00f3n de la pantalla de fin de juego, donde se mostrar\u00eda nuestra puntuaci\u00f3n obtenida y al pulsar el bot\u00f3n volver\u00edamos a Men\u00fa.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>IMPOSTOR INVADER:<\/li><\/ul>\n\n\n\n<p>Nuestro segundo juego implementado y donde m\u00e1s complicaciones tuvimos en el manejo de los distintos objetos, teniendo la nave espacial, 3 obst\u00e1culos, los obst\u00e1culos acumulados y la bala.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Variables:<\/li><\/ul>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int spaceshipPosition[]: posici\u00f3n de la nave. [0] = Posici\u00f3n en X, [1] = Posici\u00f3n en Y.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int obstacle1Position[]: posici\u00f3n del obst\u00e1culo 1. [0] = Posici\u00f3n en X, [1] = Posici\u00f3n en Y.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int obstacle2Position[]: posici\u00f3n del obst\u00e1culo 2. [0] = Posici\u00f3n en X, [1] = Posici\u00f3n en Y.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int obstacle3Position[]: posici\u00f3n del obst\u00e1culo 3. [0] = Posici\u00f3n en X, [1] = Posici\u00f3n en Y.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int obstaclesAcumulated[]: obst\u00e1culos acumulados arriba y abajo. [0] = Obst\u00e1culos acumulados arriba, [1] = Obst\u00e1culos acumulados abajo.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int bulletPosition[]: posici\u00f3n de la bala. [0] = Posici\u00f3n en X, [1] = Posici\u00f3n en Y.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 bool firedUp: estado de la bala del juego.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int obstacleDelay[]: delays de los distintos objetos. [0] = Delay obst\u00e1culo 1, [1] = Delay obst\u00e1culo 2, [1] = Delay obst\u00e1culo 3.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u00b7 int obstacleDecrease: cantidad que descender\u00e1 el delay de los objetos.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Funcionamiento:<\/li><\/ul>\n\n\n\n<p>El funcionamiento de este juego, aunque considerablemente m\u00e1s complejo que el de \u00abSus Jump\u00bb contiene las mismas estructuras y bases. El bucle que ejecuta el juego funciona exactamente igual y cada objeto se actualiza con su propio temporizador teniendo esta vez 3 obst\u00e1culos diferenciados. <\/p>\n\n\n\n<p>Debido a los problemas que causaba el tener tantos objetos que actualizar no pod\u00edamos usar (display.clear()) ya que cada objeto tenia tiempos de actualizaci\u00f3n muy distintos y creaba un efecto de refresco en la pantalla muy inc\u00f3modo por eso cada objeto se encarga de borrar su posici\u00f3n anterior y escribirla en la nueva. <\/p>\n\n\n\n<p>En el caso de la actualizaci\u00f3n de los objetos aparte de moverse comprueban su colusi\u00f3n contra la nave y si se ha dejado pasar se acumula al final de la pantalla y se reinicia el obst\u00e1culo llev\u00e1ndolo de nuevo al comiendo de la pantalla lcd, es decir la posici\u00f3n 15 y aleatorizando si va a estar arriba o abajo. La actualizaci\u00f3n de la nave se basa en la posici\u00f3n del \u00abJoyStick\u00bb si est\u00e1 centrado se redibuja la nave en la misma posici\u00f3n, y si movemos el joystick en cualquier direcci\u00f3n se mover\u00e1 hacia ella si hay espacio disponible, es decir si est\u00e1 arriba no podr\u00e1 seguir subiendo solo podr\u00e1 bajar, el \u00fanico movimiento distinto es hacia la izquierda que aparte de moverse comprueba si te has cochado contra los obst\u00e1culos acumulados y por \u00faltimo comprobamos tambi\u00e9n si la nave se ha chocado contra alg\u00fan asteroide al moverse. <\/p>\n\n\n\n<p>Las colisiones se comprueban varias veces debido a que como cada objeto se mueve con un delay distinto es posible que las colisiones no se detectaran si solo lo hicieran por una parte del colisionador \/ colisionado, es decir, es mejor comprobar si la nave se ha chocado al moverse y si el asteroide se ha chocado al moverse que solo comprobar una ya que podr\u00eda no detectarse. <\/p>\n\n\n\n<p>Para disparar tendremos que pulsar el bot\u00f3n y no haber ning\u00fan disparo en pantalla, es decir solo podemos disparar una vez cada vez, una vez disparamos inicializamos la posici\u00f3n del disparo y este continuara actualiz\u00e1ndose por su cuenta. <\/p>\n\n\n\n<p>La actualizaci\u00f3n del disparo es la que m\u00e1s veces se realiza ya que se mueve muy r\u00e1pido, aparte de moverse comprueba si se ha chocado con un asteroide, en cuyo caso lo destruye y aumenta en 1 la puntuaci\u00f3n sea cual sea el obst\u00e1culo, en este caso no es necesario comprobar varias veces las colisiones de la bala ya que al actualizarse tanto es muy complicado que se salte la colisi\u00f3n ya que solo tendr\u00eda 50ms para ocurrir. <\/p>\n\n\n\n<p>Cada vez que damos a un obst\u00e1culo este se reinicia y la bala tambi\u00e9n permitiendo disparar de nuevo. Igual que con \u00abSus Jump\u00bb la dificultad aumenta cada 5 asteroides reduci\u00e9ndose el delay de todos los obst\u00e1culos en relaci\u00f3n a la variable decrease hasta un m\u00ednimo de 200ms. <\/p>\n\n\n\n<p>Perdemos si chocamos contra cualquier obst\u00e1culo y se nos presentar\u00eda la misma pantalla de fin de juego que en \u00abSus Jump\u00bb reinici\u00e1ndose el ciclo al volver al men\u00fa.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>EFECTOS DE SONIDO:<\/li><\/ul>\n\n\n\n<p>A lo largo de todo el proyecto hemos incluido efectos de sonido para mejorar la experiencia del jugador, estos sonidos suenan en distintos momentos:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; Al cambiar la selecci\u00f3n de juego<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; Al saltar en \u00abSus Jump\u00bb<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; Al disparar en \u00abImpostor Invader\u00bb<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; Al golpear un obst\u00e1culo en \u00abImpostor Invader\u00bb<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; Al perder la partida<\/p>\n\n\n\n<p>Casi todos los efectos tienen esta estructura: (En este caso el tono durar\u00eda 200ms)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=2000;i&gt;1800;i&#8211;){&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tone(buzzer,i);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay(1);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p>Un problema que plantean estos efectos de sonido es que al ser arduino secuencial si tenemos un sonido que dura 100ms durante ese tiempo no se ejecutara nada m\u00e1s que ese sonido, por esa raz\u00f3n los efectos son escasos y solo ocurren en ciertas ocasiones de maneras muy breves ya que podr\u00edan da\u00f1ar m\u00e1s la experiencia del usuario que la mejora que aportan, este punto negativo es especialmente notable en \u00abImpostor Invader\u00bb cuando destruimos un objeto ya que la nave quedara quieta durante unos milisegundos, no consideramos que fuese especialmente molesto adem\u00e1s de que aportaba m\u00e1s feedback al jugador as\u00ed que lo mantuvimos.<\/p>\n\n\n\n<p>El \u00fanico efecto distinto al resto es al perder la partida ya que es un sonido m\u00e1s duradero, casi como una melod\u00eda corta, esto es as\u00ed ya que durante ese tiempo no afecta que no se puedan realizar m\u00e1s acciones.<\/p>\n\n\n\n<p><strong>Debido al tama\u00f1o excesivo del c\u00f3digo, no podemos subir el archivo completo a la p\u00e1gina.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video explicativo<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n al proyecto Cuando comenzamos a plantearnos de qu\u00e9 quer\u00edamos que tratase nuestro proyecto, ca\u00edmos en el enfoque de planteamiento m\u00e1s com\u00fan: eficiencia y utilidad. Estuvimos unos d\u00edas d\u00e1ndole vueltas sin llegar a ninguna&#46;&#46;&#46;<\/p>\n","protected":false},"author":33,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5743","post","type-post","status-publish","format-standard","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gameduino Advance - Proyectos con Arduino.<\/title>\n<meta name=\"description\" content=\"Proyecto de Sistemas Empotrados y de Tiempo Real del Grado de Ingenier\u00eda Inform\u00e1tica de la URJC - Grupo 13 - Curso 2021\/2022\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gameduino Advance - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Proyecto de Sistemas Empotrados y de Tiempo Real del Grado de Ingenier\u00eda Inform\u00e1tica de la URJC - Grupo 13 - Curso 2021\/2022\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-13T21:19:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-05-15T16:01:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Gameduino Advance\",\"datePublished\":\"2022-05-13T21:19:30+00:00\",\"dateModified\":\"2022-05-15T16:01:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/\"},\"wordCount\":2521,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/Esquema-del-circuito.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/\",\"name\":\"Gameduino Advance - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/Esquema-del-circuito.png\",\"datePublished\":\"2022-05-13T21:19:30+00:00\",\"dateModified\":\"2022-05-15T16:01:17+00:00\",\"description\":\"Proyecto de Sistemas Empotrados y de Tiempo Real del Grado de Ingenier\u00eda Inform\u00e1tica de la URJC - Grupo 13 - Curso 2021\\\/2022\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/Esquema-del-circuito.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/Esquema-del-circuito.png\",\"width\":567,\"height\":288},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gameduino-advance\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gameduino Advance\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gameduino Advance - Proyectos con Arduino.","description":"Proyecto de Sistemas Empotrados y de Tiempo Real del Grado de Ingenier\u00eda Inform\u00e1tica de la URJC - Grupo 13 - Curso 2021\/2022","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/","og_locale":"es_ES","og_type":"article","og_title":"Gameduino Advance - Proyectos con Arduino.","og_description":"Proyecto de Sistemas Empotrados y de Tiempo Real del Grado de Ingenier\u00eda Inform\u00e1tica de la URJC - Grupo 13 - Curso 2021\/2022","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2022-05-13T21:19:30+00:00","article_modified_time":"2022-05-15T16:01:17+00:00","og_image":[{"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/"},"author":{"name":"","@id":""},"headline":"Gameduino Advance","datePublished":"2022-05-13T21:19:30+00:00","dateModified":"2022-05-15T16:01:17+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/"},"wordCount":2521,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/","name":"Gameduino Advance - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png","datePublished":"2022-05-13T21:19:30+00:00","dateModified":"2022-05-15T16:01:17+00:00","description":"Proyecto de Sistemas Empotrados y de Tiempo Real del Grado de Ingenier\u00eda Inform\u00e1tica de la URJC - Grupo 13 - Curso 2021\/2022","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/Esquema-del-circuito.png","width":567,"height":288},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gameduino-advance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Gameduino Advance"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=5743"}],"version-history":[{"count":3,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5743\/revisions"}],"predecessor-version":[{"id":5777,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5743\/revisions\/5777"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=5743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=5743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=5743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}