Página 2 de 3

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Jue May 02, 2013 9:58 pm
por JBGV
Oye, como mola ese muñecajo !! :D

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Jue May 02, 2013 10:59 pm
por jgilcas
Pues si mola, dios que pena no tener tiempo ni conocimiento para hacer algo parecido

jgilcas

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Jue May 02, 2013 11:44 pm
por Alxinho
Ottia ... gracias ... :oops:

La verdad aunque me lo diga a mí mismo y quede feo me mola un montón, y da espadazos que te cagas :lol:

La explicación de este proyecto es curioso ...

Me compré la Ps3 y descubrí unos juegazos tremendos que me desconectaron del mundillo y entre ellos uno que me ha marcado, Dark Souls... y un día me dije, coño! ésta mecanica que tiene el puñetero juego me recuerda a los viejos juegos de antaño tan difíciles y puñeteros ¿porqué no hacer uno en spectrum basado en este? y así fué ... lo que me desconectó del mundillo me ha hecho engancharme de nuevo :lol:

Mi idea es que se parezca pero no hacerlo todo exacto poque es imposible (no vas a poder usar varias armas por ejemplo) pero cosas como lo de las hogeras y que reaparezcan los enemigos para poder farmear sí, si llevas demasiadas cosas vas más lento, etc, ... todo lo que considero posible de meter, siempre y cuando me llegue la memoria :roll:

Me alegro mucho de que os guste! :D

----------

na_th_an escribió:Tenía pendiente hacer un tuto explicando esto, pero el tiempo...


Ay que bien me iría eso :roll: ... que siempre me sacas las castañas del fuego :lol:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Vie May 03, 2013 8:21 am
por na_th_an
El problema es que, al igual que usar la SUBACOlib te exigiría cambiar bastante tu código, a lo mejor esto también.

Esto necesitaría un tutorial gordaco y partido en varias partes, pero explongo aquí más o menos, y de forma esquelética, de qué va el tema.

El dirty chars se basa en esto:

1.- Haces un array "buffer" de 32x24 celdas. Cada celda tendrá dos bytes: uno que diga qué número de caracter almacena y otro qué color. Puedes usar, por ejemplo, uInteger, y meter el char en el byte menos significativo y el color en el más significativo, de forma que:

Código: Seleccionar todo

casilla = buffer (x, y)
caracter = casilla bAnd 255
color = casilla >> 8


2.- Haces otro array "actualizacion" de, digamos, 256 posiciones (más que suficiente). En cada posición vamos a almacenar una coordenada x, y, así que vamos a usar uIntegers de nuevo, de forma que:

Código: Seleccionar todo

x = actualizacion (n) bAnd 255
y = actualizacion (n) >> 8


3.- También vamos a crear un índice "actIdx" que nos servirá para indizar "actualizacion".

El tema funciona así: cada vez que escribamos un nuevo caracter en buffer, vamos a añadir una entrada a "actualizacion", en la posición "actIdx", incrementando "actIdx":

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


Cuando hayamos terminado de actualizar la pantalla, llamamos a una rutina que, recorriendo "actualizacion", y mirando en "buffer", restaure sólo los caracteres que, efectivamente, han cambiado:

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


Además, necesitamos otra rutina que vuelque el buffer tal cual, entero, para la primera vez que dibujamos la pantalla:

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


Ahora, sobre este sistema, nos podemos montar lo que mencioné en el punto 1. Nuestos sprites pueden ser arrays de 3x3 valores como los de buffer, codificando color y caracter. Además, para cada sprite, necesitaremos un minibuffer del mismo tamaño donde ir almacenando el fondo.

Lo suyo es hacer un array global con espacio para todos los sprites y tiles, e indizarlos con un sprId. Cada sprite o tile empezaría en 9*sprId dentro del array global, y se compondría de 9 uIntegers codificando 9 atributos y 9 caracteres. En ese array global dejaríamos sitio, al final, por ejemplo, para ir almacenando los fondos.

Luego necesitaríamos tres funciones:

1.- Sub put3x3noInv (x, y, id), que imprime el bloque de 3x3 número id SIN actualizar el array "actualizacion". Esto se usa para poner los tiles de fondo en el buffer. Luego se llamaría a updateAll para mostrarlo en pantalla.
2.- Sub put3x3Inv (x, y, id), como el de arriba, pero añadiendo cada caracter que se imprime al array "actualizacion". Este se usa para imprimir sprites o restaurar los fondos, y se emplea en el bucle del juego.
3.- Sub get3x3 (x, y, id), el contrario al de arriba. Coge 3x3 pares atributo/caracter del buffer y los pone en la posición id de nuestro array de tiles y sprites. Es para guardarse el fondo.

Con esto, el esqueleto del programa sería así:

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


¿Qué conseguimos con todo este lío? Pues muy sencillo: borrar e imprimir sprites sin parpadeos. Como se hace todo fuera de la pantalla visible, y luego se actualiza en pantalla sólo lo que es necesario actualizar, no se ve ningún parpadeo. Además, tampoco estamos ocupando mucho espacio, ya que el buffer sólo almacena el número del caracter y su color. Esto nos limita solo a 256 bloques de 8x8 para hacer los gráficos, pero es más que suficiente.

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).

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Vie May 03, 2013 5:01 pm
por Alxinho
:D ...

Ésto me lo tengo que estudiar con tiempo y haciendo pruebas. Lo he pillado más o menos pero para el juego éste tendré que usar pifostios porque me llevaría mucho tiempo aprenderme lo que dices, pero ahi queda para estudio.

Lo que me parece una lástima son estos post tan valiosos que escribes entre los foros sin dejarlos en ningún blog o web. Yo al menos de vez en cuando me voy pasando por Mojonia para ver si has hecho algo nuevo y todavía conservo impreso un viejo tutorial tuyo sobre los mapeos de puertos que me estudiaba en el trabajo, de hecho casi todo lo que he aprendido son de cosas tuyas y me gustaría que hicieses más tutoriales, aunque entiendo lo del tiempo :roll: ...

Como siempre mil gracias y ya voy contando los problemas que tenga :)

Por cierto, después de Ramiro el vampiro qué ... que estamos esperando ... :lol:

Edito: Se me olvidaba ...

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).


Esto sí que me hace falta de verdad, que desde el juego debut cada print at que escribo se me hace un nudo en el estómago :? ...

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Sab May 04, 2013 1:27 am
por Alxinho
Bueno, decir que ya por fin lo he conseguido joder ... cómo me ha costado dios ... y encima cuando me he puesto a programar el subir y bajar escaleras que no lo había hecho nunca ya ni te cuento, pero a pesar de un ligero mini bug que aún tiene la cosa me doy por satisfecho, ya más para mi nivel de programación no puedo pedir. Haciendo todo esto me he acordado todo el rato de lo del buffer que dice Nathan porque es eso exactamente el mini bug que tengo, que al actualizar una pequeña franja de 3 caracteres aparecen por un momento y después se van, actualizando la pantalla en un buffer no saldría, pero es que yo ha eso de momento no llego :roll:

Lo que sí quería preguntar porque es con lo que me quiero poner es si el mappy que comenta Nathan en un tutorial o cualquier otro me permite hacer todo el mapeado diciendole los números que yo quiera de cada tile y que me genere la tabla con estos valores, porque hacer a mano 100 pantallas jodido jodido ...

Perdón si soy muy pesado :oops: ...

Edito: He estado trasteando el Mappy (que mola un huevo) y al exportar como texto necesito cambiar el orden como en el SevenuP a charline. ¿Se pude hacer esto? Si fuese así lo tendría solucionado. Yo quisiera que los agrupase tal y como se pinta el mapa :roll:

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Sab May 04, 2013 8:25 pm
por na_th_an
Por ahí tengo un programilla que pasa del formato .map de mappy a un array .bas ordenado por pantallas. No sé si es lo que necesitas, si es eso te lo busco.

Y sobre los jueguecillos, lo que ha pasado es que nos hemos liado con cinco desarrollos a la vez en los últimos tres meses :lol: Pero bueno, todos van progresando y bastante pronto podréis ver algo :)

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Sab May 04, 2013 8:46 pm
por Alxinho
Yo necesito que lo ordene por pantallas, de la más arriba izquierda a la más abajo derecha siempre hacia la derecha, como hace el SeveuP si le pones charline. Como si cada tile de cada pantalla fuese un caracter. Si el programita lo hace ya estás tardando! :lol:

