Categorías
MSX Basic Programación

Colisiones

Archivos amenaza.zip amenaza2.zip, rectangulos.zip, cosionesdesprites.zip

Juega desde aquí: http://msx.tipolisto.es/webmsx/standalone/?disk=files/amenaza.dsk

La fórmula

El código

Algo más elaborado

Evitar el rastro del personaje

Colisiones entre sprites y plantilla de primer juego

La fórmula



1 ' parámteros personaje, posición x e y, ancho y alto
10 let px=10: let py=20: let pw=20: let ph=20
1 'Vida del personaje
20 pv=5
1 ' parámetros enemigo'
30 let ex=150: let ey=100: let ew=20: let eh=20

40 if px < ex + ew and  px + pw > ex and py < ey + eh and ph + py > ey then gosub acción_a_realizar_enCaso_de_colision

1 ' Accines a realizar en caso de colision
50 pv=pv-1

El código

Vamos a hacer que 2 rectángulos se colisionen





1 ' Programa MSX Murcia 2020 / Program MSX Murcia 
1 ' MSX Basic'
1 ' Inicialización de 0-500 (Inicialización player e incialización enemigos está en 10000 y 20000)
1 ' Main de 1000-2000'
1 ' 5000-10000 Rutinas generales: sistema renderizado, captura teclado,etc ' 
1 ' Rutinas jugador 10000-20000'
1 ' Rutinas enemigo 20000-30000'


1 '------------------------'
1 '     Inicializando'
1 '------------------------'
1 ' Borramos la pantalla'
5 cls
1 ' Lo 1 es definir el color de caracteres blanco, fondo y margen
10 color 15,0,0
1 ' Lo 2 es comfigurar la pantalla con screen modo_video, tamaño_sprites'
1 ' el tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16x16 x), 3 (16x16px) ampliado'
20 screen 5,2
1 ' Desactivamos el sonido de las teclas
30 key off
1' Defimos a basic que haga que las variables de empiezan desde la a a la z sean enteras de 16 bits, en lugar de las de 32 que asigna por defecto
45 defint a-z
1 ' parámteros rectágulo, posición x e y, anho y alto
50 let px=10: let py=20: let pw=20: let ph=20
1 ' parámetros enemigo'
60 let ex=150: let ey=100: let ew=20: let eh=20
1' Variable que nos mostrará si hay colisión
70 let col$="no"


1 '------------------------'
1 '       main'
1 '------------------------'
1 'Subrutina cargar rectángulo personaje'
1000 gosub 10000
1 'Subrutina cargar enemigo'
1010 gosub 20000
1 ' Creamos un flujo para poder pintar en la pantalla, esto afectará a los input y print que tenga #numero'
1040 open "grp:" for output as #1
1 ' Subrutina mostrar información del juego'
1060 gosub 7000

   
1' Inicio blucle
    1 'Llamamos a la subrutina actualizar rectángulo personaje'
    2050 gosub 10500
    1 ' LLamamos a la subrutina actualizar enemigo'
    2060 gosub 21000
    1 ' Llamamos a la subrutina de los cursores / joystick
    2070 gosub 6000 
    1 'Rutina comprobar colosiones'
    2080 gosub 5000
    1 'Rutina mostrar información juego'
    2090 gosub 7000
 1 ' El goto es como una especie de while para que vuelva  capturar el teclado y dibujar'
2100 goto 2050

 
1 '-----------------------------------------------------------------'
1 '---------------------General rutines------------------------------'
1 '-----------------------------------------------------------------'
1 '------------------------'

1 'Rutina comprobar colisiones https://developer.mozilla.org/es/docs/Games/Techniques/2D_collision_detection'
5000 if px < ex + ew and  px + pw > ex and py < ey + eh and ph + py > ey then gosub 5100 else col$="no"
5020 return
1'Rutina colosión
    5100 ex=int(rnd(1)*256)-ew
    5110 ey=int(rnd(1)*210)-eh
    5120 col$="si"
5130 return



