Autor Tema: Libreria Eightspriter para juegos C64  (Leído 33788 veces)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #15 en: Mayo 23, 2010, 16:45:25 »
Que bueno :)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #16 en: Mayo 23, 2010, 18:21:30 »
He ido optimizando las librerias de mover sprites de Dr.Fred, para que no haga multiplicaciones ni nada que ocupe muchos ciclos, parece que dio resultado porque ahora todo se mueve demasiado rapido !!

?Hay alguna manera de hacer que todo vaya a una velocidad aceptable? Me suena a sincronizar con el barrido... puede ser?

Bieno

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 3307
  • PRINT"ADORA A TU COMMODORE"
    • Ver Perfil
    • bieno64
Libreria Eightspriter para juegos C64
« Respuesta #17 en: Mayo 23, 2010, 19:32:09 »
Que buenos que sois....

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #18 en: Mayo 23, 2010, 21:43:13 »
De momento la Librería permite:

- Usar sprites;
- Usar modo texto en hires como en modo mixto
- Usar modo bitmap tanto en hires como multicolor
- Leer el Joystick
- Pintar caracteres en modo texto como bitmap
- Pintar tiles de 2x2 caracteres en ambos modos
- Obtener números aleatorios entre 0 e 255
- Elegir banco de memoria del VIC
- Elegir donde poner la pantalla en memoria(tanto texto como bitmap)
- Elegir donde poner screenram (atributos) en memoria en caso de bitmap.
- Elegir donde poner el set de caracteres en memoria
- definir los colores de border, paper, multicolor1, multicolor2, color del sprite, colores multicolor1 y 2 para sprites
-
Lo del sonido es fácil, mismo que sea para sfx, se usa un sid y llamase cada sonido como si fuera una música. Es lo que hago en nanako.

¿Mas alguna idea para funcciones?

Nota: la rutina de movimiento de sprites solo usa coordenadas absolutas. Alguno problema con esto?


[code]
void init_irq(void);
void bitmap_mode(void);
void tile_mode(void);
void hires_mode(void);
void multicolor_mode(void);
unsigned char randomize(void);
void le_joystic(void);
void __fastcall__ set_vicBank(unsigned char bank);
void __fastcall__ set_bitmapPos(unsigned char pos);
void __fastcall__ set_charmemPos(unsigned char pos);
void __fastcall__ set_screenPos(unsigned char pos);
void __fastcall__ set_background(unsigned char cor);
void __fastcall__ set_border(unsigned char cor);
void __fastcall__ set_multicolor1(unsigned char cor);
void __fastcall__ set_multicolor2(unsigned char cor);
void __fastcall__ setCharsPointersLo(unsigned int *);
void __fastcall__ setCharsPointersHi(unsigned int *);
void __fastcall__ setTiles16x16PointersLo(unsigned int *);
void __fastcall__ setTiles16x16PointersHi(unsigned int *);
void __fastcall__ createSpr(struct sprite *);
void __fastcall__ sprMc(unsigned char mc1, unsigned char mc2);
void __fastcall__ sprOnOff (struct sprite *);
void __fastcall__ sprEnable (struct sprite *);
void __fastcall__ sprColor (struct sprite *);
void __fastcall__ sprXexpand (struct sprite *);
void __fastcall__ sprYexpand (struct sprite *);
void __fastcall__ sprPattern (struct sprite *);
void __fastcall__ sprMcm (struct sprite *);
void __fastcall__ moveSpr(struct sprite *spr);
void __fastcall__ paintTile(unsigned char color, unsigned char x, unsigned char y, unsigned char tileNum);
void __fastcall__ paintTile16x16(unsigned char y ,unsigned char x,unsigned char tileNum);
void __fastcall__ paintTileBMP(unsigned char color3, unsigned char color1and2,unsigned char x, unsigned char y, unsigned char charNum);
void __fastcall__ paintTileBMP16x16(unsigned char x, unsigned char y, unsigned char tileNum);[/quote]

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #19 en: Mayo 23, 2010, 21:57:49 »
Aqui tenes el codigo del programa que ha producido la pantalla que he postado antes:
[code]
#include "c64lib1.3.h"


extern unsigned int pCharsLo, pCharsHi,pTiles16x16Lo,pTiles16x16Hi;


void main(void){

unsigned int n;
char i,j,c;

   c=0;

   set_border(BLACK);
   set_background(BLACK);
   bitmap_mode();
   set_vicBank(VIC_BANK1);
   set_bitmapPos(BITMAP_POS0);
   hires_mode();
   set_screenPos(SCREEN_POS8);
      

   setCharsPointersLo(&pCharsLo);
   setCharsPointersHi(&pCharsHi);
   setTiles16x16PointersLo(&pTiles16x16Lo);
   setTiles16x16PointersHi(&pTiles16x16Hi);


   for(n=0; n<1000;n++)
      (*(unsigned char*) (0x6000+n)) = 0;



   for(i=0; i<=38; i=i+2)
   {
      paintTileBMP16x16(i,0,1);   
      paintTileBMP16x16(i,22,1);
   }

   j=0;

   for(i=2; i<=20;i=i+2)
   {
      paintTileBMP16x16(j,i,0);   
      j=j+2;
   }
   
   for(i=26; i<=34; i=i+2)
   {
      paintTileBMP16x16(i,10,2);   
   }
   

   Loop:
   
   goto Loop;
   
}[/quote]

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #20 en: Mayo 23, 2010, 21:59:02 »
Depués pongo aqui código de los chars y tiles. He decidido cambiar algo.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #21 en: Mayo 23, 2010, 23:02:36 »
Wood: genial!!! Esto avanza :)

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #22 en: Mayo 24, 2010, 11:40:50 »
Cita de: "josepzin"
He ido optimizando las librerias de mover sprites de Dr.Fred, para que no haga multiplicaciones ni nada que ocupe muchos ciclos, parece que dio resultado porque ahora todo se mueve demasiado rapido !!

