BASIC Standard: Render ¿turbo?

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Vie Nov 16, 2012 6:04 pm

Buenas!

En relación al jueguecito que estoy escribiendo para el concurso de Bytemaniacos (y porque me he picado con mi "yo mismo" de la niñez), tengo ahora dudas/consultas referente a la parte "video".

Como he comentado en el hilo BASIC Standard: Acelerar carga de matrices (viewtopic.php?f=6&t=2958&start=15), interesa usar SOLO Basic, y NADA más que Basic, no sirven rutinas de copias de bloques de memoria, ni triquiñuelas parecidas. A lo máximo que se llega es a cargar desde cinta.


Al tajo!!!

Para el tema de vídeo, he pensado en usar los archifamosos UDG. Inicialmente, mis pruebas de render para mapas pequeñitos no da problemas, pero si quiero llenar toda la pantalla, la cosa se convierte en un infierno.

La idea inicial era renderear un mapa de 30x16 tiles. Ya veremos como queda después de ver el asunto matrices (creo que solventado de momento).

NO!!! NO ME HE VUELTO LOCO!!! ;)

El mapa no tengo intención de modificarlo una vez se ha representado en pantalla por primera vez; tan solo pintar los tiles que cambian...


Haciendo test (no recuerdo muchas cosas del ZX, hacía la tira que no programaba en este Basic).... me doy cuenta de una cosa...

Si hacemos:

PRINT AT 0,0;"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; (32 carácteres)

la máquina los dibuja en pantalla con relativa velocidad, desde luego muy superior a algo tipo:

FOR n=0 TO 31
PRINT AT y,n;chr$(peek(posram+n));
next


¿IDEAS para acelerar el pintado de UDG?


Gracias de nuevo por anticipado ;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Render ¿turbo?

Mensaje por na_th_an » Vie Nov 16, 2012 7:31 pm

Poco hay. La idea sería guardar TODO el mapa como una cadena e imprimirlo con un PRINT. Modificarlo se haría usando string slicing (en plan s$(y*32+x)="P"). Copiar la copia original sobre la copia de juego es un simple LET. Es lo más rápido. Desventaja: el juego será monocromo a menos que montes un pifostio de atributos bestial con los códigos de control de color dentro de la cadena.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Vie Nov 16, 2012 10:25 pm

na_th_an escribió:Poco hay. La idea sería guardar TODO el mapa como una cadena e imprimirlo con un PRINT. Modificarlo se haría usando string slicing (en plan s$(y*32+x)="P"). Copiar la copia original sobre la copia de juego es un simple LET. Es lo más rápido. Desventaja: el juego será monocromo a menos que montes un pifostio de atributos bestial con los códigos de control de color dentro de la cadena.


Juasssssss, me imagino una linea llena de inks y papers...


Para el tema de color, pensaba en monocromo, pero si me apuras, se me ocurre POKEAR la zona de atributos directamente.

Sobre el PRINT, ¿te refieres a hacer?

PRINT AT 0,0;"xxxxxxxxxxx... 32x22 tiles";
PRINT #1;AT 0,0;"etc.... 32x2tiles";

Hmmmm ¿No habia un limite de longitud de linea Basic?

Habria que hacer una funcion/y/o parser de mapa 2d a "ristra" de texto...

¿que es eso del string slicing?
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Vie Nov 16, 2012 10:27 pm

Estoy en el ipad, voy a probar en el emulata y comento :mrgreen:
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Sab Nov 17, 2012 10:09 am

Bueno, ya tengo algunos resultados después de hacer un "invento".

Se me ha ocurrido lo siguiente, para un buffer de pantalla de 32x22 tiles.

Supongamos que cargo desde cinta en la dirección 40000 los datos correspondientes a los UDG que forman la pantalla.
LINEA 30: Declaro una variable t$ en ella almaceno los 704 bytes que necesito (32x22).
LINEAS 80-110: Busco en la memoria en que posición se aloja la cadena t$ y sus correspondientes bytes.
LINEAS 140-160: Con un bucle FOR-NEXT, hago POKE en la posición de la RAM donde está t$.
LINEA 180: Pinto t$.

LISTADO:

Código: Seleccionar todo

10 REM Test TextVideo
20 CLEAR
30 LET t$="HRK00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
40 LET ancho=32
50 LET alto=22
60 LET buffer=alto*ancho
70 LET dirorigen=40000
80 LET vars=PEEK 23627+PEEK 23628*256
90 IF PEEK (vars)=72 AND PEEK (vars+1)=82 AND PEEK (vars+2)=75 THEN PRINT vars: GO TO 120
100 LET vars=vars+1
110 GO TO 90
120 LET dirmem=vars
130 LET tick1=(65536*PEEK 23674+256*PEEK 23673+PEEK 23672)/50
140 FOR n=dirmem TO (dirmem+buffer)-1
150 POKE n,PEEK (dirorigen)+144
160 NEXT n
170 LET tick2=(65536*PEEK 23674+256*PEEK 23673+PEEK 23672)/50
180 PRINT AT 0,0;t$;
190 PRINT AT 0,0;tick2-tick1
200 GO TO 200


Tiempo de cálculo:
BASin: 7,24 sec (si en la linea 150 hago POKE, valor)
BASin: 10,40 sec (si en la linea 150 hago POKE, PEEK posorigen)
Spectaculator / ZXSpin: 13,06 sec (si en la linea 150 hago POKE, PEEK posorigen)

De lo que se deduce que:
1- Para procesar una pantalla con un valor determinado FIJO, tardamos unos 8 sec. (Simular un CLS o rellenar con el mismo UDG).
2- Para PROCESAR una pantalla COMPLETA (32x22), sin usar la zona inferior #1, tardamos unos 13-15 sec.
3- Pintado de la variable, 0.04 sec.


¿A alguien se le ocurre alguna forma de optimizar la "parte" POKEar?

;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

elfoscuro
Herbert
Mensajes: 65
Registrado: Mar Nov 24, 2009 7:16 pm

Re: BASIC Standard: Render ¿turbo?

Mensaje por elfoscuro » Sab Nov 17, 2012 10:32 am

Parte 1: Almacenamiento de pantallas.

Lo primero, asustarte ;-)

Cada pantalla de 30x16 se te va a 480 bytes (medio K), si lo haces en cadenas. Si vas a dejar 20k para los gráficos, imagino que unos 18 para las pantallas, eso hace 36 pantallas monocromas.

Puedes meter colores. En el manual verás que el los CHR$ 15 y CHR$ 16 son INK y PAPER. Si pones CHR$ 15;CHR$ 4 (creo recordar, si no va, pon "4" después del 15;) cambiarás a INK 4. Al ser un PRINT, no hace falta que lo pongas cada byte, si no cada vez que cambie. Teniendo en cuenta 480 de tamaño de la pantalla, piensa en 200 más para los cambios (depende del grado de colorio puede ser más o menos). 600 bytes por pantalla... Demasiado, sólo te deja 30 pantallas.

Has de encontrar un modo de reducir. Por ejemplo: imagina que tienes una pantalla así:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXCCCCCCCCCCCCCCCCCCCCCCCCCXXXX
XXXXCCCCCCCCCCCCCCCCCCCCCCCCCXXXX
XXXXCCCXXXXCCCCCCXXXXCCCCCCCCXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Harías:

10 LET a$="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
20 LET b$="XXXX"
30 LET c$="CCCCCCCCCCCCCCCCCCCCCCCCC"
...
50 LET p$=a$+b$+c$+b$+c$+"CCC"+b$+"CCCCC"+b$+"CCCCCCCC"+b$+a$
60 RETURN
100 REM Pantalla siguiente
...
999 REM bucle principal
1000 GOSUB NUM_PANT*50
1010 PRINT p$