1 ' ----------------------'
6000 'Subrutina captura movimiento joystick / cursores y boton de disparo'
1 ' ----------------------'
    1'1 Arriba, 2 arriba derecha, 3 derecha, 4 abajo derecha, 5 abajo, 6 abajo izquierda, 7 izquierda, 8 izquierda arriba
    6010 j=stick(0)
    6020 if j=3 then  gosub 11050
    6030 if j=7 then  gosub 11090
    6040 if j=1 then  gosub 11130
    6050 if j=5 then  gosub 11170
6080 return

1 ' Subrutina mostrar información
    1 ' Pintamos un rectangulo en la parte superior de la pantalla', color 14 gris claro, bf es un rectangulo relleno
    7000 line (0,0)-(256, 10), 14, bf
    7010 preset (10,0)
    7020 print #1, chr$(215)"  Colision: "col$", Libre: "fre(0)
7030 return


1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas revtágulo player --------------------------------------'
1 ' ------------------------------------------------------------------------------'

1 '------------------------'
10000 'Subrutina definiendo nuestro sprite'
1 '------------------------'
1' Nuestro personaje será un rectágulo rojo
10010 line (px,py)-(px+pw, py+ph), 6, bf   
10990 return


1 '------------------------'
1 'Subrutina actualizar rectágulo player'
1 '------------------------'
1 'Aquí le estamos poniendo en la "Tabla atributos de sprite' el plano o sprite 0, la posicion, el color y el sprite, nuestra nave
    1' Borramos la pantalla
    10500 cls
    1 ' pintamos al personaje'
    10510 line (px,py)-(px+pw, py+ph), 6, bf
    1' subrutina pintar enemigo
    10520 gosub 21000
10520 return

1 '------------------------'
11040 'Subrutinas mover '
1 '------------------------'
1 'Mover derecha
    11050 px=px+5
    11070 if px>=250-16 then px=250-16
11080 return
 1 ' Mover izquierda'
    11090 px=px-5
    11110 if px<=0 then px=0
11120 return
1 ' Mover arriba
    11130 py=py-5
    11150 if py<=10 then py=10
11160 return
1 ' Mover abajo'
    11170 py=py+5
    11185 if py >=160 then py=160
11190 return

1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas revtágulo enemigo --------------------------------------'
1 ' ------------------------------------------------------------------------------'

1 '------------------------'
20000 'Subrutina definiendo nuestro sprite'
1 '------------------------'
1' Nuestro enemiho será un rectágulo verde
20010 line (ex,ey)-(ex+ew, ey+eh), 2, bf   
20020 return

1 '------------------------'
21000 'Subrutinas mover enemigo'
1 '------------------------'
    21010 line (ex,ey)-(ex+ew, ey+eh), 2, bf  
21020 return





199999 end





Algo más elaborado

Vamos a crear un juego de un personaje que tienen que recoger los coronavirus antes de que el traje se desintegre:




1 ' Programa MSX Murcia 2020 / Program MSX Murcia 
1 ' MSX Basic'
1 ' Inicialización de 0-500 (Inicialización player e incialización enemigos está en 10000 y 20000)
1 ' Main de 1000-2000'
1 ' 5000-10000 Rutinas generales: sistema renderizado, captura teclado,etc ' 
1 ' Rutinas jugador 10000-20000'
1 ' Rutinas enemigo 20000-30000'


1 ' ----------------------'
1 '   Pantalla presentación
1 ' ----------------------'
10 screen 0
20 color 11,1,1
30 locate 1,10
40 print chr$(215)" Tienes que recoger todos los virus antes de que se desintegre el traje, presione enter/return"
50 locate 1,20
60 for i=0 to 7: vpoke base(2)+(63*8)+i,0:next i
70 input " ";a$

1 '------------------------'
1 '     Inicializando'
1 '------------------------'
1 ' Borramos la pantalla'
80 cls
1 ' Lo 1 es definir el color de caracteres blanco, fondo y margen
90 color 15,7,7
1 ' Lo 2 es comfigurar la pantalla con screen modo_video, tamaño_sprites'
1 ' el tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16x16 x), 3 (16x16px) ampliado'
100 screen 5,2
1 ' Desactivamos el sonido de las teclas
110 key off
1' Defimos a basic que haga que las variables de empiezan desde la a a la z sean enteras de 16 bits, en lugar de las de 32 que asigna por defecto
120 defint a-z
1 ' parámteros personaje, posición x e y, anho  24y alto35
130 let px=10: let py=20: let pw=24: let ph=35
1 'Parametros para ayudarnos a dibjar el sprite, personaje fila y personaje columna (hay que ver el dibujo) y contador columna para hacer la animacion'
140 let pf=0: let pc=0: cc=0
1 ' Parametros de Vida y de coputras 
150 pv=100: pc=0
1 ' parámetros enemigo'
150 let ex=150: let ey=100: let ew=18: let eh=18




