miércoles, 17 de febrero de 2016

Ejemplo práctico de CBM .prog Studio .Sprites ,diseñador de pantallas y diseñador de juegos de caracteres. PARTE IV

Como quedamos en "Ejemplo práctico de CBM .prog Studio .Sprites ,diseñador de pantallas y diseñador de juegos de caracteres. PARTE III" hoy vamos a cubrir otros dos aspectos básicos de los Sprites. 

Estos aspectos son: 
  • La prioridad de los Sprites. 
  • Gestión de colisiones en BASIC.
La prioridad es muy sencilla de entender. Los Sprites van del 0 al 7 ,así que el 0 es el que mayor prioridad tiene y el 7 el de menos. ¿ En que se traduce esto ?. Pues bien, si los solapamos, el cero siempre estará completamente visible, por debajo el 1 y así hasta el 7. 

En la imagen siguiente lo vemos. Al moverse los 3 y solaparse, el fantasma quede arriba del todo (Sprite 0), el Pac - Man en medio (Sprite 1), pero tapando la cruz (Sprite 2).


















La gestión de colisiones, es el conjunto de instrucciones BASIC que nos permiten detectar cuando nuestros Sprites se tocan entre ellos. Esto es una parte básica de cualquier juego, y es muy de agradecer que esté soportado tanto por hardware como por el BASIC (no como otros, si te miro a ti, Spectrum). 

Básicamente existen dos instrucciones para detectar las colisiones, que usaremos en algún bucle donde tengamos la lógica de movimiento. 

Para detectar la colisión de un Sprite con otro Sprite: 

IF PEEK(V+30)AND X = [1,2,4,8,16,32,64 o 128] THEN [acción]
                               Sprite    0 1 2 3  4   5   6        7

Los valores de son 1,2,4,8,16,32,64 y 128 para cada uno de los Sprites del 0 al 7. Tenemos que usar el mismo valor en ambos lados.

Es decir, si queremos controlar las colisiones del primer Sprite en nuestro ejemplo (el fantasma), debemos usar la siguiente instrucción:

IF PEEK(V+30)AND1=1 THEN POKE V+1,PEEK(V+1)-1 

Lo que conseguimos con esto, es parar el movimiento del primer Sprite.

Hay que tener en cuenta que el registro de colisiones queda "sucio" siempre después de usado. Si no queremos sorpresas raras, lo debemos "limpiar" antes de usarlo.

Esto se hace con la instrucción: POKE V+30,0

Puedes descargar el ejemplo para CBM .prog Studio de este enlace.

Vídeo demostrativo: 



martes, 16 de febrero de 2016

Que usar para programar para MSX/MSX2 en tu PC.

De las muchas opciones que hay para programar para MSX y MSX2 os destaco una que pasa por usar el lenguaje de programación Pascal. 

Hace tiempo gracias a Slotman, teníamos el IDE MSXPad el cual compila código Pascal para nuestros MSX. Esto, combinado con las librerías incluidas nos permitía acceder a todas las funcionalidades del MSX desde Pascal. 

Esta idea es muy buena, pero lamentablemente, MSXPad no funciona correctamente en los PC modernos. 

Os presento una alternativa que he desarrollado, usando como base el trabajo realizado por Slotman. 

Esta alternativa es el MSXPad Revived

MSXPad Revived  es : 
  • Un compilador de Pascal para MSX y MSX2.
  • Un pequeño IDE para desarrollar bajo Pascal para MSX y MSX2.
  • Un set de librerías en Pascal que nos permiten usar las capacidades del MSX y MSX2.


Hay que darle las gracias a Slotman por su esfuerzo original. 

Yo he modificado y hackeado la(s) herramienta(s) para poderlas usar en un entorno PC moderno. El MSXPad Revived lo podéis descargar de su página.

Un pequeño vídeo del IDE en acción: 






jueves, 11 de febrero de 2016

Ejemplo práctico de CBM .prog Studio .Sprites ,diseñador de pantallas y diseñador de juegos de caracteres. PARTE III