Si manejas el mapa de forma que estas cadenas a$, b$, c$ sean muy estándar, reduces el tamaño mucho, mucho. Siempre trabajarás sobre p$, primero montándola y luego imprimiendo.

No es lo más operativo, habría que buscar un algoritmo "de verdad", y leer la pantalla una vez creada (primero dibujas, y luego comprimes). Puedes usar ATTR y la otra para los caracteres que hay (no la recuerdo :-( ).

elfoscuro
Herbert
Mensajes: 65
Registrado: Mar Nov 24, 2009 7:16 pm

Re: BASIC Standard: Render ¿turbo?

Mensaje por elfoscuro » Sab Nov 17, 2012 10:44 am

Parte 2: UDG

No se si sabes que existe la posibilidad de aumentar los GDU. 21 en 48k (19 en 128k) no dan para mucho, la verdad...

En el manual habla de una variable del sistema (CHAR$) ubicada en la posición 23606 y 23607. Con ella, puedes apuntar a un bloque de datos donde hayas definido los nuevos caracteres (al estilo de los GDU).

Mira este artículo de la MH:

http://microhobby.speccy.cz/mhf/114/MH114_27.jpg

Puedes hacer lo mismo con los GDU, pero usando las direcciones 23675 y 23676. Como los GDU siguen siendo 21, lo que harías será poner varios bloques, y luego irías cambiando de bloque de GDU según los necesites. Si modificas los 96 caracteres del spectrum, puedes hacerte unas letras chulas para los textos, o esquinas para mostrar los mensajes en un recuadro... Lo puedes medievalizar a tu antojo ;-) Y si necesitas más GDU, puedes tener varios juegos de CHAR$, teniendo en cuenta que cada uno ocupa 768 bytes (los GDU 168).

Esto, por si lo ves raro, no es código máquina. Son triquiñuelas de las variables del sistema. El commodore tiene sus pokes, y el Spectrum sus variables del sistema ;-)

Un saludo.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Sab Nov 17, 2012 10:47 am

elfoscuro escribió:Parte 2: UDG

No se si sabes que existe la posibilidad de aumentar los GDU. 21 en 48k (19 en 128k) no dan para mucho, la verdad...

En el manual habla de una variable del sistema (CHAR$) ubicada en la posición 23606 y 23607. Con ella, puedes apuntar a un bloque de datos donde hayas definido los nuevos caracteres (al estilo de los GDU).

Mira este artículo de la MH:

http://microhobby.speccy.cz/mhf/114/MH114_27.jpg

Puedes hacer lo mismo con los GDU, pero usando las direcciones 23675 y 23676. Como los GDU siguen siendo 21, lo que harías será poner varios bloques, y luego irías cambiando de bloque de GDU según los necesites. Si modificas los 96 caracteres del spectrum, puedes hacerte unas letras chulas para los textos, o esquinas para mostrar los mensajes en un recuadro... Lo puedes medievalizar a tu antojo ;-) Y si necesitas más GDU, puedes tener varios juegos de CHAR$, teniendo en cuenta que cada uno ocupa 768 bytes (los GDU 168).

Esto, por si lo ves raro, no es código máquina. Son triquiñuelas de las variables del sistema. El commodore tiene sus pokes, y el Spectrum sus variables del sistema ;-)

Un saludo.


Esta parte la conozco, y recuerdo de mis tiempos mozos haber jugado con esto para meter más de un set de UDGs.

;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Sab Nov 17, 2012 10:54 am

elfoscuro escribió:Parte 1: Almacenamiento de pantallas.

Lo primero, asustarte ;-)

Cada pantalla de 30x16 se te va a 480 bytes (medio K), si lo haces en cadenas. Si vas a dejar 20k para los gráficos, imagino que unos 18 para las pantallas, eso hace 36 pantallas monocromas.