1 '------------------------'
1 '       main'
1 '------------------------'
1 ' Creamos un flujo para poder pintar en la pantalla, esto afectará a los input y print que tenga #numero'
1000 open "grp:" for output as #1
1 ' Subrutina cargar screen 1
1030 gosub 8000
1 ' Subrutina pintar screen 0'
1040 gosub 9000
1 'Subrutina cargar rectángulo personaje'
1050 gosub 10000
1 'Subrutina cargar enemigo'
1060 gosub 20000
1 ' Subrutina mostrar información del juego'
1070 gosub 7000
1 ' Sistema de renderer'
1080 gosub 2000

   





 
1 '-----------------------------------------------------------------'
1 '---------------------General rutines------------------------------'
1 '-----------------------------------------------------------------'






1 ' ----------------------'
1 '   Sistema de renderer
1 ' ----------------------'

1' Inicio blucle
    1 ' Borramos la pantalla'
    2000 'cls
    1 'Llamamos a la subrutina pintar personaje'
    2050 gosub 10500
    1 ' LLamamos a la subrutina pintar enemigo'
    2060 gosub 21000
    1 ' Llamamos a la subrutina de los cursores / joystick
    2070 gosub 6000 
    1 'Rutina comprobar colosiones'
    2080 gosub 5000
    1 'Rutina mostrar información juego'
    2090 'gosub 7000
 1 ' El goto es como una especie de while para que vuelva  capturar el teclado y dibujar'
2100 goto 2000
2110 return








1 ' ----------------------'
1 '   Sistema de colisiones
1 ' ----------------------'

1 'Rutina comprobar colisiones https://developer.mozilla.org/es/docs/Games/Techniques/2D_collision_detection'
5000 if px < ex + ew and  px + pw > ex and py < ey + eh and ph + py > ey then gosub 5100 else col$="no"
5020 return

1 ' ----------------------'
1 '   Rutina de colisión
1 ' ----------------------'
1'Rutina colosión
    5100 ex=(rnd(-time)*256)-ew
    5110 ey=(rnd(-time)*210)-eh
    5120 col$="si"
    5130 pc=pc+1
    5140 cls
    1' subrutina pintar información en pantalla
    5150 gosub 7000
5160 return




1 ' ----------------------'
6000 'Subrutina captura movimiento joystick / cursores y boton de disparo'
1 ' ----------------------'
    1'1 Arriba, 2 arriba derecha, 3 derecha, 4 abajo derecha, 5 abajo, 6 abajo izquierda, 7 izquierda, 8 izquierda arriba
    6010 j=stick(0)
    6020 if j=3 then  gosub 11050
    6030 if j=7 then  gosub 11090
    6040 if j=1 then  gosub 11130
    6050 if j=5 then  gosub 11170
6080 return

1 ' ----------------------'
1 '   Mostrar información
1 ' ----------------------'
    1 ' Pintamos un rectangulo en la parte superior de la pantalla', color 14 gris claro, bf es un rectangulo relleno
    7000 line (0,0)-(256, 10), 14, bf
    7010 preset (10,0)
    7020 print #1, chr$(215)"  Vida: "pv", capturas: "pc
7030 return

1 ' Subrutina cargar screen 1'
    8000 DATA 0,0,0,2,1,0,2,2,2,4,1,1,1,3,3,4,3,2,1,4,4,6,2,1
    8010 DATA 5,4,1,4,4,4,0,5,5,6,5,1,5,5,5,6,5,4,6,6,6,7,7,7
    8020 FOR C=0 TO 15:READ R,G,B:COLOR=(C,R,G,B):NEXT
    8030 BLOAD"SCREEN1.SC5",S,32768
    8040 color=restore
8050 return

