Cada vez lo tengo mas dificil.
Hice un poco de trampa, me fije en el codigo de lib/img.txt, la libreria de manejo de bitmaps, llegue al este bucle luego de muchas pruebas!!
Aunque la rutina de recorrido del la imagen se puede compartir, con una variable o con la direccion del vector en la pila (esto es mejor),
el codigo que se debe ejecutar esta muy adentro, tiene dos bucles afuera!
entonces defino dos palabras, grabar un tile! y poner un tile@, aunque son casi iguales.
Elijo utilizar w y h, no x2 y2 asi no tengo que calcular las distancias
:tile@ | w h x y adr --
>r
setxy
sw pick2 - | precalculo de suma linea
swap | w dw h
( 1? )(
pick2 ( 1? )( r@+ px!+ 1- ) drop
over px+!
1- ) 3drop
rdrop ;
:tile! | w h x y adr --
>r
setxy
sw pick2 -
swap | w dw h
( 1? )(
pick2 ( 1? )( px@ r!+ 1 px+! 1- ) drop
over px+!
1- ) 3drop
rdrop ;
fijate que lo que trato de hacer es usar SETXY solo una vez
ahora obtener los tiles correctos
cls
100 100 15 aro
75 75 15 aro
200 200 15 aro
175 225 15 aro
25 25 75 75 'tile1 tile!
25 25 175 200 'tile2 tile!
un detalle, uso CLS y no CLRSCR porque esta ultima esta hecha para SHOW, ademas de hacer CLS limpia las variables para la GUI y inicializa el cursor para PRINT, aqui no uso nada de esto. CLRSCR esta definida en gui.txt
DIBUJA queda casi igual
#tiles 'tile1 'tile2
:dibuja | w h --
la llamada seria
Ultimo detalle, el azar siempre es el mismo, para modificarlo:
inicia la semilla de rnd con los milisegundos del sistema.