Programamos un Runner en ensamblador Z80, 2ª parte ( Amstrad CPC )

แชร์
ฝัง
  • เผยแพร่เมื่อ 14 ต.ค. 2021
  • 1ª parte: • Programamos un Runner ...
    Continuamos programando un Runner en ensamblador Z80 para Amstrad CPC. Ya tenemos una base con unas entidades creadas en un motor ECS, un mínimo sistema de control, movimientos y dibujado con sistemas de input, física y render. Ahora evolucionamos para crear el sistema de colisiones, las reacciones a las colisiones y mejorar los controles de juego. Finalmente, si da tiempo, realizaremos la creación de enemigos para tener una jugabilidad mínima completa.
    Configuración de desarrollo utilizada:
    - Linux Manjaro 5.14.2-1 x86_64
    - CPCtelera 1.5 dev (16/09/2021)
    - GCC 11.1.0
    - Bash 5.1.8
    Clase especial para las asignaturas Videojuegos 1 y Razonamiento Automático de la Universidad de Alicante, Grados en Ingeniería en Informática e Ingeniería Multimedia.
    Asset Licenses
    Música: Galactic Tomb - Level 1 - Pherenos / McKlain
    URL: bit.ly/GalacticTombPherenos
    Videojuego: Crimson Knight Adventures / Nibble Bytes (2018)
    URL: bit.ly/CrimsonKnight
    Autores:
    - Carlos Soler Mujeriego (SolerMultimedia/Github)
    - Enrique Vidal Cayuela (EnriqueVid/Github)
    - Alejandro Gutierrez Martínez (agm280/Github)

ความคิดเห็น • 9

  • @raulgarfer
    @raulgarfer 2 ปีที่แล้ว +2

    Aclaras dudas, haces pensar y enseñas lógica y matemáticas. Excelente

  • @fraespre
    @fraespre ปีที่แล้ว +1

    Magnífico tutorial. Enhorabuena!
    Me he dado cuenta de una obviedad: un juego estructurado en forma ecs, fácilmente puede convertirse en multiplataforma. Simplemente hay q reemplazar los sistemas q tocan algo del hardware y los gráficos, evidentemente.

  • @ThefourheadedcatGames
    @ThefourheadedcatGames ปีที่แล้ว +1

    Magnífico, como siempre.
    Una pregunta, ¿qué desventaja o problemas podría haber si para la reposición ante una colisión determinamos la dirección comparando la velocidad? Es decir, si velocidad negativa asumimos colisión desde la derecha y viceversa. (con un cp #0 y un jp m, colision_desde_derecha)

    • @ProfesorRetroman
      @ProfesorRetroman  ปีที่แล้ว +1

      Si la colisión es en una única dimensión (izquierda-derecha) seguramente funcione bien en la mayoría de casos. Eso sí, podrías colisionar por la izquierda moviéndote a la derecha, si lo que colisiona contigo es un objeto moviéndose a la derecha también, pero más rápido que tú. Eso, podría darte problemas.
      Si la colisión es en 2 dimensiones, tienes muchos más casos. Puedes estar moviéndote a la izquierda y chocar con algo que viene de arriba o de abajo. O también puedes chocar con esquinas. También puedes moverte en diagonal y necesitar determinar qué colisión es primero, si la lateral o la superior/inferior... Hay muchos casos :).
      Para estas cosas, no hay nada como la experiencia y haberlo hecho unas cuantas veces :). Prueba y no te preocupes: si algo falla luego, aprenderás mucho en el proceso, que es lo que importa.

    • @ThefourheadedcatGames
      @ThefourheadedcatGames ปีที่แล้ว +1

      @@ProfesorRetroman muchas gracias por la respuesta!

  • @josegarciaperez6003
    @josegarciaperez6003 2 ปีที่แล้ว +1

    Alrededor de 48:26
    Aunque al final no lo uses, y aunque tampoco sé como has implementado "man_entity_forall_matching", si la llamada que desde ahí se hiciera a "sys_collision_check_collisions_collider_collisionable" fuese la habitual (me refiero a un "call" sin más) creo que lo de pop iy / push iy para recuperar el valor de ix y dejarlo en iy no habría funcionado. En ese caso, en la pila, antes del valor del registro ix, estaría la dirección de retorno del "call" -que sería lo último que se habría apilado antes de saltar-. Si así fuese creo que tendrías que haber hecho algo parecido a esto:
    pop de ; [3] da por sentado que en DE no hay nada de valor
    pop iy ; [4] carga en iy lo que antes estaba en ix
    push iy ; [5] deja el dato que había en la pila para no alterarla
    push de ; [4] y deja la dirección de retorno tal y como estaba en la pila
    en total, 16 microsegundos. Si con una pareja push/pop ya era prohibitivo, así imagino que sería un despropósito :-) :-). De todas formas, como no sé exactamente como has implementado "man_entity_forall_matching" tampoco estoy seguro de que habría sido así.
    * Bueno, mirando sobre de 1:42:15 igual podría tener una idea de ese código ;-)

    • @ProfesorRetroman
      @ProfesorRetroman  2 ปีที่แล้ว +1

      Muy bien visto, José :). Sin duda, tienes toda la razón. Aunque podría hacer alguna magia exótica dentro de man_entity_forall_matching para que lo que he escrito en clase hubiera funcionado, lo cierto es que tampoco tendría ningún sentido hacerlo. Simplemente quise dar un ejemplo de una idea, lo pensé rápido y metí la pata. Haces muy bien en puntualizarlo y detallar dónde está el error :).
      Muchísimas gracias por la puntualización y la atención al detalle. Sin duda esto nos ayuda a mejorar a todos y seguro que servirá para quienes vean el vídeo, si se preguntan lo mismo, puedan verlo en tu comentario :).

    • @josegarciaperez6003
      @josegarciaperez6003 2 ปีที่แล้ว +1

      @@ProfesorRetroman Gracias a ti como siempre. Tus videos no tienen precio, y difícilmente podremos agradecerte la labor que haces... Ya quisiera yo meter la pata así... a ver quien más se atreve en internet a escribir código en ensamblador en directo y encima que le funcione :-)

    • @raulgarfer
      @raulgarfer 2 ปีที่แล้ว

      @@josegarciaperez6003 como tu dices, pocos se atreven con ensamblador, con público y grabando todo