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

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« en: Mayo 20, 2010, 15:21:17 »
Como ya he comentado por ahi, mi intencion es crear una libreria basica para juegos, como la Fourspriter de los mojones, basandome en el funcionamiento de la z88dk / SP1 de Spectrum

Esto es todavia mas una idea que algo concreto, pero por algo se empieza! Asi que usando el codigo de Dr.Fred y sus sprites ya he comenzado a hacer cosas.

Para empezar, creo que seria necesario tener las siguientes librerias:
- input: para gestionar los joystick de cada puerto y el teclado
- sprite: para controlar los sprites
- tiles: para dibujar los fondos

Y luego mas adelante algunas mas:
- interrupt: para gestionar interrupciones
- sound: musica y fx
-  etc...

Por mi parte, en el corto plazo me veo capacitado para afrontar las tres primeras: input,sprites y tiles, obviamente algo basico...

Y concretando, ya he comenzado la input.h, que adjunto el codigo.

Hay 3 aviones, uno se controla con el joystick 1, otro con el joystick 2 y el tercero con el teclado (falta terminar el codigo de lectura del teclado)
La libreria input.h esta copiada directamete de z88dk, por lo que el codigo tiene mucho texto solo como referencia, que ya habra que limpiar...

Descargar ejemplo: http://dl.dropbox.com/u/546470/c64/eightspriter/input.7z

Yo creo que este proyecto me viene un poco grande, asi que cualquier aporte sera beneficioso para todos. Si hubiera mas de uno (yo) interesado en hacer esto, habria que determinar primero las funciones necesarios (ya tenemos la guia de Wood y tambien de los mojones), asi podemos repartirnos un poco el trabajo y avanzar por separado. Luego llegara el momento de optimizar las funciones o pasarlas a ASM, pero al menos la estructura basica estara hecha.



Listado de funciones de eightspriter.h:
Lectura del joystick:
- in_Joy1: hecho
- in_Joy2: hecho

Cambios de modos graficos:
- bitmap_mode: hecho
- text_mode: hecho

Tipos de modos graficos y colores:
- hires_mode: hecho
- multicolor_mode: hecho
- ecm_mode: hecho
- set_border: hecho
- set_background: hecho
- set_multicolor1: hecho
- set_multicolor2: hecho
- set_multicolor3: hecho

Estoy definiendo la nombres de las funciones que controlaran los sprites, seguramente me basare en el listado de Woodmaster.

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #1 en: Mayo 20, 2010, 20:29:03 »
Eso esta muy bien. Enhorabuena josepzin.

¿Falta alguna rutinilla para generar números aleatorios o ya existe en alguna libreria de cc65?

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #2 en: Mayo 20, 2010, 20:39:22 »
A ver si de todo esto sale algo interesante :)

Wood: no tengo idea si ya tiene algo para numeros aleatorios... quizas Carlos lo sepa, que lleva mas tiempo.

Lo que sí necesitaria es un codigo para leer la/las tecla presionada, no termino de aclararme...

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #3 en: Mayo 20, 2010, 21:11:51 »
Cita de: "josepzin"
A ver si de todo esto sale algo interesante :)

Wood: no tengo idea si ya tiene algo para numeros aleatorios... quizas Carlos lo sepa, que lleva mas tiempo.

Lo que sí necesitaria es un codigo para leer la/las tecla presionada, no termino de aclararme...


Tienes que poner en $dc00 linea de teclas del teclado que quieres averiguar después mira el valor en $dc01.

tienes que hacer esto 8 veces para averiguar todas las teclas. Por eso es que no se usa mucho el teclado en C64, come demasiado tiempo y ademas hay un problema en que no se puede leer ciertas teclas cuando precionadas al mismo tiempo.


Port B - $DC01
+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 7|Bit 6|Bit 5|Bit 4|Bit 3|Bit 2|Bit 1|Bit 0|
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 7| R/S |  Q  |  C= |SPACE|  2  | CTRL|A_LFT|  1  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 6|  /  | A_UP|  =  | S_R | HOME|  ;  |  *  |POUND|
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 5|  ,  |  @  |  :  |  .  |  -  |  L  |  P  |  +  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 4|  N  |  O  |  K  |  M  |  0  |  J  |  I  |  9  |
Port A +-----+-----+-----+-----+-----+-----+-----+-----+-----+
$DC00  |Bit 3|  V  |  U  |  H  |  B  |  8  |  G  |  Y  |  7  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 2|  X  |  T  |  F  |  C  |  6  |  D  |  R  |  5  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 1| S_L |  E  |  S  |  Z  |  4  |  A  |  W  |  3  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Bit 0|C_U/D|  F5 |  F3 |  F1 |  F7 |C_L/R|  CR | DEL |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+