1 'Pintar pantalla'
9000 for i=0 to 180 step 18
    9010 copy (0,192)-(18,210),1 to (i, 18*i),0
9020 next i

9100 return







1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas player --------------------------------------'
1 ' ------------------------------------------------------------------------------'


1 '------------------------'
10000 'Subrutina inicializar nuestro sprite'
1 '------------------------'
1' Ponemos los atriutos a sus valores por defecto
    10010 px=20:py=20
    1' MIrando a la izquierda será la fila 2, a la drecha la fila 3 y arriba la fila 3
    10020 copy (pc*pw,pf*ph)-((pc*pw)+pw,(pf*ph)+ph),1 to (px, py),0
10990 return



1 '------------------------'
1 'Subrutina actualizar player'
1 '------------------------'
    10500 copy (cc*pw,pf*ph)-((cc*pw)+pw,(pf*ph)+ph),1 to (px, py),0
10550 return





1 '------------------------'
11040 'Subrutinas mover '
1 '------------------------'
1 'Mover derecha
    11050 px=px+5
    11060 pf=2
    11065 cc=cc+1
    11070 if cc>3 then cc=0
    11075 if px>=256-pw then px=256-pw
    11076 pv=pv-1
11080 return
 1 ' Mover izquierda'
    11090 px=px-5
    11100 pf=1
    11105 cc=cc+1
    11110 if cc>3 then cc=0
    11115 if px<0 then px=0
    11116 pv=pv-1
11120 return
1 ' Mover arriba
    11130 py=py-5
    11140 pf=3
    11145 cc=cc+1
    11150 if cc>3 then cc=0
    11155 if py<=0 then py=0
    11156 pv=pv-1
11160 return
1 ' Mover abajo'
    11170 py=py+5
    11180 pf=0
    11185 cc=cc+1
    11186 if cc>3 then cc=0
    11187 if py >=212-ph then py=212-ph
    11188 pv=pv-1
11190 return


1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas revtágulo enemigo --------------------------------------'
1 ' ------------------------------------------------------------------------------'

1 '------------------------'
20000 'Subrutina definiendo nuestro sprite'
1 '------------------------'
1' Nuestro enemiho será un rectágulo verde
20010 copy (238,0)-(238+ew,eh),1 to (ex, ey),0   
20020 return

1 '------------------------'
21000 'Subrutinas mover enemigo'
1 '------------------------'
    1 ' El 238 y el 0 es la posición que tiene el enemigo en el screen 1, ver openmsx debugger->vdp'
    21020 copy (238,0)-(238+ew,eh),1 to (ex, ey),0 
21030 return






199999 end




Evitar el rastro

Para evitar el rastro copiaremos un trozo trasparente más grande que nuestra imagen antes de pintarla, psaremos la actualización del player a los cursores y en la colisión:



1 ' Programa MSX Murcia 2020 / Program MSX Murcia 
1 ' MSX Basic'
1 ' Inicialización de 0-500 (Inicialización player e incialización enemigos está en 10000 y 20000)
1 ' Main de 1000-2000'
1 ' 5000-10000 Rutinas generales: sistema renderizado, captura teclado,etc ' 
1 ' Rutinas jugador 10000-20000'
1 ' Rutinas enemigo 20000-30000'


1 ' ----------------------'
1 '   Pantalla presentación
1 ' ----------------------'
10 screen 0
20 color 11,1,1
30 locate 1,10
40 print chr$(215)" Tienes que recoger todos los virus antes de que se desintegre el traje, presione enter/return"
50 locate 1,20
60 for i=0 to 7: vpoke base(2)+(63*8)+i,0:next i
70 input " ";a$

1 '------------------------'
1 '     Inicializando'
1 '------------------------'
1 ' Borramos la pantalla'
80 cls
1 ' Lo 1 es definir el color de caracteres blanco, fondo y margen
90 color 15,7,7
1 ' Lo 2 es comfigurar la pantalla con screen modo_video, tamaño_sprites'
1 ' el tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16x16 x), 3 (16x16px) ampliado'
100 screen 5,2
1 ' Desactivamos el sonido de las teclas
110 key off
1' Defimos a basic que haga que las variables de empiezan desde la a a la z sean enteras de 16 bits, en lugar de las de 32 que asigna por defecto
120 defint a-z
1 ' parámteros personaje, posición x e y, anho  24y alto35
130 let px=10: let py=20: let pw=24: let ph=35
1 'Parametros para ayudarnos a dibjar el sprite, personaje fila y personaje columna (hay que ver el dibujo) y contador columna para hacer la animacion'
140 let pf=0: let pc=0: cc=0
1 ' Parametros de Vida y de coputras 
150 pv=100: pc=0
1 ' parámetros enemigo'
150 let ex=150: let ey=100: let ew=18: let eh=18