Qué comida de cabeza me he pegado hoy para hacer la animación del muñequito subiendo escaleras, es muy difícil y todavía no me convence del todo joder ... qué chungo es hacer un puto juego.

----

Ya me extrañaba que no estuviéseis haciendo algo :D

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Dom May 05, 2013 11:46 am
por Alxinho
Yo la array del mapa lo tengo así dimensionado, la ventana de juego es de 8x6 tiles:

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}},{_
...
...


Lo necesitaría que lo ordenara como estos bloques de pantallas.

------------

Una duda que tengo es ¿ocupa lo mismo dos arrays de 8 elementos y una array de 16 elementos? ¿El hecho de dimensionar tiene un coste extra de gasto de memoria?
Lo pregunto porque tengo la costumbre (no sé si mala) de dimensionar una array para cada cosa, porque hacer un contenedor de gráficos en una sola array me vuelve loco. Lo hago porque lo tengo todo más localizado y ordenado para mí.

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Lun May 06, 2013 7:49 am
por na_th_an
El "overhead", o sea, lo que algo ocupa en memoria además de lo que ofrece, es muy pequeño. Creo que son 2 bytes por dimensión y por array, para indicar el tamaño. O sea, que no te preocupes por eso.

Lo que tengo es casi lo que necesitas. Ordena el mapa por pantalla pero es monodimensional, o sea, vienen todos los bytes juntos.

En vez de mapa (pantalla, y, x) tendrás que usar mapa (pantalla * 48 + y * 8 + x)... O editar el .bas que escupe para poner las llaves que faltan :D

Acabo de ver que el programilla del que te hablo lo incluí en mi tutorial de fourspriter. En este post http://tcyr.wordpress.com/2012/02/23/tu ... un-mapa-2/ se explica cómo se usa y está el enlace para descargar. Aunque en el ejemplo los tiles sean de 16x16, eso no importa.

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Lun May 06, 2013 10:56 pm
por Alxinho
Buenas compañero, he estado probando y tras hacer mil pruebas al final no voy a poder usar el mapcnv porque me resulta un follón de cojones pasar las pantallas al código del juego. Al final lo que he hecho es hacer con el mappy dos mapas, uno el global con todas las pantallas del juego y otro con sólo una que dibujo de nuevo y la exporto como texto, el orden que me resulta está bien ordenado y tan sólo usando el Crimson editor y la opción de replace ,$ ,_ listo, ya tengo la pantallica en el juego para trastearla.

Muchas gracias de verdad!

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Mar May 07, 2013 8:25 am
por na_th_an
¡Pero si están en el mismo orden! Si no quieres modificar el código que exporta, puedes acceder como te he dicho, con una sola dimensión, en lugar de 3. En vez de mapa (pantalla, y, x), haces un mapa (pantalla*48+y*8+x) y listo.

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Mar May 07, 2013 7:37 pm
por Alxinho
Lo de una dimensión sola mejor no que la lío seguro aparte de tener que ponerme a cambiar el código y me da mucho palo.

Sobre lo otro pues no sé, yo diría que lo hice bien pero después al abrir el código que escupe no me salía ordenado (por cierto muy bueno lo de la señal de warning :lol: ) lo intentaré de nuevo a ver pero sino con la manera que te digo ya me sirve bastante bien aunque sea un poco mas lento.

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Mié Feb 05, 2014 8:57 pm
por Alxinho
Me he dado cuenta de una cosa con ZXBasic y no pillo el porqué ...

Resulta que si comparo cuanto me ocupan estas dos maneras de imprimir la que creo que debería ocupar menos ¡me ocupa más! :shock:

Esto me ocupa menos:

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"


Y esto me ocupa más, ¿porqué?!

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


En el primer ejemplo tengo que escribir 12 prints! que se supone que chupan un huevo mientras que en segundo ejemplo sólo 3 prints!

:x

Re: ZX BORIEL errores mios de sintaxis o incompati con Sincl

Publicado: Sab Ene 03, 2015 4:30 am
por tachbach
Alxinho, ¿que tal?

¿En qué quedó tu jueguito? hace 2 años que no entro aqui XD... ya me da curiosidad. Ya me estaba gustando esto del Assembler con el GENS y he dejado nada de tiempo para el Boriel Basic.

Un saludo.