C_L/R = Cursor left/right  ;  C_U/D = Cursor up/down
S_L = Shift, left  ;  S_R = Shift, right  ;  R/S = RUN/STOP
A_UP = Arrow up    ;  A_LFT = Arrow left

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #4 en: Mayo 20, 2010, 21:25:38 »
De algo me sonaba que el tema era puñetero! :D

Gracias, a ver que puedo hacer.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #5 en: Mayo 20, 2010, 21:34:56 »
Copio del otro hilo:

Librerías que hay para 8bits (Spectrum y Amstrad)

cpcrslib, CPC Amstrad: http://www.amstrad.es/programacion/c Varios juegos desarrollados

splib2, Spectrum: http://www.speccy.org/foro/viewtopic.php?f=6&p=20774 Varios juegos desarrollados, esta discontinuada y la nueva version es SP1

SP1, Spectrum: http://www.z88dk.org/wiki/doku.php Continuacion de la splib2, aunque no sé si hay juegos españoles que la usan.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #6 en: Mayo 20, 2010, 21:35:51 »
Funciones de Wood:


[code]
void init_irq(void);
void bitmap_mode(void);
void tile_mode(void);
void hires_mode(void);
void multicolor_mode(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__ c64_PrintTile(unsigned char x, unsigned char y, unsigned char TileNum);
void __fastcall__ c64_CreateSpr(struct sprite *);
void __fastcall__ c64_SprMc(unsigned char mc1, unsigned char mc2);
void __fastcall__ c64_SprOnOff (struct sprite *);
void __fastcall__ c64_OnOff (struct sprite *);
void c64_SprEnable (struct sprite *);
void c64_SprColor (struct sprite *);
void c64_SprXexpand (struct sprite *);
void c64_SprYexpand (struct sprite *);
void c64_SprPattern (struct sprite *);
void c64_SprMcm (struct sprite *);
void __fastcall__ c64_MoveSpr(struct sprite *spr);[/quote]

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #7 en: Mayo 20, 2010, 21:48:15 »
En Stdlib.h de c, de toda la vida está la función rand(), para que genere números aleatorios se suele usar como semilla los milisegundos del SO.

Un consejo... empezad ya a usar funciones, que ese main empieza a crecer y a hacer daño a los ojos y vamos a terminar con un spaghetti code del que no se va a empapar ni Cristo.

Por lo demás... me parece más aparatoso tener que usar esas funciones que lo que ya estaba en mi ejemplo, que eran 2 lineas y un array para manejar el joystick, y no se si es peor el remedio que la enfermedad. Aunque quizá esto sea más portable.

Buen trabajo de todas maneras. Os deseo suerte.

Dr.Fred

  • Commodoremaníaco
  • ****
  • Mensajes: 149
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #8 en: Mayo 20, 2010, 22:02:25 »
Por cierto, que en cc65 teneis joystick.h. Lo digo por si puede servir de ayuda.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #9 en: Mayo 21, 2010, 15:43:38 »
Cita de: "Dr.Fred"
En Stdlib.h de c, de toda la vida está la función rand(), para que genere números aleatorios se suele usar como semilla los milisegundos del SO.

Gracias por el aviso, he encontrado la documentacion de esa libreria:
http://www.cc65.org/doc/funcref-38.html


Cita de: "Dr.Fred"

Un consejo... empezad ya a usar funciones, que ese main empieza a crecer y a hacer daño a los ojos y vamos a terminar con un spaghetti code del que no se va a empapar ni Cristo.

Cristo quizas no, pero Chuck Norris si!! :D :D
Igual tambien empezare a ordenar ese "ejemplo.c"

Cita de: "Dr.Fred"

Por lo demás... me parece más aparatoso tener que usar esas funciones que lo que ya estaba en mi ejemplo, que eran 2 lineas y un array para manejar el joystick, y no se si es peor el remedio que la enfermedad. Aunque quizá esto sea más portable.

El uso de tu ejemplo es indiscutiblemente mas optimizado, pero si te fijas, con estas funciones se puede usar exactamente igual ya que al fin y al cabo lo que devuelve la funcion es el valor de  $DC01/2, luego con ese valor se puede indexar una tabla y mover el sprite (como lo habias hecho tu), o hacer los IFs y meter mas acciones al mover el joystick.


Voy a ir poniendo un listado de las funciones (en el primer comentario de este hilo), y el estado de cada una, a medida que vaya definiendo cosas.

Aunque estoy "verde", de a poco ire agregando cosas, mientras tanto las sugerencias/ayudas seran siempre bienvenidas.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #10 en: Mayo 21, 2010, 22:02:45 »
Cita de: "Rulas_International"
Animo Jose!!!

Gracias! Lo mismo para tu juego!

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #11 en: Mayo 22, 2010, 20:40:55 »
Wood, podrias decirme que hacen tus funciones? Voy a poner lo que yo creo.

bitmap_mode: activar el modo grafico
tile_mode: que hace??
hires_mode: activar el modo hires
multicolor_mode: activa el modo multicolor
set_background: color del fondo de la pantalla
set_border: color del borde de la pantalla
set_multicolor1: asignar color 1 de multicolor
set_multicolor2: asignar color 1 de multicolor
c64_PrintTile: me imagino que sera para poner un tile
c64_CreateSpr: crear un sprite
c64_SprMc: que hace??
c64_SprOnOff: por el nombre, desactiva un sprite.
c64_OnOff: que hace??
c64_SprEnable: : tambien activa / desactiva un sprite??
c64_SprColor: color del sprite
c64_SprXexpand: expandir en X
c64_SprYexpand: expandir en Y
c64_SprPattern: que hace??
c64_SprMcm: que hace??
c64_MoveSpr: mover un sprite, La SP1 tiene funciones especificas para mover de forma absoluta, relativa, pixel. Como se comporta esta?

Estas funciones mas o menos sospecho lo que hacen, pero tengo que refrescar conocimientos... cuando lo haga preguntare.
void init_irq:
set_vicBank:
set_bitmapPos
set_charmemPos
set_screenPos

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #12 en: Mayo 22, 2010, 21:45:09 »
bitmap_mode: activar el modo grafico
tile_mode: que hace??
Eso es modo texto.

hires_mode: activar el modo hires
multicolor_mode: activa el modo multicolor
set_background: color del fondo de la pantalla
set_border: color del borde de la pantalla
set_multicolor1: asignar color 1 de multicolor
set_multicolor2: asignar color 1 de multicolor
c64_PrintTile: me imagino que sera para poner un tile
exacto coloca uno char en la pantalla, pero no pinta color.

c64_CreateSpr: crear un sprite
c64_SprMc: que hace??
selecciona multicolor 1 y 2 para sprites

c64_SprOnOff: por el nombre, desactiva un sprite.
es un switch que permite activar/desactivar el sprite (llamando alternadamente la funccion)
c64_OnOff: que hace??
esta ya no existe
c64_SprEnable: : tambien activa / desactiva un sprite??
solo activa el sprite
c64_SprColor: color del sprite
c64_SprXexpand: expandir en X
c64_SprYexpand: expandir en Y
c64_SprPattern: que hace??
Es el puntero a los datos gfx del sprite
c64_SprMcm: que hace??
activa el modo multicolor para el sprite en cuestion
c64_MoveSpr: mover un sprite, La SP1 tiene funciones especificas para mover de forma absoluta, relativa, pixel. Como se comporta esta?
Solo mueve de forma absoluta

hoy he creado mas una funccion que pinta un tile de 8x8 pixeles(un char) en modo bitmap, incluyendo los colores.

Aqui esta una pantalla usando esa funccion:


josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11862
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Libreria Eightspriter para juegos C64
« Respuesta #13 en: Mayo 23, 2010, 09:48:46 »
Gracias por las explicaciones.

Sobre los tiles, segun recuerdo habias comentado que el Nanako usaba tiles en modo bitmap, verdad?

Supongo que a la hora de hacer una funcion que pinte tiles habria que distinguir entre tiles graficos y de caracter.
Algo en plan PutBitmapTile, PutCharTile....

Wood

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 137
    • Ver Perfil
Libreria Eightspriter para juegos C64
« Respuesta #14 en: Mayo 23, 2010, 14:40:32 »
Esta mañana he programado la rutina para pintar tiles 16x16 en Bitmap: