Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl
Publicado: Jue May 02, 2013 9:58 pm
Oye, como mola ese muñecajo !!
EL FORO DEL SPECTRUM
https://foro.speccy.org/
na_th_an escribió:Tenía pendiente hacer un tuto explicando esto, pero el tiempo...
Código: Seleccionar todo
casilla = buffer (x, y)
caracter = casilla bAnd 255
color = casilla >> 8
Código: Seleccionar todo
x = actualizacion (n) bAnd 255
y = actualizacion (n) >> 8
Código: Seleccionar todo
Sub printCharInv(x as uByte, y as uByte, atrib as uByte, car as uByte)
buffer (y, x) = (atrib << 8) + car
actualizacion (actIdx) = (y << 8) + x
actIdx = actIdx + 1
Código: Seleccionar todo
Sub updateNow ()
top = actIdx - 1
For i = 0 To top
x = actualizacion (actIdx) bAnd 255
y = actualizacion (actIdx) >> 8
car = buffer (y, x) bAnd 255
atr = buffer (y, x) >> 8
Print At x, y; Ink atr; Chr(car)
Next i
actIdx = 0 ' "Vaciamos" el array de actualización
End Sub
Código: Seleccionar todo
Sub updateAll ()
For y = 0 To 23
For x = 0 To 31
car = buffer (y, x) bAnd 255
atr = buffer (y, x) >> 8
Print At x, y; Ink atr; Chr(car)
Next x
Next y
End Sub
Código: Seleccionar todo
' En este array están definidos todos nuestros tiles / sprites.
' Hay espacio para 20 (en este ejemplo). Los 10 primeros son tiles,
' luego hay 5 sprites, y al final 5 minibuffers para coger los fondos
' de los 5 sprites. En total, 20*9 = 180 posiciones:
Dim tileSet (179) as uInteger = {
... aqui los datos
}
' Dibujamos la pantalla. Esta sub utiliza put3x3noInv para hacerlo.
dibujaPantalla ()
' Ahora la pantalla está dibujada en el buffer. La mostramos:
updateAll ()
' Nos aseguramos de que el buffer de actualización está "vacío"
actIdx = 0
' Ahora, antes de empezar, guardamos los fondos de todos los
' sprites que vayan a entrar en juego.
' Vamos a usar solo dos sprites en el ejemplo. Están en x1, y1 y
' en x2, y2, y sus id en el array son 0 y 1
' Los minibuffers para fondo tendrán id 15 y 16 en nuestro array.
get3x3 (x1, y1, 15)
get3x3 (x2, y2, 16)
' Empezamos
While 1
' Restauramos el fondo
put3x3Inv (x1, y1, 15)
put3x3Inv (x2, y2, 16)
' Movemos los sprites
moverSprites ()
' Cogemos el nuevo fondo
get3x3 (x1, y1, 15)
get3x3 (x2, y2, 16)
' Imprimimos los sprites
put3x3Inv (x1, y1, 0)
put3x3Inv (x2, y2, 0)
' Ahora que hemos actualizado el buffer,
' actualizamos la pantalla solo con los
' caracteres que han cambiado, llamando a
updateNow ()
Wend
Nathan escribió:Para nota, lo suyo es que la impresión de los caracteres del buffer no se haga con Print At, sino con alguna función escrita al efecto más rápida (incluso en Asm).
Código: Seleccionar todo
DIM mapa(99,5,7)AS UBYTE=>{{_
{0,0,0,0,0,0,0,0},_
{0,11,10,11,10,10,11,0},_
{0,1,0,1,0,0,1,0},_
{0,1,0,1,0,0,1,0},_
{0,1,0,1,0,0,1,0},_
{10,10,10,10,10,10,10,10}},{_
{0,0,0,0,0,0,0,0},_
{0,0,0,0,0,0,0,0},_
{0,0,0,0,0,0,0,0},_
{0,0,0,0,0,0,0,0},_
{0,0,0,0,0,0,0,0},_
{10,10,10,10,10,10,10,10}},{_
...
...
Código: Seleccionar todo
:REM ---- esto escrito por ejemplo 4 veces en el programa
print at y,x;"\{i7}\a\b\c"
print at y,x;"\{i6}\d\e\f"
print at y,x;"\{i7}\g\{i6}\h\{i5}\i"
Código: Seleccionar todo
dim c1,c2,c3,c4,c5,c6,c7,c8 as ubyte
imprime(y,x,7,7,7,6,6,6,7,6,5) :REM ---- esto escrito las 4 veces en el programa
sub imprime(yy as ubyte,xx as ubyte,c1,c2,c3,c4,c5,c6,c7,c8,c9)
print at yy,xx;ink c1;"\a";ink c2;"\b";ink c3;"\c"
print at yy+1,xx;ink c4;"\d";ink c5;"\e";ink c6;"\f"
print at yy+2,xx;ink c7;"\g";ink c8;"\h";ink c9;"\i"
end sub