



Esta documentacion explica como se debe realizar un mapa virtual para lograr
programar un juego del estilo del Sonic, el mario y todos los de ese estilo.
Tambien sirve para muchos timpos de juegos (Matamarcianos,rpg's,juegos de luchas) 


NOTA: si no entendes algo segui adelante que seguro que esta mejor aclarado.

Primero a todo el mapa virtual es un mapa de juego que es muchisimo mas grande
que el tamao de la pantalla. Se define como un array bidimensional
( tambien llamado matriz o grilla).
Cada Valor de esta matriz es un byte o un word. y Representa cada uno de los
"tiles" (cajas o cuadrados con los que esta compuesta la matriz del
mapa virtual) (ver TILES.PCX)
El tamao en X e Y de cada uno de estos tiles suele ser igual (un cuadrado)
asi la programacion resulta ser mucho mas sencilla.
El tamao de la matriz debe ser muy grande (ej: 500 tiles x 300 tiles)
y su tamao en pixeles seria de 500*(largo X del tile) x 300*(largo Y del tile)


Cada valor de la matriz.
~~~~~~~~~~~~~~~~~~~~~~~~

Una mejor manera y mas avanzada es representando con (por ejemplo)
un WORD a cada uno de los valores, y dividiendo los Bits de cada uno en
la siguiente manera. (hay que usar bit masking -comandos OR o AND o sino: | o & de C - )

(ejemplo de uso de los bits del word)

 Funcion/Bit |  15   |  14   |  13   |  12   |  11   |  10   |  9  |  8  |  7..0     |
             |       |       |       |       |       |       |     |     | tile      |
             | Bit de| Bit de| Bit de| Bit de| Bit de| Bit de| Res.| Res.| correspon-|
             | Piso  | techo | pared | layer | dao  | agua  |     |     | diente    |


Tenemos entonces que en cada WORD de la matriz podemos decir que el
Lo-Byte (bits 0..7) es usado para decir que Tile dibujar y el Hi-Byte
(bits 8..15) para describir el atributo.

Mas profundamente dicho:

Tile correspondiente: Es el dibujo que va a ser colocado ahi. Esta guardado en memoria.
                      (un dibujo como el questa en tiles.pcx).

Bit de piso: si ese bit es uno, el personaje permanecera apoyado. No caera mas
             de esa caja.
Bit de techo: Si el bit es uno, si el personaje salta o va hacia arriba chocara y no
              podra seguir subiendo.
Bit de pared: no podra avanzar mas si esta contra esta caja.
Bit de Layer: Indica si este tile debe ser dibujado adelante o detras del
              personaje.
Bit de Dao:  Si esta en esta caja se daara (se le resta energia o muere)
Bit de agua: Se puede usar para que si el personaje esta en esta caja
             este debajo del agua (saltara mas, se movera mas lento,etc)
             Tampoco es mala idea dibujar una transparencia azul.
Res. : se refiere a que pueden usarse en alguna funcion acorde al juego.
       (ej: en el sonic. Tas en este tile y el bicho se hace bolita solo
            para meterse en un tunel, y cuando sale y pasa por un tile
            con el mismo bit, vuelve a ser normal, o sino, que me olvide,
            para que el tile se vea invertido. asi no nos gastamos
            en dibujar 2 iguales pero que sean invertidos. Por ahi en
            alguno que otro juego se puede usar como bit de hielo, asi
            el personaje se desliza..)



Las Coordenadas virtuales.

Primero vamos a tomar como ejemplo que los tiles son de 25x25.
Ademas vamos a tomar que trabajamos en 320x200.
los valores entre parentesis son (X,Y).

Vamos a tomar que en este mapa virtual las coordenadas 0,0 son la
esquina superior izquierda de tile que se encuentra en la posicion (0,0) de
la matriz. Las coordenadas  (50,50) serian la esquina superior izquierda
del tile en la posicion (2,2) de la matriz.
ASimismo las coordenadas (62,25) estarian: X en el medio e Y en la primera fila
del tile (2,1).

(nota. con DIV me refiero a division, el resultado de la misma es sin coma y SIN APROXIMAR VALOR
o sea, si es 15 DIV 4 = 3 y no 4 (que seria la aproximacion).) 
De esta manera para saber a que valor de la matriz corresponde cada par ordenado
hacemos   (X Div 25,Y Div 25). Si X e Y fueran (62,25) entonces quedaria (2,1).
Mas facil es decir que si las coordenadas del personaje son por ejemplo
(158,210) entonces esta en el valor de la matriz (6,8).
(Asi yo podria fijarme si el bit del numero que corresponde a ese valor es un
piso y nivelar el personaje.)



OTRA COSA, NOTESE QUE EN NINGUN MOMENTO HABLE DE LA PANTALLA O DE DIBUJAR
ALGO AHI. TODO ESTO ES VIRTUAL Y LA VISUALIZACION ES -OTRO- PASO.


Los objetos virtuales.
-=-=-=-=-=-=-=-=-=-=-
Es todo lo que interactua dentro del mapa y que puede tomar cualquier cordenada
virtual. tienen cada uno sus cordenadas X e Y y ademas pueden tener otros
valores. (notese que yo los defino como OBJETOS, o como Registros. (struct en C,record en pascal))
Estos son estructuras de datos que dentro de si contienen varios campos diferentes de datos)