1 '------------------------'
1 '       main'
1 '------------------------'
1 ' Creamos un flujo para poder pintar en la pantalla, esto afectará a los input y print que tenga #numero'
1000 open "grp:" for output as #1
1 ' Subrutina cargar screen 1
1030 gosub 8000
1 ' Subrutina pintar screen 0'
1040 gosub 9000
1 'Subrutina cargar rectángulo personaje'
1050 gosub 10000
1 'Subrutina cargar enemigo'
1060 gosub 20000
1 ' Subrutina mostrar información del juego'
1070 gosub 7000
1 ' Sistema de renderer'
1080 gosub 2000

   





 
1 '-----------------------------------------------------------------'
1 '---------------------General rutines------------------------------'
1 '-----------------------------------------------------------------'






1 ' ----------------------'
1 '   Sistema de renderer
1 ' ----------------------'

1' Inicio blucle
    1 ' Borramos la pantalla'
    2000 'cls
    1 'Llamamos a la subrutina pintar personaje'
    2050 'gosub 10500
    1 ' LLamamos a la subrutina pintar enemigo'
    2060 'gosub 21000
    1 ' Llamamos a la subrutina de los cursores / joystick
    2070 gosub 6000 
    1 'Rutina comprobar colosiones'
    2080 gosub 5000
    1 'Rutina mostrar información juego'
    2090 'gosub 7000
 1 ' El goto es como una especie de while para que vuelva  capturar el teclado y dibujar'
2100 goto 2000
2110 return








1 ' ----------------------'
1 '   Sistema de colisiones
1 ' ----------------------'

1 'Rutina comprobar colisiones https://developer.mozilla.org/es/docs/Games/Techniques/2D_collision_detection'
5000 if px < ex + ew and  px + pw > ex and py < ey + eh and ph + py > ey then gosub 5100 
5020 return

1 ' ----------------------'
1 '   Rutina de colisión
1 ' ----------------------'
1'Rutina colosión
    5100 ex=(rnd(-time)*256)-ew
    5110 ey=(rnd(-time)*210)-eh
    5130 pc=pc+1
    5140 cls
    1 ' subrutina pintar información en pantalla
    5150 gosub 7000
    1 ' Llamamos a la subrutina pintar personaje'
    5160 gosub 10500
    1 ' LLamamos a la subrutina pintar enemigo'
    5170 gosub 21000
5180 return




1 ' ----------------------'
6000 'Subrutina captura movimiento joystick / cursores y boton de disparo'
1 ' ----------------------'
    1'1 Arriba, 2 arriba derecha, 3 derecha, 4 abajo derecha, 5 abajo, 6 abajo izquierda, 7 izquierda, 8 izquierda arriba
    6010 j=stick(0)
    6020 if j=3 then  gosub 11050
    6030 if j=7 then  gosub 11090
    6040 if j=1 then  gosub 11130
    6050 if j=5 then  gosub 11170
6080 return

1 ' ----------------------'
1 '   Mostrar información
1 ' ----------------------'
    1 ' Pintamos un rectangulo en la parte superior de la pantalla', color 14 gris claro, bf es un rectangulo relleno
    7000 line (0,0)-(256, 10), 14, bf
    7010 preset (10,0)
    7020 print #1, chr$(215)"  Vida: "pv", capturas: "pc
7030 return

1 ' Subrutina cargar screen 1'
    8000 DATA 0,0,0,2,1,0,2,2,2,4,1,1,1,3,3,4,3,2,1,4,4,6,2,1
    8010 DATA 5,4,1,4,4,4,0,5,5,6,5,1,5,5,5,6,5,4,6,6,6,7,7,7
    8020 FOR C=0 TO 15:READ R,G,B:COLOR=(C,R,G,B):NEXT
    8030 BLOAD"SCREEN1.SC5",S,32768
    8040 color=restore