Puedes meter colores. En el manual verás que el los CHR$ 15 y CHR$ 16 son INK y PAPER. Si pones CHR$ 15;CHR$ 4 (creo recordar, si no va, pon "4" después del 15;) cambiarás a INK 4. Al ser un PRINT, no hace falta que lo pongas cada byte, si no cada vez que cambie. Teniendo en cuenta 480 de tamaño de la pantalla, piensa en 200 más para los cambios (depende del grado de colorio puede ser más o menos). 600 bytes por pantalla... Demasiado, sólo te deja 30 pantallas.

Has de encontrar un modo de reducir. Por ejemplo: imagina que tienes una pantalla así:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXCCCCCCCCCCCCCCCCCCCCCCCCCXXXX
XXXXCCCCCCCCCCCCCCCCCCCCCCCCCXXXX
XXXXCCCXXXXCCCCCCXXXXCCCCCCCCXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Harías:

10 LET a$="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
20 LET b$="XXXX"
30 LET c$="CCCCCCCCCCCCCCCCCCCCCCCCC"
...
50 LET p$=a$+b$+c$+b$+c$+"CCC"+b$+"CCCCC"+b$+"CCCCCCCC"+b$+a$
60 RETURN
100 REM Pantalla siguiente
...
999 REM bucle principal
1000 GOSUB NUM_PANT*50
1010 PRINT p$

Si manejas el mapa de forma que estas cadenas a$, b$, c$ sean muy estándar, reduces el tamaño mucho, mucho. Siempre trabajarás sobre p$, primero montándola y luego imprimiendo.