Los mas importantes:

el Monitor:
~~~~~~~~~~~

Si, exactamente. El monitor de la computadora (por mas que al principio suene
estupido) es un objeto virtual. Tiene sus coordenadas X e Y.
Entonces podriamos decir que entre X y X+319 y entre Y y Y+199 corresponde
al rango de visualizacion. o sea, que parte del mapa se va a mostrar en
pantalla. Mientras varien estas X e Y se va a ver un lugar diferente.
(Generalmente estas coordenadas lo que hacen es seguir al personaje).

El personaje.
~~~~~~~~~~~~~

Tiene en el objeto sus coordenadas. (Ademas de que tiene otros muchos mas
valores como la aceleracion del mismo, un valor que dice si lo estan golpeando,
si esta saltando, su energia, sus vidas, ETC.)

En lo que es tamao del personaje siempre preferi que la X sea el medio
(si mide 50 e ancho, la X del personaje es 25) y Y la parte de abajo (si mide
40 de alto tonces es 40).

A mi opinion, y que es lo que yo hago, es que (excepto que este saltando)
hago que el personaje este cayendo todo el tiempo (con su aceleracion por
supuesto. Se incrementa todo el tiempo la aceleracion y se incrementa Y
con la aceleracion). , Pero que si se encuentra que su (X,Y) Pertenecen a un valor de
la matriz (X div 25,Y div 25) que tiene el Bit de Piso, entonces pondra Y
a la altura deseada del piso y cambiara la aceleracion de la caida a 0.

Cuando hago que el personaje salte simplemente cambio la aceleracion del
personaje a un numero negativo.

Entonces coviene definirla como :
                                   ShortInt  (sea el casode pascal).
                                   Char      (sea el caso de C)
                                   Byte Signado (sea el caso de Asm)

Ojo que siempre defino un maximo para la aceleracion Negativa y que
DEBE ser menor que 25, sino podria atravezar un tile mientras cae)

Generalmente lo sigue la pantalla.



Los enemigos.
~~~~~~~~~~~~~

A diferencia del personaje , la computadora los maneja.

Corresponde al programador darles vida programando sus funciones.


Los Tiles Vectoriales.
~~~~~~~~~~~~~~~~~~~~~~

Aha, Esta no se la esperaban. Son como los tiles de la matriz y se definen
y cargan igual, pero sirven para otras cosas y ocupan solo un byte.
(no necesitan atributos).
Solo contienen 3 variables. X,Y y Tipo.
X e Y ya se sabe que es.
Tipo es el numero de tile.