8050 return

1 'Pintar pantalla'
9000 for i=0 to 180 step 18
    9010 copy (0,192)-(18,210),1 to (i, 18*i),0
9020 next i

9100 return







1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas player --------------------------------------'
1 ' ------------------------------------------------------------------------------'


1 '------------------------'
10000 'Subrutina inicializar nuestro sprite'
1 '------------------------'
1' Ponemos los atriutos a sus valores por defecto
    10010 px=20:py=20
    1' MIrando a la izquierda será la fila 2, a la drecha la fila 3 y arriba la fila 3
    10020 copy (pc*pw,pf*ph)-((pc*pw)+pw,(pf*ph)+ph),1 to (px, py),0
10990 return



1 '------------------------'
1 'Subrutina actualizar player'
1 '------------------------'
    1 'copiamos un trozo de la pantalla transparente para evitar que hayan rastros, el 10 es el margen
    10500 copy (200,100)-(200+pw+10,100+ph+10),1 to (px-5,py-5),0
    10600 copy (cc*pw,pf*ph)-((cc*pw)+pw,(pf*ph)+ph),1 to (px, py),0
10650 return





1 '------------------------'
11040 'Subrutinas mover '
1 '------------------------'
1 'Mover derecha
    11050 px=px+5
    11060 pf=2
    11065 cc=cc+1
    11070 if cc>3 then cc=0
    11075 if px>=256-pw then px=256-pw
    11076 pv=pv-1
    11077 gosub 10500
11080 return
 1 ' Mover izquierda'
    11090 px=px-5
    11100 pf=1
    11105 cc=cc+1
    11110 if cc>3 then cc=0
    11115 if px<0 then px=0
    11116 pv=pv-1
    11117 gosub 10500
11120 return
1 ' Mover arriba
    11130 py=py-5
    11140 pf=3
    11145 cc=cc+1
    11150 if cc>3 then cc=0
    11155 if py<=0 then py=0
    11156 pv=pv-1
    11157 gosub 10500
11160 return
1 ' Mover abajo'
    11170 py=py+5
    11180 pf=0
    11185 cc=cc+1
    11186 if cc>3 then cc=0
    11187 if py >=212-ph then py=212-ph
    11188 pv=pv-1
    11189 gosub 10500
11190 return


1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas revtágulo enemigo --------------------------------------'
1 ' ------------------------------------------------------------------------------'

1 '------------------------'
20000 'Subrutina definiendo nuestro sprite'
1 '------------------------'
1' Nuestro enemiho será un rectágulo verde
20010 copy (238,0)-(238+ew,eh),1 to (ex, ey),0   
20020 return

1 '------------------------'
21000 'Subrutinas mover enemigo'
1 '------------------------'
    1 ' El 238 y el 0 es la posición que tiene el enemigo en el screen 1, ver openmsx debugger->vdp'
    21020 copy (238,0)-(238+ew,eh),1 to (ex, ey),0 
21030 return






199999 end


Colisiones entre sprites y plantilla de primer juego

Mueve los cursores para acercar un sprite al otro, cuando se choquen sonará un beep






1 ' Programa MSX Murcia 2020 / Program MSX Murcia 
1 ' MSX Basic'
1 ' Inicialización de 0-500 (Inicialización player e incialización enemigos está en 10000 y 20000)
1 ' Main de 1000-2000'
1 ' 5000-10000 Rutinas generales: sistema renderizado, captura teclado,etc ' 
1 ' Rutinas jugador 10000-20000'
1 ' Rutinas enemigo 20000-30000'

1 ' Variables'
1 ' a= utilizada para la lectura de data'
1 ' a$= utilizada para la lectura de data'

1 ' ----------------------'
1 '   Pantalla 1 
1 ' ----------------------'
1' Mensaje
10 screen 0
20 color 11,1,1
30 locate 1,10
40 print " Ejemplo colisiones"
50 clear 500
70 for i=0 to 2000: next i


