Al final viene el código, si descomento el último printf, peta, aunque evidentemente no es por esa instrucción. Estaría bien si alguno puede verificarlo con este mismo código, pero lo que de verdad me salvaría la vida es saber porqué pasa esto.
Además, teniendo en cuenta que es mi primer programa con z88dk, no estaría mal que alguno de los que hay por aquí que seguro que ya se ha peleado con las cosas del z88dk y del sp1, me dé algunos consejillos de las cosas menos obvias que conviene saber para hacer un programa con estas librerias.
Y mi última petición: si alguien me puede pasar el ejemplo más simple que funcione de poner un sprite mayor de 8x8 en pantalla con z88dk+sp1, le estaría muy agradecido
El código:
Código: Seleccionar todo
#include <sprites/sp1.h>
#include <malloc.h>
#include <spectrum.h>
#include <input.h>
#include <stdio.h>
#pragma output STACKPTR = 53248
long heap;
struct personaje {
struct sp1_ss *sprite;
char dx;
char dy;
struct in_UDK keys;
void *getjoy;
uchar *frameoffset;
};
extern uchar enemigo_col0[];
short int posiciones[] = {5,4,20,25,20,3,1,5,12,12,18,18};
short int desplazamientos[] = {1,1,-1,1,1,-1,-1,-1,-1,-1,1,1};
extern uchar prota_col0[];
void *u_malloc(uint size)
{
return malloc(size);
}
void u_free(void *addr)
{
free(addr);
}
uchar fondo[] = {0x80,0x00,0x04,0x00,0x40,0x00,0x02,0x00};
struct sp1_Rect cr = {0, 0, 32, 24};
main()
{
struct personaje p;
uchar input;
struct personaje enemigos[6];
int i;
int xp, yp;
int xe, ye;
short int final;
#asm
di
#endasm
heap = 0L;
sbrk(40000, 10000);
zx_border(BLUE);
sp1_Initialize(SP1_IFLAG_MAKE_ROTTBL | SP1_IFLAG_OVERWRITE_TILES |
SP1_IFLAG_OVERWRITE_DFILE, INK_BLUE | PAPER_CYAN, ' ');
sp1_TileEntry(' ',fondo);
p.sprite = sp1_CreateSpr(SP1_DRAW_MASK2LB, SP1_TYPE_2BYTE, 2, 16, 0);
sp1_AddColSpr(p.sprite, SP1_DRAW_MASK2RB, 0, 16, 0);
sp1_MoveSprAbs(p.sprite, &cr, prota_col0, 12, 16, 0, 0);
p.dx = 0;
p.dy = 0;
sp1_Invalidate(&cr);
sp1_UpdateNow();
p.getjoy = in_JoyKeyboard;
p.keys.left = in_LookupKey('o');
p.keys.right = in_LookupKey('p');
p.keys.up = in_LookupKey('q');
p.keys.down = in_LookupKey('a');
p.keys.fire = in_LookupKey('m');
p.frameoffset = (uchar *) 0;
for (i=0;i<6;i++)
{
enemigos[i].sprite = sp1_CreateSpr(SP1_DRAW_MASK2LB, SP1_TYPE_2BYTE, 2, 16, 0);
sp1_AddColSpr(enemigos[i].sprite, SP1_DRAW_MASK2RB, 0, 16, 0);
sp1_MoveSprAbs(enemigos[i].sprite, &cr, enemigo_col0, posiciones[2*i], posiciones[2*i+1], 0, 0);
enemigos[i].dx = desplazamientos[2*i+1];
enemigos[i].dy = desplazamientos[2*i];
}
final = 0;
while (!final)
{
sp1_UpdateNow();
input = (p.getjoy)(&p.keys);
if (input & in_RIGHT && !(p.sprite->col > 30 && p.sprite->hrot > 0))
p.dx = 1;
if (input & in_LEFT && !(p.sprite->col < 1 && p.sprite->hrot < 1))
p.dx = -1;
if (input & in_DOWN && !(p.sprite->row > 22))
p.dy = 1;
if (input & in_UP && !(p.sprite->row < 1 && p.sprite->vrot < 129))
p.dy = -1;
sp1_MoveSprRel(p.sprite, &cr, p.frameoffset, 0, 0, p.dy, p.dx);
p.dx = 0;
p.dy = 0;
xp = p.sprite->col*8 + p.sprite->hrot + 4;
yp = p.sprite->row*8 + p.sprite->vrot + 4;
for (i=0;i<6;i++)
{
if (enemigos[i].sprite->col > 30 && enemigos[i].sprite->hrot > 0)
enemigos[i].dx = -enemigos[i].dx;
if (enemigos[i].sprite->row > 22)
enemigos[i].dy = -enemigos[i].dy;
sp1_MoveSprRel(enemigos[i].sprite, &cr, enemigos[i].frameoffset,0, 0, enemigos[i].dy, enemigos[i].dx);
xe = enemigos[i].sprite->col*8 + enemigos[i].sprite->hrot;
ye = enemigos[i].sprite->row*8 + enemigos[i].sprite->vrot;
if (xe + 8 >= xp && xe <= xp && ye + 8 >= yp && ye <= yp)
{
zx_border(RED);
final = 1;
}
}
}
printf("\nGame Over");
// printf("\nInsert Coin");
}
#asm
._prota_col0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 255, 0, 255, 0, 255, 0 ,255, 0
DEFB 199,56,131,124,199,56,239,16
DEFB 131,124,109,146,215,40,215,40
; Siempre tiene que haber un caracter vacio debajo
DEFB 255, 0,255, 0,255, 0,255, 0
DEFB 255, 0,255, 0,255, 0,255, 0
._enemigo_col0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 231,24,195,36,129,90,0,153
DEFB 129,90,195,36,231,24,255,0
DEFB 255,0,255,0,255,0,255,0
DEFB 255,0,255,0,255,0,255,0
#endasm
zcc +zx -vn name.c -o name.bin -lndos -lsp1 -lmalloc