Archivos amenaza.zip amenaza2.zip, rectangulos.zip, cosionesdesprites.zip
Juega desde aquí: http://msx.tipolisto.es/webmsx/standalone/?disk=files/amenaza.dsk
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