1 ' Borramos la pantalla'
80 cls
1 ' Lo 1 es definir el color de caracteres blanco, fondo y margen
90 color 15,4,7
1 ' Lo 2 es comfigurar la pantalla con screen modo_video, tamaño_sprites'
1 ' el tamaño_sprite puede ser 0 (8x8px), 1 (8x8px ampliado), 2 (16x16 x), 3 (16x16px) ampliado'
100 screen 5,2
1 ' Desactivamos el sonido de las teclas
110 key off
1' Defimos a basic que haga que las variables de empiezan desde la a a la z sean enteras de 16 bits, en lugar de las de 32 que asigna por defecto
120 defint a-z
1 ' Cunado haya una colision de 2 sprites ve a la línea..'
130 on sprite gosub 5100

1 ' Cuando se pulse la barra espaciadora ve a la línea..'
150 on strig gosub 5100
1 ' con el 0 le decimos que es la barra espaciadora y no los botones de los joystick'
160 strig(0) on







1 '------------------------'
1 '       main'
1 '------------------------'
1 ' Creamos un flujo para poder pintar en la pantalla, esto afectará a los input y print que tenga #numero'
1000 open "grp:" for output as #1

1 'Subrutina inicializar personaje'
1050 gosub 10000
1 'Subrutina inicializar enemigo'
1060 gosub 20000
1 ' Subrutina mostrar información del juego'
1070 'gosub 7000
1 ' Sistema de renderer'
1080 gosub 2000


   





 
1 '-----------------------------------------------------------------'
1 '---------------------General rutines------------------------------'
1 '-----------------------------------------------------------------'






1 ' ----------------------'
1 '   Sistema de renderer
1 ' ----------------------'

1' Inicio blucle
    1 ' actualizar player'
    2000 gosub 10500
    1 ' actualizar enemigo'
    2060 gosub 21000
    1 ' chqueo de teclado
    2070 gosub 6000 
    1 ' Chequeo de colosiones'
    2080 'gosub 5000
    1 ' Mostrar información juego'
    2090 'gosub 7000
 1 ' El goto es como una especie de while para que vuelva  capturar el teclado y dibujar'
2100 goto 2000
2110 return








1 ' ----------------------'
1 '   Sistema de colisiones
1 ' ----------------------'

1 ' Subrutina comprobar colisiones 
1 ' Si colisiona sonará un pitido'
5000 'on sprite gosub 5100

5020 return

1 ' ----------------------'
1 '   Rutina de colisión
1 ' ----------------------'
1'Rutina colosión
    5100 beep
    5110 'SOUND 0,0:SOUND 7,198:SOUND 8,16:SOUND 12,2:SOUND 13,3
    5120 sprite off
5160 return




1 ' ----------------------'
1 'Subrutina captura movimiento joystick / cursores y boton de disparo'
1 ' ----------------------'
    1'1 Arriba 11300, 2 arriba derecha, 3 derecha 11000, 4 abajo derecha, 5 abajo 11200, 6 abajo izquierda 11100, 7 izquierda, 8 izquierda arriba
    6000 on stick(0) gosub 11300, 6000, 11000,6000,11200,6000,11100: sprite on
    6010 'k=stick(0) 
    6020 'if k=3 then gosub 11000: sprite on
    6030 'if k=7 then gosub 11100: sprite on
    6040 'if k=5 then gosub 11200: sprite on
    6050 'if k=1 then gosub 11300: sprite on
6080 return

1 ' ----------------------'
1 '   Mostrar información
1 ' ----------------------'
    1 ' Pintamos un rectangulo en la parte superior de la pantalla', color 14 gris claro, bf es un rectangulo relleno
    7000 line (0,0)-(256, 10), 14, bf
    7010 preset (10,0)
    7020 print #1, chr$(215)"  Vida: "pv", capturas: "pc
7030 return








1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas player --------------------------------------'
1 ' ------------------------------------------------------------------------------'