No es lo más operativo, habría que buscar un algoritmo "de verdad", y leer la pantalla una vez creada (primero dibujas, y luego comprimes). Puedes usar ATTR y la otra para los caracteres que hay (no la recuerdo :-( ).


Jejeje, me asustas, pero a medias.

Ten en cuenta una cosa, mis test son A LO BRUTO, quiero decir, que aún no tengo claro un tamaño FINAL FINAL del mapa. No se si será de 30x16 ó 20x20, etc... además hay que dejar espacio para el marcador y también habia pensado en añadir un marquito, como los clásicos...

Lo que comentas en tus variables a$,b$, etc, lo tenia pensado desde que ayer leí las respuestas del hilo, de hecho ya he probado a "machacar" el buffer variable "tuya" p$ con una ristra que sería un marco...

Ayer probé además otra cosa; en lugar de usar un MEGA buffer de texto para toda la pantalla, probé con una matriz de 22 líneas (que contienen 32 carácteres), y se pinta relativamente bien, además con la posibilidad de dibujar un efecto de "cortina" que "desciende"... no se si me explico.


La parte que me gustaría optimizar es la de copiar con POKE una posición de RAM a la otra... hmmmm
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Sab Nov 17, 2012 10:55 am

Ah!

Se me olvidaba, para la parte de atributos, o hago lo que comentas... o POKEO en la zona de atributos directamente, aunque vuelvo a tener el problema de un bucle FOR-NEXT lento, para los 768 POKEs...

:?
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Render ¿turbo?

Mensaje por na_th_an » Sab Nov 17, 2012 10:08 pm

Estamos en BASIC, creo que todas estas cosas de mapeado por tiles son demasiado costosas para un intérprete tan lento. Si introduces además un algoritmo de compresión las pantallas van a tardar un rataco en dibujarse.

Sea lo que sea lo que elijas, las pantallas van a tardar un rato en pintarse. Dependiendo del tipo de juego que estés programando te vendrá mejor una cosa u otra.

Yo he usado mapeado por tiles (de 3x3, o de 2x2, por ejemplo) y las pantallas, incluso en mi primera prueba, que usaba 5x5 tiles de 3x3 caracteres por pantalla, tardaban varios segundos en dibujarse. Tenía mi bucle principal, y luego un IF que veía qué tile tocaba pintar (leyéndolo con PEEK de una dirección de memoria), y luego tres PRINT con las tres filas de cada tile de 3x3... Todo muy poco eficiente.

Lo más rápido es intentar tirar de la potencia del PRINT todo lo que puedas.

En mis primeros juegos, que solían ser de plataformas, no mapeaba por tiles, sino que en cada pantalla pintaba las plataformas que necesitaba con PRINTs. Era lo más rápido. Pero esto no nos vale para otro tipo de juegos.

Lo más rápido, sin serlo realmente, para mapear por tiles, implica manejar muy bien los códigos de control de PRINT, cadenas, y toneladas de string slicing (se refiere a acceder para lectura o escritura a posiciones concretas de las cadenas). En BASIC, lo más rápido para copiar datos es la asignación de cadenas. Incluso, aplicando técnicas que rozan el hacking, pueden copiarse incluso pantallas enteras con un simple LET s$=a$... pero eso es otro tema que puedes investigar mirando en el foro de BASIC del WOS... Ya buscaré el enlace.

Lo que quiero decir es que lo más rápido es almacenar las pantallas en cadenas. Si, además, quieres tener un mapeado extenso, es mejor que los "tiles" que manejes sean mayores de un caracter: agrupaciones de, por ejemplo, 3x3 caracteres, formando un cuadro.

Puedes almacenar cada tile en una posición de un array de cadenas. Puedes usar incluso colores para cada carácter que los forma empleando los códigos de control de PRINT. Además, usaremos los códigos de los movimientos de control, para que con un simple PRINT AT imprimamos todo el tile. De este modo los cálculos se reducen al mínimo, ya que hay más tiempo de ejecución de la rutina de ROM que de nuestro programa interpretado.

Sirviendo como ejemplo, y sin usar colores, así crearíamos por ejemplo un tile de 3x3:

Código: Seleccionar todo

LET t$(4) = "ABC"+chr$(10)+chr$(8)+chr$(8)+chr$(8)+"DEF"+chr$(10)+chr$(8)+chr$(8)+chr$(8)+"GHI"


Eso definiría nuestro tile número 4. Los códigos que usamos son 10 (cursor abajo) y 8 (cursor izquierda). De este modo, un simple:

Código: Seleccionar todo

PRINT AT y, x; t$(4)


Imprimiría de un plumazo todo el tile 4, de 3x3, a partir de la posición y, x. Para pintar una pantalla de 5x4 tiles almacenada linealmente a partir de "addr", haríamos:

Código: Seleccionar todo

100 FOR y=0 TO 9 STEP 3: FOR x = 0 TO 12 STEP 3: PRINT AT y, x; t$(PEEK(addr)):LET addr=addr+1:NEXT x: NEXT y


Los tiles puedes definirlos, dejarlos en memoria, y luego eliminar las lineas que los asignan, para ahorrar espacio. Recuerda que, una vez creadas las variables, a menos que hagas CLEAR o RUN no se borran, y además se guardan junto con el programa con un SAVE.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Dom Nov 18, 2012 7:39 am

Cappici!

Actualmente mi proyecto de prueba esta realizando un pintado de 32x22 tiles de una pantalla almacenada en una variable de texto. Con un PRINT AT 0,0;v$ dibujo TODO lo que seria el fondo (mapa) del juego.

En una "capa" superior y con un sencillo print, estoy dibujando el sprite protagonista. De momento SOLO utilizo un tile para el grafico; inicialmente la idea era usar un tile de 8x8 px (un caracter vamos). Con tu comentario acerca de sprites de 3x3 tiles, se me han ocurrido unas cuantas pruebecitas a realizar.

He añadido además una sencilla rutina de ctrl de teclado, para hacer pruebas de movimiento / control del personaje sobre el mapa... me da a mi que es más rápido ésto:

if peek(posram+32)=0 then POSICION LIBRE ABAJO, PUEDE CAMINAR, ETC ETC

que ésto:

if m(y+1,x)=0 then POSICION LIBRE ABAJO, PUEDE CAMINAR, ETC ETC

;)