?Hay alguna manera de hacer que todo vaya a una velocidad aceptable? Me suena a sincronizar con el barrido... puede ser?

Puedes usar temporalmente la librería SLEEP en el bucle de juego, aunque seguro que no es lo más adecuado, te valdrá mientras sigues desarrollando.

Por curiosidad, ¿Cómo lo has hecho al final?

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #23 en: Mayo 24, 2010, 11:52:51 »
Cita de: "Dr.Fred"
Puedes usar temporalmente la librería SLEEP en el bucle de juego, aunque seguro que no es lo más adecuado, te valdrá mientras sigues desarrollando.

He visto el sleep en tu código, voy a probarlo.


Cita de: "Dr.Fred"
Por curiosidad, ¿Cómo lo has hecho al final?

Sobre todo, reemplazando las multiplicaciones que hay en el MueveSprite.

En un rato copio el código asi ves las modificaciones. He intentado hacer el codigo lo mas parecido a como seria en Assembler, asi luego es mas facil convertirlo (y acelerarlo)

Por cierto, hice una wiki para ir anotando las funciones que llevo, ya voy a poner el enlace.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #24 en: Mayo 24, 2010, 12:57:16 »
Cita de: "Dr.Fred"
Por curiosidad, ¿Cómo lo has hecho al final?


Tu funcion:
[code]void mueveSprite(int x, int y,int numSprite)
{
   int potencia=1, i=0, vc=4096*13, xm;

   //bucle para hallar la potencia (Sprite)
   for (i=1; i<=numSprite; i++)    
   {
      potencia *= 2;
   }

   if(numSprite==0)
      potencia=1;


   //Usamos el registro para la x mayor de 255
   if (x>=256)
   {
      //x=x-256;
      POKE(vc+16,PEEK(vc+16)|potencia);
   }
   if (x<256)
   {
      //POKE(vc+16,PEEK(vc+16));
      xm=255-potencia;
      POKE(vc+16,PEEK(vc+16)&xm);
   }

   POKE(vc+2*numSprite,x);
   POKE(vc+2*numSprite+1,y);
}
[/quote]


Y la misma optimizada:
[code]void MoveSprAbs(unsigned char sprite, int x, int y)
{
   unsigned short int offset, tmp;   
   unsigned char bit9 = 0x1;
   
      // Desplazar hasta el sprite a modificar
      bit9 = bit9 << sprite;
      
      tmp = PEEK(0xD010);
      if (x>256)
      {
         tmp = tmp | bit9;
      }
      else
      {
         bit9 = ~ bit9;
         tmp = tmp & bit9;
      }
      POKE(0xD010,  tmp);
         
      offset = sprite * 2; // FIXME eliminar esta multiplicacion
      POKE(0xD000 + offset, x);
      POKE(0xD000 + offset + 1, y);
}
[/quote]

La unica que me queda por optimizar es la multiplicacion del final, creo supongo con una tablita de datos se puede arreglar.
Los desplazamientos <<, OR y AND no tardan nada, en cambio las multiplicaciones tengo entendido que son "carisimas" para el 6502, que no tiene instrucciones para hacerlas.

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #25 en: Mayo 24, 2010, 13:19:19 »
josepzin,

La coordenada Y no passa de 255 por eso puedes usar unsigned char.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #26 en: Mayo 24, 2010, 13:24:50 »
Cita de: "Wood"
josepzin,
La coordenada Y no passa de 255 por eso puedes usar unsigned char.


No pasa de 255, pero puede ser negativo... ¿no? Quizás se pueda definir como short int...?

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #27 en: Mayo 24, 2010, 14:12:18 »
Cita de: "josepzin"
Cita de: "Wood"
josepzin,
La coordenada Y no passa de 255 por eso puedes usar unsigned char.


No pasa de 255, pero puede ser negativo... ¿no? Quizás se pueda definir como short int...?


Ah vale, no sabia que intecionabas usar numeros negativos.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11818
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #28 en: Mayo 24, 2010, 14:54:58 »
Cita de: "Wood"
Ah vale, no sabia que intecionabas usar numeros negativos.

Sería lo lógico ¿no? Si quiero que el sprite se vaya por la parte de arriba de la pantalla debería poder poner números negativos, lo mismo para el lateral izquierdo.

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #29 en: Mayo 24, 2010, 15:09:07 »
Tiene mucha mejor pinta. A ver si salgo del curro y puedo probarla.