1 '------------------------'
1 'Subrutina inicializar player'
1 '------------------------'
1' Ponemos la  posición en x, y , ancho y alto, ps=player sprite, pp=player plano, pv=player velocidad
    10000 px=20:py=20:pw=16:ph=16:ps=0:pp=0:pv=5

    1 ' Para poder almacenar los sprites antes hemos tenido que poner clear 500, ya que basic solo reserba 300 bytes para los strings'
    10020 restore 10110
   

    10030 for i=0 to 3
        10040 k$=""
        10050 for j=0 to 32-1
            10060 read a
            10070 k$=k$+chr$(a)
        10080 next j
        10090 sprite$(i)=k$
    10100 next i


    10110 DATA 0,1,1,1,1,1,1,1
    10120 DATA 1,1,1,1,1,1,1,1
    10130 DATA 0,128,128,128,192,192,192,192
    10140 DATA 240,192,192,192,192,192,192,224 

    10150 DATA 0,3,3,3,7,7,7,7
    10160 DATA 31,7,3,3,3,3,3,7
    10170 DATA 0,0,0,0,0,0,0,0
    10180 DATA 0,0,0,0,0,0,0,0

    10190 DATA 1,1,1,0,1,3,3,3
    10200 DATA 3,1,1,1,1,1,1,1
    10210 DATA 192,192,192,128,192,224,224,224
    10220 DATA 224,192,192,192,64,64,64,64

    10230 DATA 0,1,1,1,3,7,7,7
    10240 DATA 7,3,1,1,1,1,1,3
    10250 DATA 0,192,192,192,224,240,240,240
    10260 DATA 240,224,192,192,64,64,64,96

    
    10300 for i=0 to 3
        10310 k$=""
        10320 for j=0 to 16-1
            10330 read a
            10340 k$=k$+chr$(a)
        10350 next j
        10360 color sprite$(i)=k$
    10370 next i

    10380 DATA 15,10,10,10,9,9,9,9
    10390 DATA 9,9,2,2,2,2,2,9

    10400 DATA 15,10,10,10,9,9,9,9
    10410 DATA 9,9,2,2,2,2,2,9

    10420 DATA 15,10,10,10,9,9,9,9
    10430 DATA 9,9,2,2,2,2,2,9

    10440 DATA 15,10,10,10,9,9,9,9
    10450 DATA 9,9,2,2,2,2,2,9
10990 return






1 '------------------------'
1 'Subrutina actualizar player'
1 '------------------------'
    10500 put sprite ps,(px,py),,pp
10550 return





1 '------------------------'
1 'Subrutinas mover '
1 '------------------------'
1 'Mover derecha
    11000 px=px+pv
    11010 pp=0
    11040 if px>=256-pw then px=256-pw
 
11060 return
 1 ' Mover izquierda'
    11100 px=px-pv
    11120 pp=1
    11150 if px<0 then px=0

11170 return
1 ' Mover abajo'
    11200 py=py+pv
    11210 pp=2
    11240 if py >=212-ph then py=212-ph

11260 return
1 ' Mover arriba
    11300 py=py-pv
    11310 pp=3
    11340 if py<=0 then py=0

11360 return


1 ' ------------------------------------------------------------------------------'
1 ' ----------------Rutinas enemigo --------------------------------------'
1 ' ------------------------------------------------------------------------------'

1 '------------------------'
1 'Inicialización de enemigo'
1 '------------------------'
1' Ponemos la  posición en x, y , ancho y alto, ps=player sprite
    20000 ex=100:ey=100:ew=16:eh=16:es=1:ev=5
    20010 restore 20090
    20020 k$=""
    20030 for i=0 to 32-1
        20040 read a
        20050 k$=k$+chr$(a)
    20060 next i
    1 ' Lo colcamos en la posición 5 de la tabla de definiciones de sprites, los otros 4 eran para el player'
    20070 sprite$(4)=k$

    20090 DATA 56,40,56,16,56,254,56,56
    20100 DATA 56,56,40,40,40,40,40,108
    20110 DATA 0,0,0,0,0,0,0,0
    20120 DATA 0,0,0,0,0,0,0,0

    20200 k$=""
    20210 for i=0 to 16-1
        20220 read a
        20230 k$=k$+chr$(a)
    20240 next i
    20250 color sprite$(es)=k$
    20260 DATA 13,10,10,10,9,9,9,9
    20270 DATA 9,9,2,2,2,2,2,9

20990 return


1 '------------------------'
21000 'Subrutinas mover enemigo'
1 '------------------------'
    1 'nasd
    21020 put sprite es,(ex,ey),,es 
21030 return

199999 end


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *