{"id":1456,"date":"2024-11-05T21:44:48","date_gmt":"2024-11-05T21:44:48","guid":{"rendered":"https:\/\/ninquiet.com\/?p=1456"},"modified":"2024-11-21T05:50:50","modified_gmt":"2024-11-21T05:50:50","slug":"game-bitdroid","status":"publish","type":"post","link":"https:\/\/ninquiet.com\/index.php\/2024\/11\/05\/game-bitdroid\/","title":{"rendered":"Game: BitDroid"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"bitdroid\">BITDROID<\/h1>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/59e4da75f9a62d0f008bc75e5ebf2603.gif\" alt=\"Portada\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"video-\">Video:<\/h1>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"BitDroid Preview\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/00tMO94JzMw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"build-\">Build:<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"webgl-\">WEBGL:<\/h3>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/simmer.io\/@Ninquiet\/bitdroid\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"android-apk-\">Android APK:<\/h3>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/drive.google.com\/file\/d\/1uboAKwvmPvxGybUzf7whBWIWJWcflw6M\/view?usp=sharing\n<\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"resumen-\">Resumen:<\/h1>\n\n\n\n<p>Es un juego de plataformas, para moverte puedes usar WASD o las flechitas, para saltar usa la barra espaciadora, para entrar a men\u00fa pausa puedes usar la tecla Esc, y el mouse junto al click izquierdo para disparar, si tienes municiones claro.<\/p>\n\n\n\n<p>puedes acabar con enemigos saltandoles encima, pero si estos te tocan morir\u00e1s instantaneamente a menos de que tengas puesto tu casco, en cuyo caso perderas tu casco pero podr\u00e1s seguir luchando, puedes morir tambien si una puerta te cae encima o si caes en las puas<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"funcionamiento-\">Funcionamiento:<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iluminaci-n-2d-\">Iluminaci\u00f3n 2D:<\/h3>\n\n\n\n<p>He usado el sistema de iluminaci\u00f3n 2D para dar mayor interes al juego, al ser juego de plataformas-terror-Acci\u00f3n se beneficia mucho de poder agregar puntos de inter\u00e9s o de limitar la visibilidad del juegador seg\u00fan sea la zona, esto da mucho con lo que jugar al momento de crear diferentes tipos de experiencias, por ejemplo al inicio es mucho m\u00e1s facil ver la direcci\u00f3n que el jugador tiene que tomar pues est\u00e1 mucho m\u00e1s iluminado, pero al avanzar vas perdiendo luminocidad y y ca creando una sensaci\u00f3n de terror lentamente a lo desconocido.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/b67f59361c0f2cbe747fcf1ee7788ccc.png\" alt=\"2DIlumination\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"activadores-puertas-y-trampas\">Activadores, Puertas y trampas<\/h3>\n\n\n\n<p>Los activadores son botones que funcionan para activar otros objetos, por el momento solo est\u00e1n asociados a las puertas que al mismo tiempo funcionan como trampas, al oprimir el activador, este mover\u00e1 la puerta de una posicion a otra abriendo o cerrando la puerta, sin embargo no existe solo un tipo de activador, algunos solo suben la puerta mientras est\u00e9n siendo presionados, pero al liberarlos la puerta bajara nuevamente, y ac\u00e1 est\u00e1 la trampa pues si el personaje es aplastado por la parte baja de la puerta morir\u00e1 instantaneamente.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/e70e8b3bb090c8fa8d533b761e72b2ce.png\" alt=\"Activators previous moment\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/6bf86a3e680cf703e4815770a522f6d4.png\" alt=\"Activators post moment\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"escaleras-\">Escaleras:<\/h3>\n\n\n\n<p>Las escaleras fueron un peque\u00f1o reto, porque al estar subiendo o bajando las escaleras el personaje tiene que desactivar su gravedad y posibilitar el movimiento en el eje Y, sin embargo al poder ser atacado el personaje podia volar sin rumbo, as\u00ed que fueron necesarios muchos procesos de iteraci\u00f3n para lograr dar con la forma correcta de implementarlas, tambien lara implementar la animaci\u00f3n agergu\u00e9 un segundo layer en el animator el cual cambiaba de peso segun si el personaje estaba escalando o no, todo lo relacionado a este sistema se encuentra en <strong>PlayerClimbController<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/a5d1bc3dee6d185632682acaf790f27d.png\" alt=\"Climbing animator\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/dd72623a496d0d4e61b2f2b60cc0e510.png\" alt=\"Laders\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"inteligencia-artificial-mejorada-\">Inteligencia Artificial mejorada:<\/h3>\n\n\n\n<p>Mejor\u00e9 la inteligencia artificial al momento de tomar desiciones, as\u00ed sus ataques ahora son mas precisos y trata de predecir mejor al jugador, c\u00f3mo tambien trata de evadir obstaculos del escenario, por ejempo cuando se encuentran bloqueados por una parte del escenario en la direcci\u00f3n a la que se est\u00e1n moviento, intentar\u00e1n saltarla para continuar con la persecuc\u00edon.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/0783865612abfbd3af96dd289e0a20d4.gif\" alt=\"AI improved\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"las-cajas-pesadas-pueden-matar-\">Las cajas pesadas pueden matar:<\/h3>\n\n\n\n<p>Las cajas pesadas pueden lastimar a quienes les caingan encima (solo las cajas pesadas no destructibles), esto significa que pueden matar cualquier enemigo, c\u00f3mo tambien que pueden matar al jugador si alg\u00fan enemigo empuja alguna sobre el.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/87d43fab1068729d921092f9030ff660.gif\" alt=\"Heavie boxes\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"creditos-\">Creditos:<\/h3>\n\n\n\n<p>Cree una simple pantalla para los creditos.<\/p>\n\n\n\n<p>![Credits] (<a href=\"https:\/\/i.gyazo.com\/aaa5ec1f34a913d86d2a5f27772a8dd7.png\">https:\/\/i.gyazo.com\/aaa5ec1f34a913d86d2a5f27772a8dd7.png<\/a>)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mejorado-el-paralax-\">Mejorado el paralax:<\/h3>\n\n\n\n<p>Ahora el paralax es m\u00e1s amplio y abarca diferentes tipos de alturas c\u00f3mo tambien ahora tiene efectos dinamicos c\u00f3mo los son los rayos<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/61d37802922576af0ba6d78e39606576.png\" alt=\"Paralax1\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/764f3273a8ca9eafac5f7931e2d7db34.gif\" alt=\"Paralax2\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tilemap-de-varias-capas-\">Tilemap de varias capas:<\/h3>\n\n\n\n<p>Ahora el tilemap del escenario completo est\u00e1 creado por 4 diferentes tilemaps, cada uno con su funci\u00f3n (por ejemplo hay uno que la unica funcion es agregar nuevo contenido de fondo y el parte frontal del escenario, unitcamente estetic)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/329e1e762a400b5fbccc8cfd73017d38.png\" alt=\"TileMap layes\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nueva-imagen-de-intro-y-splash-screen-\">Nueva Imagen de Intro y Splash Screen:<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/8070dd9455af60794c37fc25de3a96a9.png\" alt=\"Sketch\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/59e4da75f9a62d0f008bc75e5ebf2603.gif\" alt=\"PortadaV2\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/154bb803a0ee9bac9ab01e0f0b3910b0.gif\" alt=\"SplashScreen\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nuevo-nivel-completamente-modificado-\">Nuevo nivel completamente modificado:<\/h3>\n\n\n\n<p>El nuevo nivel esta dise\u00f1ado para tener en cuenta c\u00f3mo el usuario va conectandose con la jugabilidad, as\u00ed de forma muy clara el usuario va entendiendo que es un activador, al estar este en su primera estancia que es totalmente segura, luego entiende que puede disparar a distancia al activar el segundo activador con el arma a distancia (siendo esta la unica forma de activarlo), ve un enemigo morir en un acantilado as\u00ed que puede deducir que es peligroso caer, y hay un segundo enemigo que es dificil de evadir, y muy posiblemente lastimar\u00e1 al jugador, perdiendo as\u00ed su casco, ense\u00f1andole que al ser lastimado perder\u00e1 su casco, y si es lastimado nuevamente morir\u00e1, al estar cerca del inicio no sera un golpe grande as\u00ed que aprender\u00e1 sin necesidad de frustraci\u00f3n, y as\u00ed con otras mecanicas.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/1de40e99e3748582217ebe19b8255549.png\" alt=\"New Level\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nuevos-sonidos-\">Nuevos sonidos:<\/h3>\n\n\n\n<p>Agregu\u00e9 nuevos sonidos para cosas c\u00f3mo el inicio de la batalla con el jefe, o los activadores, para crear estos sonidos us\u00e9 Udio que es una plataforma para crear sonidos con inteligencia artificial, y tambien modifiqu\u00e9 los resultados con Adobe Audition<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nueva-imagen-del-personaje-\">Nueva imagen del personaje:<\/h3>\n\n\n\n<p>Modifiqu\u00e9 cada uno de los sprites del personaje as\u00ed como sus power ups, para darle m\u00e1s identidad, haciendo que el casco sea algo mas caracteristico (que incluso us\u00e9 para la ilsutraci\u00f3n de la portada), y creando nuevas animaciones, c\u00f3mo la animaci\u00f3n de escalar.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/cdc7ce6868184accce0b944cc5a208bb.png\" alt=\"NewImage Character\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"actualizada-la-rotaci-n-del-arma-\">Actualizada la rotaci\u00f3n del arma:<\/h3>\n\n\n\n<p>Ahora el arma al dejar de ser disparada rotar\u00e1 en el sentido horizontal m\u00e1s cercano a la ultima posici\u00f3n en la que fue disparado, es un peque\u00f1o detalle pero hace que ver al personaje sealgo mucho m\u00e1s agradable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"modificaci-n-en-las-fisicas-\">Modificaci\u00f3n en las fisicas:<\/h3>\n\n\n\n<p>Ahora el personaje cae m\u00e1s rapido y salta menos alto, esto para agregar algunas limitaciones al personaje y que el ataque de los enemigos sea un verdadero reto evadirlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"version-android-y-touch\">Version Android y Touch<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/f463d6426d29325a7e69e9341dd7b60a.png\" alt=\"Touch\"\/><\/figure>\n\n\n\n<p>Para crear la version Android tuve que modificar c\u00f3mo funcionaban los input (en todo lo que usara input), y lo centralice en PlayerInputs.cs este se encarga de regresar el estado de cada uno de los inputs, y retorna los inputs seg\u00fan el systema activo, cuando se reconoce algun touch, activa el systema touch, y cuando se reconoce alguna tecla activa el system de teclado y mouse<\/p>\n\n\n\n<p>Para crear los systemas cree primero PlayerInputHandler que es la base abstracta sobre la que los otros systemas se crear\u00e1n, luego cree KeyboardAndMouseInputHandler, y re-mapee con cada uno de los inputos que estaba usando anteriormente, el reto fue al crear TouchInputHandler.cs, pues este se encarga de responder las mismas peticiones pero desde los touch, este funciona reconociendo la mitad izquierda de la pantalla como espacio para touch de movimiento, la parte derecha para touch de disparo (a menos que est\u00e9 tocando el boton salto) y con un bot\u00f3n de salto se gestiona el inicio y fin del salto.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/f364caa9ac578d0e028fa2d909d36578.png\" alt=\"TouchSystem\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"disparo-cargado\">Disparo Cargado<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/thumb\/525\/33ce91bab1fa6028658c21762937a9ef-png.jpg\" alt=\"DisparoCargado\"\/><\/figure>\n\n\n\n<p>Ahora el personaje puede cargar su disparo y con un sistema de mascaras se visualiza la cantidad de carga del disparo, esta potencia aumenta y disminuye de acuerdo a la cantidad de tiempo que lleve oprimido el click, de esta forma podemos tener disparos cercano o lejanos seg\u00fan la estrategia del jugador, todo con un solo click.<\/p>\n\n\n\n<p>As\u00ed mismo, es disparado un proyectil que va cambiando su rotaci\u00f3n seg\u00fan la velocidad y direcci\u00f3n, que a su mismo tiempo se va modificando tambien por la gravedad, as\u00ed que los disparos son notoriamente curvos, similar a Worms.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/11c2e2bdad67e04515ff83388c1a905b.png\" alt=\"ShootingFlow\"\/><\/figure>\n\n\n\n<p>Esto lo logramos al combinar ShootingController con BasicBullet (la clase que lleva en su interior el disparo), ShootingController se encarga de hacer todos los calculos pertinentes al disparo, (el poder disparar o no est\u00e1 controlado por cada sub estado en el MachineState),<\/p>\n\n\n\n<p>Cuando el disparo colisiona con algo, revisa si tiene el Layer Enviroment, si es as\u00ed spawnea particulas de explosion y se auto destruye, si por el contrario choca con un enemigo, entonces spawnea particulas de sangre, busca el LifeController en el enemigo, invoka el TakeDamange y se auto destruye.<\/p>\n\n\n\n<p>Esto es super importante, porque significa que los disparos pueden interactuar con cualquier objeto que tenga LifeController y (en el caso del BasicBullet) est\u00e9 en el layer Enemy, con el Tag Enemy, algo que usaremos tambien para destruir objetos en el escenario como las cajas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"objetos-que-cambian-el-estado\">Objetos que cambian el estado<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/ed724b18e76a8d7fdf40c0e3cbf1a5c4.png\" alt=\"Objetos cambia estado\"\/><\/figure>\n\n\n\n<p>Existen dos tipos de objetos que se pueden recoger, Healt que ser\u00eda para aumentar la salud, y Munition para aumentar la munic\u00edon.<\/p>\n\n\n\n<p>En el caso de Healt, realmente lo que hace es al estilo de Mario Bross realizar un cambio en el personaje poniendolo verde y agregandole un gorrito, esto simboliza que tenemos dos puntos de vida que es el maximo, si somos golpeados perdemos el gorrito y el color verde, simbolizando que regresamos de nuevo a un punto de vida.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/50124945f202fca0cd436c7599cb6e3b.png\" alt=\"LifeChange\"\/><\/figure>\n\n\n\n<p>Munition por otro lado, es la forma principal por la cual obtenemos munici\u00f3n en el juego, este item nos permite aumentar la cantidad de munici\u00f3n de nuestra arma en 5, nuestra munici\u00f3n actual la podemos evidenciar todo el tiempo en la parte superior izquierda de la interfaz.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/d64f0d6530cedc2131aad6adf59d1862.png\" alt=\"Munition interfaz\"\/><\/figure>\n\n\n\n<p>Cada vez que disparamos el personaje hace una peque\u00f1a animaci\u00f3n donde hace el arma peque\u00f1a (mientras esta est\u00e1 en rojo), esta se hace grande nuevamente si el personaje aun tiene munici\u00f3n para disparar, llegado el caso de no haber m\u00e1s munici\u00f3n el arma se quedara peque\u00f1a hasta encontrar nueva munici\u00f3n, esta parte es controlada tambien por <strong>ShootingController.cs<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/a309c04f2d5e6bd005046bdb7f2fe0ab.png\" alt=\"Out of ammo\"\/><\/figure>\n\n\n\n<p>Sin embargo, para poder acceder a estos items, debemos romper las cajas que encontramos a lo largo del nivel, estas se distinguen entre 4<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/gyazo.com\/eefa7990151fe0eb7d446e8662efbeb3\" alt=\"Boxes\"\/><\/figure>\n\n\n\n<p>La primera es, BoxItem, esta es simplemente una caja que se rompe, puede romperse saltando sobre ella o con un disparo, es la base para las otras cajas.<\/p>\n\n\n\n<p>La segunda ser\u00eda BoxHealt que al momento de ser destruida deja en su lugar un item Healt.<\/p>\n\n\n\n<p>La tercera es BoxMunition que al ser destruida deja munici\u00f3n.<\/p>\n\n\n\n<p>y por ultimo est\u00e1 la BoxNonDestructible, que c\u00f3mo su nombre lo indica no es posible destruirla. esta la cree para crear peque\u00f1os mini puzzles donde las cajas con items est\u00e1n bajo cajas indestructibles, para ver c\u00f3mo el jugador se ingenia mover las cajas y obtener los items.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/563e31b2ddc8b06c673ec0b04f2b42b9.png\" alt=\"BoxesOnScene\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"checkpoints-y-savestates\">CheckPoints Y SaveStates<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/a5c5c17e4779a7b19c55ffbb4535be1c.png\" alt=\"SaveStates\"\/><\/figure>\n\n\n\n<p>Para hablar de los CheckPoints primero tenemos que hablar del sistema de guardado, y registro, de esto se encarga SaveSystem.cs una clase que cree en un inicio c\u00f3mo Monobehaviour, pero a medida que avance con el proyecto, me di cuenta que necesitaba que esto fuera un poco m\u00e1s independiente de las escenas, y no quer\u00eda crear un objeto persistente, as\u00ed que decid\u00ed hacer la clase enteramente estatica.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/9ae66cb9e8ecb38480fbfbe926e8203f.png\" alt=\"SaveSystem\"\/><\/figure>\n\n\n\n<p>Este se encarga de crear el archivo y el directorio, y guarda la partida en formato Json, para guardar la partida en diferentes slots cree estas dos estructuras de datos serializadas:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/a1ec423fea9191e5580e67bc67622690.png\" alt=\"DataStructureSave\"\/><\/figure>\n\n\n\n<p>Por ahora en el juego solo vi pertinente guardar la posici\u00f3n de guardado (debido a que solo tengo un nivel), sin embargo, si necesitara ma inforaci\u00f3n solo tendr\u00eda que modificar el SaveData<\/p>\n\n\n\n<p>El Checkpoint por otra parte es mucho m\u00e1s simple, (aunque tiene una animaci\u00f3n bonita), simplemente es un trigger que al colisionar con el player envia la orden al SaveSystem de guardar esa posici\u00f3n, esto resumiendolo.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/72103a8cc21c4f20ef8e015ab55a7ff0.png\" alt=\"Checkpoint\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sonidos-\">Sonidos!!<\/h3>\n\n\n\n<p>Para el sistema de sonidos me inspir\u00e9 un poco en el sistema de guardado, as\u00ed que es un sistema semi estatico, pues lo estatico es su Instanc\u00eda, y atraves de ella se puede acceder a cualquiera de sus acciones, para organizar cada uno de los sonidos posibles, cree un enum con cada uno de ellos.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/165da9fb1fe5acada59cac6c86cbb9e6.png\" alt=\"SoundsEnum\"\/><\/figure>\n\n\n\n<p>Luego en la clase agregu\u00e9 referencias a cada uno de los audio clips y el audio source, y luego en el metodo PlayAudio con e uso de un Swich reproduzco el sonido acorde a la elecci\u00f3n.<\/p>\n\n\n\n<p>Ac\u00e1 un ejemplo de c\u00f3mo se usa:<br><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/2e3345a91ba52c25592f406077ca3281.png\" alt=\"UsageOfSounds\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nuevos-enemigos\">Nuevos Enemigos<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/9110964b5a0210f3828810a26e42bd2a.png\" alt=\"Enemies\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/6483e7d991fdd9f3530f2bf6659d7960.png\" alt=\"Enemies2\"\/><\/figure>\n\n\n\n<p>Ahora hay en teor\u00eda tres nuevas variantes de enemigos (debido a que el enemigo base tambien fue modificado)<\/p>\n\n\n\n<p>Primero tenemos el enemigo base, su rango se aument\u00f3, y se le agreg\u00f3 una nueva capacidad, la de saltar, pero no solo salta de forma aleator\u00eda, salta seg\u00fan la situaci\u00f3n en la que se encuentre (por si est\u00e1 bloqueado) y si reconoce que el jugador est\u00e1 en una parte superior a el, de esta forma puede escalar, e incluso escalar apilandose los unos a los otros, toda la informaci\u00f3n de como funciona est\u00e1 en sus StateMachine<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/b1c3e06ab60c3df40993bcf5bf16444a.png\" alt=\"BaseEnemie\"\/><\/figure>\n\n\n\n<p>En segundo lugar tenemos el enemigo rosa, este es m\u00e1s rapido y a diferencia del anterior que dejara de saltar si se encuentra en el mismo nivel que el jugador (de altura), este seguir\u00e1 dando peque\u00f1os saltos aun as\u00ed, de esta forma dispararle es mucho m\u00e1s dificil, y es mucho m\u00e1s peligroso, es un peque\u00f1o cambio pero afecta bastante la jugabilidad.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/54118c9d2b16c1789912479ffdd17fee.png\" alt=\"PinkEnemie\"\/><\/figure>\n\n\n\n<p>En tercer lugar tenemos el enemigo amarillo, este es completamente distinto a los anteriores, aunque tambien puede ser vencido saltandole encima, este toma distancia del jugador y se mantiene a cierta distancia, cuando se le dispara trata de evadir el disparo, y luego de unos segundos se avalanza a atacar al usuario de forma rapida para luego regresar a una posici\u00f3n defensiva.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/f3666ad31628cf80fd69c2b05080563c.png\" alt=\"YellowEnemie\"\/><\/figure>\n\n\n\n<p>Y por ultimo tendr\u00edamos al <strong>enemigo final<\/strong>, este est\u00e1 programado de forma totalmente distinta, Todo su codigo se encuentra en FinalBoss.cs, pero en resumen lo que hace es esperar hasta que un trigger cerca a el indica que debe iniciarse la batalla, en este momento el enemigo baja a un nivel donde es posible dispararle, y empieza a liberar objetos de forma aleatoria, puede liberar objetos c\u00f3mo municion o salud, c\u00f3mo tambien liberar enemigos del tipo basico o rosa (no agregu\u00e9 amarillo porque pens\u00e9 que seria muy dificil), al derrotarlo el enemigo se auto destruir\u00e1 con algunas particulas, sonar\u00e1 el sonido de victoria, y el jugador ser\u00e1 recogido nuevamente por el helicoptero, mostrando la pantalla de victoria<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/00d8e0350732eb7c51f6b57a458a775d.png\" alt=\"FinalBoss\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/gyazo.com\/f7100cba2a2a3de1db57db35df9e7f3a\" alt=\"FinalHelicopter\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ui-mejorada\">UI Mejorada<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/user-content.gitlab-static.net\/c32b0303f3f5a4dcb70892485c0ec630932f1df7\/68747470733a2f2f692e6779617a6f2e636f6d2f61356335633137653437373961376231396335356666626234353335626531632e706e67\" alt=\"IntroScreen\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/d4ff4c4cf8c5af9535032891409405b3.png\" alt=\"PausaSreen\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/a6ff344e1473547bf3eae3993f57cb25.png\" alt=\"DefeatScreen\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/aa0b4bef5f51ece6051e94a46806df85.png\" alt=\"VictoryScreen\"\/><\/figure>\n\n\n\n<p>Remplace las tipograf\u00edas, los textos, los botones, los estilos, re organice todo, y mejor\u00e9 el estilo de cada una de estas interfaces, c\u00f3mo tambien agregu\u00e9 el el poder acceder a diferentes partidas guardads.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lo-antiguo-\">Lo Antiguo:<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/ftZsgPb\/image-2024-04-28-181819327.png\" alt=\"Diagrama1\"\/><\/figure>\n\n\n\n<p>Lo he creado teniendo en cuenta que pueda ser escalable, entnces cree un state machine basico que funcionar\u00e1 para todos los personajes (cuento como persnajes a enemigos y al jugador), pero cada uno crear\u00e1 su propia implementaci\u00f3n, por ejemplo el jugador dicta el movimiento seg\u00fan el sistema de input (he usado el nuevo sistema de Input para esta implementacion), mientras que los enemigos dictan su movimiento por triggers que reconocen el jugador<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/PrgzRKx\/image-2024-04-28-181609388.png\" alt=\"Diagrama2\"\/><\/figure>\n\n\n\n<p>El State machine es gerarquico, as\u00ed que primero pasa entre estados Root, como: grounded, Jump, y Airborn, y estos estados al entrar asignan sub estados de segunda categor\u00eda segun las variables que hay en el contexto (el contecto es el state machine), estos sub estados pueden sub asignarse tambien su estados, por eso algunso sub estados a su vez se asignan el sub estado HorizontalMovment<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/1LsqpxW\/image-2024-04-28-182307948.png\" alt=\"Diagrama3\"\/><\/figure>\n\n\n\n<p>El resto del funcionamiento es muy simple, solo cada uno (jugador y enemigos) crean sus variantes del state machine base, y crean sus propias implementaciones, la idea era que tambien crearan sus propios sub estados y state factory, pero al final no fue necesario implementarlo (pero sigue estando ahi para poder escalar el proyecto en un futuro)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/0pLBjbK\/image-2024-04-28-182755828.png\" alt=\"Diagrama4\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/RTcctgM\/image-2024-04-28-183052797.png\" alt=\"Diagrama4\"\/><\/figure>\n\n\n\n<p>Para la animaci\u00f3n cree una clase llamada &#8220;CharacterAnimationController.cs&#8221; la cual los estads del state machine tienen cntrol, y envian diferentes cambios para el animator, el animator usados sub estados, para controlar las acciones de cuando el personaje est\u00e1 en el aire o en el suelo, (para el enemigos us\u00e9 una copia de este mismo animator pero con animaciones del enemigo)<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/y5DNBY4\/image-2024-04-28-183516141.png\" alt=\"Diagrama5\"><br>Para el escenario he usado un tilemap donode cree un tile dinamico que he usado para todo el escenario.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"assets-usados-\">Assets usados:<\/h1>\n\n\n\n<p><a href=\"https:\/\/assetstore.unity.com\/packages\/tools\/animation\/dotween-hotween-v2-27676\">DoTween<\/a><br>Para hacer transiciones rapidamente.<\/p>\n\n\n\n<p><a>Cinemachine<\/a><br>Para hacer controlar el movimiento de la camara.<\/p>\n\n\n\n<p><a href=\"https:\/\/kenney.nl\/assets\/1-bit-platformer-pack\">Kenney 1bit Asset<\/a><br>He usado esta textura para crear todos los sprites usados.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>BITDROID Video: Build: WEBGL: Android APK: Resumen: Es un juego de plataformas, para moverte puedes usar WASD o las flechitas, para saltar usa la barra espaciadora, para entrar a men\u00fa pausa puedes usar la tecla Esc, y el mouse junto al click izquierdo para disparar, si tienes municiones claro. puedes acabar con enemigos saltandoles encima, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1457,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,24],"tags":[],"class_list":["post-1456","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-thinking","category-develop"],"_links":{"self":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts\/1456"}],"collection":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/comments?post=1456"}],"version-history":[{"count":1,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts\/1456\/revisions"}],"predecessor-version":[{"id":1458,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts\/1456\/revisions\/1458"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/media\/1457"}],"wp:attachment":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/media?parent=1456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/categories?post=1456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/tags?post=1456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}