Página 3 de 20

Re: Buñuelera

Publicado: Mar, 07 Ene 2014, 19:01
por antoniovillena
Ya está, ya he terminado la demo tal cual estaba, incluyendo el manejo del personaje por la pantalla con las teclas OPQA. Los archivos cambiados son main.c, bunuelera.h y loader.asm.

No tengo mucha idea en el manejo de este compilador, y no sé cómo decirle los registros que va a machacar la rutina FRAME, por eso me daba fallos. De momento lo he solventado salvando IX y BC, pero no es una solución definitiva.

Para los curiosos que no tengan ganas de meterse en el repositorio, este es el main.c:

Código: Seleccionar todo

#include  "bunuelera.h"

const unsigned char data[32]= {
  0x00, 0x42, 0x11, 0,
  0x08, 0x60, 0x60, 2,
  0x09, 0xa8, 0x48, 3,
  0x0a, 0x22, 0x02, 1,
  0x0b, 0xd0, 0x6e, 2,
  0x0c, 0xb6, 0x34, 3,
  0x0d, 0x32, 0x32, 1,
  0x04, 0x52, 0x5e, 0};

int main(){

  // variables
  int i, x= 0, y= 0;

  // pasar personajes a sprites
  for ( i = 0; i < 32; i++ )
    sprites[i>>2][i&3]= data[i];

  // inicializar engine
  INIT;

  // mostrar la primera pantalla al comienzo
  screen= 0;

  while(1){

    // esto hace que el engine procese un frame generando el escenario
    FRAME;

    // movimiento de los enemigos
    for ( i = 1; i < 8; i++ ){
      if( sprites[i][3]&1 )
        if( sprites[i][2] )
          sprites[i][2]--;
        else
          sprites[i][3]^= 1;
      else
        if( sprites[i][2]<0x90 )
          sprites[i][2]++;
        else
          sprites[i][3]^= 1;
      if( sprites[i][3]&2 )
        if( sprites[i][1]>0x08 )
          sprites[i][1]--;
        else
          sprites[i][3]^= 2;
      else
        if( sprites[i][1]<0xe8 )
          sprites[i][1]++;
        else
          sprites[i][3]^= 2;
    }

    // movimiento del protagonista
    if( ~KeybYUIOP & 0x01 ){ // P
      if( sprites[0][1]<0xee )
        sprites[0][1]++;
      else if( x < 11 )
        sprites[0][1]= 0x02,
        screen= y*12 + ++x;
    }
    else if( ~KeybYUIOP & 0x02 ){ // O
      if( sprites[0][1]>0x02 )
        sprites[0][1]--;
      else if( x )
        sprites[0][1]= 0xee,
        screen= y*12 + --x;
    }
    if( ~KeybGFDSA & 0x01 ){ // A
      if( sprites[0][2]<0xa0 )
        sprites[0][2]++;
      else if( y < 1 )
        sprites[0][2]= 0x01,
        screen= ++y*12 + x;
    }
    else if( ~KeybTREWQ & 0x01 ){ // Q
      if( sprites[0][2]>0x01 )
        sprites[0][2]--;
      else if( y )
        sprites[0][2]= 0xa0,
        screen= --y*12 + x;
    }
  }
}

Re: Buñuelera

Publicado: Mar, 07 Ene 2014, 23:01
por D_Skywalk
Si lo de FAES era solo por hacer la coña XD

FASE, mola mucho ^^_

Voy revisando archivos :)

FASE (Fucking Awesome Spectrum Engine)

Publicado: Mar, 07 Ene 2014, 23:23
por antoniovillena
Entonces decidido, se llamará así.

He escrito un mensaje al foro de ZX Basic para ver si nos pueden echar una mano con la demo, de momento espera aprobación, cuando lo aprueben os paso el link.

El interfaz SDCC está cogido con pinzas, por ejemplo sprites[2][1] quedaría más claro como sprites[2].x y la forma en que se lee el teclado no es muy adecuada. Espero que tengas más suerte con Z88DK.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mar, 07 Ene 2014, 23:37
por antoniovillena
Ya que estoy voy a explicar cómo funcionan los tiles. Del procesado de los mismos se encarga GfxBu, nosotros le indicamos en un parámetro (el cuarto) qué modo utilizar. Independientemente del modo que hayamos escogido, GfxBu nos mostrará cuánto ocupan los tiles en los 4 modos disponibles: no index, index bitmap, index attr y full index con códigos 0, 1, 2 y 3 respectivamente. Mientras más indexado sea el modo más tardará la rutina de pintado, aunque no hay mucha diferencia de velocidad, por lo que es preferible escoger el modo que ocupe menos bytes, así dejaremos más memoria libre para nuestro juego.

Los tiles indexados producen mapeados más redundantes gráficamente, pero ocupan mucho menos. Esto quiere decir que a igualdad de tamaño, los tiles indexados permiten mapas con mayor número de tiles distintos, por tanto más variados que si se usaran tiles no indexados, por eso es una característica que conviene explotar.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mar, 07 Ene 2014, 23:57
por antoniovillena
Ya me han respondido en el foro de ZX Basic

http://www.boriel.com/forum/zx-basic-co ... -t899.html

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Mié, 08 Ene 2014, 02:01
por D_Skywalk
Hay ya cosas a mejorar del engine en C propuesto, yo estoy metiendo defines y bueno del teclado, es curioso cuanto menos... A ver como podemos simplificarlo. De todas formas se entiende perfectamente ;)

Quizás lo menos C de todo lo que has preparado para SDCC son las macros INIT y FRAME. Pero ya digo todo es dejarlo que coja forma, pintaza tiene ya :D

Un Saludo! :corchoneta:

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Jue, 09 Ene 2014, 02:31
por antoniovillena
He simplificado todo lo que he podido el engine, cambiando los nombres de los archivos, agrupando los parámetros importantes en un archivo de configuración y reduciendo el número de líneas del .bat para que quede todo claro. También he creado un readme.txt donde explico en inglés lo justo y necesario para hacerlo funcionar.

A partir de ahora no incluyo código fuente en dicho paquete, salvo los imprescindibles engine.asm y loader.asm. Habría que recurrir al repositorio para obtener los demás.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Jue, 09 Ene 2014, 09:11
por radastan
Uf, tendré que mirarlo de arriba a abajo para poder adaptarlo a Z88DK, paso del SDCC (y menos ahora que Z88DK va a tenerlo en sus tripas también). Es más, deberíais aseguraros que será compatible con la próxima versión de Z88DK, más que nada porque los proyectos SDCC y Z88DK van destinados a ser uno desde esa versión.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Jue, 09 Ene 2014, 09:58
por antoniovillena
Ahora mismo sólo hay demos escritas en SDCC y en el ZX Basic de Boriel. No te puedo decir cual será el compilador C preferente porque esta decisión depende de D_Skywalk, es el que se encarga de escribir la parte C del engine.

Re: FASE (Fucking Awesome Spectrum Engine)

Publicado: Jue, 09 Ene 2014, 21:24
por radastan
Sin problemas, a las malas me hago yo cuatro funciones para manejar esto como el mecanismo de un chupete desde Z88DK.

No lo veo complicado de usar.