Son OTRO tipo de tiles. Su uso es para hacer cosas como
Explosiones, items, vidas, brillitos, elevadores,  monedas,
cajas (las cajas con signo de pregunta del mario World (en las
otras versiones las cajas eran parte de la matriz)
cosa que pueden estar en cualquier lado en cualquier coordenada.







El PROGRAMA.
~~~~~~~~~~~~

Se divide en Dibujos y calculo. 

Parte de dibujos:
-=-=-=-=-=-=-=-=-
Primero pones el Fondo. Podes hacerlo con un doble scroll o con varios layers
Pone los tiles con layer de atras del personaje
Pone Personaje , enemigos y tiles vectoriales.
Pone los tiles con layer de adelante.
Copia a pantalla.




Calculos..
-=-=-=-=-=
Se leen las teclas o dispositivo de entrada.
Se efectuan los calculos de los personajes tiles vectoriales y enemigos.
Se hacen animaciones de paleta y demases.



Mas en detalle.
-=-=-=-=-=-=-=-

trabajando en un buffer secundario de 64000 Bytes (si usamos 320x200)

Fondo: Tenes guardados los bitmap de los layers. si se van para un lado
vuelven por el otro y cosas asi. Hay mucha documentacion que explica esto.

Se hace un For y se revisan los tiles que se van a ver.
Si son con layer de atras de personajes se dibujan.
si NO, se mandan a una Pila (stack). (si no sabes esto, hace el for de nuevo mas adelante)
Se ponen personajes y demases.
Se sacan los cosos dl stack y se dibujan. (si no sabes esto hace un for y dibuja los de atributo adelante)
Se hace un rep movsdw y asi se copia el buffer secundario a pantalla. (tenes un puntero a un array de 64000 bytes,
                                                                       que los copias todos a la direccion 0xA000/$A000/0A000h (como quieran llamarle)         

Calculos:
Depende de como lo haga el programador.






Tips y Ayudas.
~~~~~~~~~~~~~~


si se usa paleta de 256 colores es muchisimo mas comodo y de mejor calidad
destinar una parte de la paleta al personaje y  a los tiles vectoriales,
otra a los enemigos y otra al nivel (tiles y fondo).

-=-

Usar Time Compensation.

Es el famoso algoritmo que hace que vaya a la misma velocidad en una Pentium
233MMx que en una 386. O sea, si no puede mantener los cuadros por segundo
deseados saca cuadros.

Ya que no muchos lo saben lo explico.

Primero nos colgamos a la interrupcion del timer tick (no la 8 !!!, la 1C, bueno, si queres a la 8, pero al final de la rutina tenes que llamar al antiguo procedimiento).

la rutina a la que llama la interrupcion incrementa una variable (llamemosla timerVar).
(nota: es conveniente setear la velocidad del reloj a 30 ticks / segundo)

es asi (en lenguaje algoritmico):

REPETIR

      timervar <- 0    (se le asigna 0 a timervar)
      DIBUJAR
      TOMATIEMPO <- timervar     (cuantos 1/30 segundos tardo en dibujar)

      SI (TOMATIEMPO > CUADROS_Por_Tick) ENTONCES
                                         REPETIR [CALCULA] (TOMATIEMPO DIV CUADROS_POR_TICK) VECES
                                         ~~~~~~~~~~~~~~~~~-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                         SI_NO

                                         CALCULA
                                         REPETIR (nada) HASTA QUE (TIMERVAR >= CUATROS_POR_TICK)

                                         FIN_SI


HASTA QUE QUIERAS SALIR DEL LOOP.


Esto hace que vaya con menos cuadros cuando va lento y que mantenga la velocidad cuando va rapido.

-=-=

La animacion de paleta queda muy linda :)





   Texto hecho por THE RED - BIOFORCE.


























            



             



                      






que mas queres ver? no hay nada mas que ver. no jodas mas, si llegaste a leer hasta aca tas destrozado hermano ;) hehe