En la publicación anterior, "Ejemplo práctico de CBM .prog Studio .Sprites ,diseñador de pantallas y diseñador de juegos de caracteres. PARTE II" definimos 3 Sprites y vimos las bases para posicionarlos en pantalla. 

En esta publicación vamos a cubrir los aspectos básicos de los movimientos de los Sprites en pantalla. Nos basaremos en el ejemplo de la anterior publicación y en el proyecto de la misma.

Añadimos una pequeña ayuda en el diseño de pantalla (directamente sobre el código) y movemos las posiciones iniciales de los Sprites un poco para acoplarlos a estas nuevas líneas de texto. 

250 PRINT "{113} m para mover los sprites {113}" 
260 PRINT "{113} s para parar el movimeinto {113}"
270 PRINT " {113} q para salir {113}" 

Ya que tenemos la pantalla montada, ahora vamos a implementar el movimiento de los 3 Sprites.


















Los límites de coordenadas de la pantalla, para el uso de los Sprites y que sean completamente visibles son: 

Esquina superior izquierda :
Coordenada X : 24
Coordenada Y : 50 

Esquina inferior derecha :
Coordenada X : 343
Coordenada Y : 208

Esquina inferior izquierda :
Coordenada X : 24
Coordenada Y : 229

Esquina superior derecha :
Coordenada X : 343
Coordenada Y : 50

Estas son las coordenadas máximas de las esquinas, donde el Sprite es completamente visible. Es decir, podemos usar valores inferiores o superiores, pero entonces el Sprite no será completamente visible en pantalla. 

Si no hemos usado toda la cuadríacula del Sprite (los 63 bytes) no importa, la cuenta aplica. Es decir que tenemos que tener en cuenta el tamaño completo del Sprite aunque no lo hallamos usado el lienzo completamente. 

Lo primero será mover los 3 Sprites de izquierda a derecha. 

Una cosa que tenemos que tener en cuenta, es que, si queremos mover hacia la derecha un valor superior a 255, tenemos que hacer un pequeño truco.

Para mover los Sprites, usamos POKE tal y como se indica en esta tabla:












660 REM Movimiento eje X de los Sprites
665 poke v+16,0 : GOSUB 590
670 FOR M=0 TO 347
680 hx=int(M/256):lx=M-256*hx
690 if hx=1 then poke v+16,7 : rem Esto es para hacer que pueda pasar a mas de x = 256
700 poke v+0,lx
720 poke v+2,lx
735 poke v+4,lx
740 NEXT
745 poke v+16,0: GOSUB 590 : rem reseteamos el registro a cero y volvemos a posicionar
750 RETURN
La instrucción poke v+16,activa los 3 Sprites para que puedan pasar a la "derecha" del valor 256. Si no lo hacemos, se moverán hasta un determinado punto (255)  y volverán desde la izquierda (24). 
Si vemos los valores por separador serían 
POKE v+16,1 (Sprite 0)
POKE v+16,2 (Sprite 1)
POKE v+16,4 (Sprite 2)
POKE v+16,6 (Sprite 3)
POKE v+16,8 (Sprite 4)
POKE v+16,10 (Sprite 5)
POKE v+16,12 (Sprite 6)
POKE v+16,14 (Sprite 7)

Es por esto que sumamos y usamos 7, para activarlo sobre los 3 a la vez. 

Este lío no lo tenemos para el movimiento vertical.

Las posiciones donde el Sprite es completamente visible van de la 50 a la 229. 

760 REM Movimiento en el eje Y de 1 Sprite
770 POKE V+0,100 : rem Posicion X
780 POKE V+1,50 : rem Posicion Y 
790 for M=50 to 229
800 POKE V+1,M : rem Posicion Y 
810 next 
815 for M=229 to 50 STEP -1
818 POKE V+1,M : rem Posicion Y 
819 NEXT
820 RETURN 



La tabla completa de las instrucciones POKE para manejar los Sprites, está en este documento técnico o puedes verla aquí

En la próxima publicación veremos como manejar las colisiones de Sprites y las prioridades.

El proyecto CBM .prog Studio de este ejemplo lo puedes descargar de aquí

Este es un vídeo representativo del ejemplo de esta publicación.