Además, tal como enfocas tu ejemplo de mapeado, se reduce bastante el tamaño de los mapas ya que la matriz se divide entre 3, si no voy confundido.

Lo que me ha dejado n poco "loco" es ese comando PRINT AT y,x; t$ (peek(direccionram))...

Entiendo que en la posición de memoria direccionram, hay la ristra de bytes correspondientes a un sprite de 3x3 tiles, con sus atributos de control etc, tal como muestras...

Muchisimas gracias por los consejos/"trucos", etc... voy a seguir haciendo test... ;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Dom Nov 18, 2012 8:39 am

Pregunta "tonta"...

Porque cuando hago un:

PRINT "12"+chr$(10)+chr$(8)+chr$(8)+"34";

obtengo un:

134 en pantalla

en lugar de:

12
34

(12)+cursor abajo+cursor izda+cursor izda+(34)

¿¿?? :shock:
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Render ¿turbo?

Mensaje por Hark0 » Lun Nov 19, 2012 3:09 am

Nada,no responde a crhr$(10)

:shock:
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Render ¿turbo?

Mensaje por na_th_an » Lun Nov 19, 2012 10:23 am

Vaya, pues entonces parece que no funciona el truco :lol: Se me había ocurrido mientras escribía el post, y pensaba haber dado con algo interesante :lol: pero mi gozo en un pozo. Es raro, pero parece que el código del cursor abajo no funciona. Entonces hay que hacer tres prints, lamentablemente. Una pena, porque el cursor izquierda sí que funciona. Pero bueno, haciendo que tu array sea de dos dimensiones, lo tienes igualmente.

PRINT t$(PEEK(addr)), teniendo en cuenta que t$ es un array, imprime el miembro del array que haya en la posición addr. Si en addr hay un 2, imprime t$(2).

De todos modos, hay otra forma de pintar tiles. Es un poco más lenta, pero esa por lo menos funciona :lol:

Imagínate que tienes tu pantalla de ANCHOxALTO tiles almacenada en memoria a partir de la dirección "address". A partir de esa dirección irán los números de todos los tiles que forman la pantalla, ordenados de izquierda a derecha y de arriba a abajo. Habrá un bucle principal que vaya leyendo los números de tile de la memoria. Y luego, con un GOTO calculado, saltamos a lineas que imprimen un tile específico en las coordenadas x,y... Algo así, con an y al el ancho y alto del mapa. Precalculamos los topes de los bucles para ahorrar ciclos:

Código: Seleccionar todo

10 LET an1=3*(an-1): LET al1=3*(al-1)


Y luego, esta rutina pintaría una pantalla que empieza en "address":

Código: Seleccionar todo

100 FOR y=0 TO al1 STEP 3: FOR x=0 TO an1 STEP 3: GOTO 150+PEEK(address)
110 LET address=address+1:NEXT x: NEXT y: RETURN
150 PRINT AT y,x;"   ";AT y+1,x;"   ";AT y+2,x;"   ":GOTO 110
151 PRINT AT y,x;"ABC";AT y+1,x;"DEF";AT y+2,x;"GHI":GOTO 110
152 PRINT AT Y,x;"/-\";AT y+1,x;"| |";AT y+2,x;"\_/":GOTO 110
...


Así, la linea 150+i contendría el código para imprimir el tile número i y luego volvería al bucle.

Ya te digo que almacenar las pantallas caracter a caracter ocupa demasiada memoria. No creo que puedas tener más de 38K de RAM (quita de los 40K que tienes libres un poco para el editor y las variables) y el BASIC ocupa muchísimo por lo general. De todos modos, desconociendo el tipo de juego que estás haciendo, no te puedo dar más ideas :)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 14 invitados