Manejando caracteres
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Manejando caracteres
Buenas tardes.
Estoy empezando con basic ,por eso de la nostalgia jejejej
Estoy atascado a la hora de mover dos caracteres en pantalla a la misma vez, he probado todas las maneras posibles que yo conozco, que no son muchas... tag,for,move.... si me podeis echar una mano,gracias de antemano.
no tengo ni idea de programacion.
Estoy empezando con basic ,por eso de la nostalgia jejejej
Estoy atascado a la hora de mover dos caracteres en pantalla a la misma vez, he probado todas las maneras posibles que yo conozco, que no son muchas... tag,for,move.... si me podeis echar una mano,gracias de antemano.
no tengo ni idea de programacion.
Re: problema con basic
Buenas, Carrasco. Y bienvenido.
¿Has probado a tratar los dos caracteres como uno solo y hacer los movimientos de esa manera?
Si los quieres mover a una posición de texto, tendrías que hacer primero un LOCATE (para posicionarte) y luego un PRINT.
Si a$="A" y b$ ="B" y los quieres pintar uno detrás de otro en (1,1) harías:
10 LOCATE 1,1
20 PRINT a$;b$
¿Has probado a tratar los dos caracteres como uno solo y hacer los movimientos de esa manera?
Si los quieres mover a una posición de texto, tendrías que hacer primero un LOCATE (para posicionarte) y luego un PRINT.
Si a$="A" y b$ ="B" y los quieres pintar uno detrás de otro en (1,1) harías:
10 LOCATE 1,1
20 PRINT a$;b$
Salu2,
Arta
Arta
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
gracias
el caso es que tengo ya las condiciones para el movimiento del cursor y los botones asignados , y se mueve
tengo .otro caracter en espera y mientras muevo uno. el otro no responde y viceversa. hay alguna forma para solucionarlo?
es para un juego de naves. otra cosa el disparo. esta echo de la siguiente forma
pongo inkey$ la condicion para tecla z y le meto un goto y dos for uno dibuja el disparo y otro lo borra. y gracias de nuevo
el caso es que tengo ya las condiciones para el movimiento del cursor y los botones asignados , y se mueve
tengo .otro caracter en espera y mientras muevo uno. el otro no responde y viceversa. hay alguna forma para solucionarlo?
es para un juego de naves. otra cosa el disparo. esta echo de la siguiente forma
pongo inkey$ la condicion para tecla z y le meto un goto y dos for uno dibuja el disparo y otro lo borra. y gracias de nuevo
Re: problema con basic
Para que te respondan los dos deberías meter dentro del mismo bucle el chequeo de ambos movimientos. Al final lo que hay que hacer es engañar al jugador dando sensación de simultaneidad pero como eso no es posible, se hace de forma secuencial. Yo haría algo así:gracias
el caso es que tengo ya las condiciones para el movimiento del cursor y los botones asignados , y se mueve
tengo .otro caracter en espera y mientras muevo uno. el otro no responde y viceversa. hay alguna forma para solucionarlo?
es para un juego de naves. otra cosa el disparo. esta echo de la siguiente forma
pongo inkey$ la condicion para tecla z y le meto un goto y dos for uno dibuja el disparo y otro lo borra. y gracias de nuevo
0. inicio
1. chequeo teclas jugador 1
2. chequeo teclas jugador 2
3. actualización de los sprites
4. actualización y dibujado del disparo
5. chequeo de colisión.
6. vuelta al inicio
Otra cosilla, procura no usar GOTO, mucho mejor GOSUB y con RETURN vuelve donde se produjo el salto. Así vas a tener el código mucho más limpio y fácil de seguir
Salu2,
Arta
Arta
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
10 symbol "
20 symbo "
30 symbol"
40 disparo$=chr$(240)
50nave$=chr$(241)
60 malo$=chr$(242)
70 cordenadas nave
80 x=14:y=20
90 codenada malo$
100 z=4:v=6
110 pinto nave
120 locate x,y:print nave$
130 teca$=inkey: if tecla$=""then goto 130
140 if tecla$="," then x=x-1
150 if tecla$="."then x=x+1
160 if tecla$="z" then gosub 300
170 goto 120
300locate x,y
310 for a =19 to 1 step-1
320 locate x,a:print disparo$
330 next
340 return
esta es mas o menos ,la rutina
aver si me puedes decir, donde empiezo la rutina del malo$=chr$(240) y que patron puede seguir? y gracias por todo
20 symbo "
30 symbol"
40 disparo$=chr$(240)
50nave$=chr$(241)
60 malo$=chr$(242)
70 cordenadas nave
80 x=14:y=20
90 codenada malo$
100 z=4:v=6
110 pinto nave
120 locate x,y:print nave$
130 teca$=inkey: if tecla$=""then goto 130
140 if tecla$="," then x=x-1
150 if tecla$="."then x=x+1
160 if tecla$="z" then gosub 300
170 goto 120
300locate x,y
310 for a =19 to 1 step-1
320 locate x,a:print disparo$
330 next
340 return
esta es mas o menos ,la rutina
aver si me puedes decir, donde empiezo la rutina del malo$=chr$(240) y que patron puede seguir? y gracias por todo
Re: problema con basic
Yo haría algo como esto:
Ojo que no lo he probado, lo he hecho a ojo pero de esta forma todo se mueve en paralelo
Código: Seleccionar todo
40 disparo$=chr$(240)
50 nave$=chr$(241)
60 malo$=chr$(242)
70 rem cordenadas nave
80 x=14:y=20
90 rem codenada malo$
100 z=4:v=6
120 rem bucle principal
130 tecla$=inkey:
140 if tecla$="," then x=x-1
150 if tecla$="."then x=x+1
160 if tecla$="z" then gosub 300
165 gosub 400: rem Actualiza la posicion del enemigo
170 gosub 500: rem Pinta la nave
180 gosub 600: rem Pinta el enemigo
190 gosub 700: rem Pinta el disparo
250 goto 120
300 rem rutina disparo. Solo un disparo a la vez!
305 if disparo=0 then disparo=1:dx=x
340 return
400 rutina movimiento enemigo
410 if z>1 and zx=-1 then z=z-1 else zx=1
420 if z<40 and zx=1 then z=z+1 else zx=-1
500 rem rutina pintar nave
510 locate x,y:print nave$
520 return
600 rem rutina pintar enemigo
610 locate z,v:print enemigo$
600 return
700 rem rutina pintar disparo
705 if disparo=0 then return
710 locate dx,a:print disparo$
720 return
800 rem rutina movimiento disparo
810 if disparo=1 then if a>1 then a=a-1 else disparo=0
820 return
Salu2,
Arta
Arta
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
muchisimas gracias
mañana lo pruebo y te comento
de toda formas si no funciona tu ejemplo, ideas me dara
gracias de nuevo por las molestias
mañana lo pruebo y te comento
de toda formas si no funciona tu ejemplo, ideas me dara
gracias de nuevo por las molestias
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
Buenas, funciona todo , menos el disparo creo que el error esta en el valor a
le pondre mas valores y mas enemigos , algun sonido un caracter mas para la explosion
y me liare con la orden test , para los colores
aver que me sale jejeje
saludos
le pondre mas valores y mas enemigos , algun sonido un caracter mas para la explosion
y me liare con la orden test , para los colores
aver que me sale jejeje
saludos
Re: problema con basic
Buenas, te contesto en público al privado que así puede ayudar a más gente.
Para detectar la colisión entre el disparo y el enemigo (o la nave) tendrías que comprobar las coordenadas de ambos objetos y, si coinciden, dar paso a la rutina de explosión.
La detección de colisión que he metido es muy sencilla. Solo si coinciden las coordenadas. Lo suyo es comprobar de otra forma, por rectángulos, por ejemplo. Si las coordenadas del disparo están dentro del enemigo entonces PUM!!
Para detectar la colisión entre el disparo y el enemigo (o la nave) tendrías que comprobar las coordenadas de ambos objetos y, si coinciden, dar paso a la rutina de explosión.
Código: Seleccionar todo
40 disparo$=chr$(240)
50 nave$=chr$(241)
60 malo$=chr$(242)
70 rem cordenadas nave
80 x=14:y=20
90 rem codenada malo$
100 z=4:v=6
120 rem bucle principal
130 tecla$=inkey:
140 if tecla$="," then x=x-1
150 if tecla$="."then x=x+1
160 if tecla$="z" then gosub 300
165 gosub 400: rem Actualiza la posicion del enemigo
170 gosub 500: rem Pinta la nave
180 gosub 600: rem Pinta el enemigo
190 gosub 700: rem Pinta el disparo
200 gosub 900: rem Deteccion colision
250 goto 120
300 rem rutina disparo. Solo un disparo a la vez!
305 if disparo=0 then disparo=1:dx=x
340 return
400 rutina movimiento enemigo
410 if z>1 and zx=-1 then z=z-1 else zx=1
420 if z<40 and zx=1 then z=z+1 else zx=-1
500 rem rutina pintar nave
510 locate x,y:print nave$
520 return
600 rem rutina pintar enemigo
610 locate z,v:print enemigo$
600 return
700 rem rutina pintar disparo
705 if disparo=0 then return
710 locate dx,a:print disparo$
720 return
800 rem rutina movimiento disparo
810 if disparo=1 then if a>1 then a=a-1 else disparo=0
820 return
900 rem rutina deteccion colision.
910 if z=dx and v=dy then gosub 1100
920 return
1100 rem hay colisión
1110 rem se dibuja explosicón....
1120 return
Salu2,
Arta
Arta
- ronaldo
- Forum Addict
- Mensajes: 358
- Registrado: Sab 14 Sep , 2013 9:31 pm
- Ubicación: Alicante
- Contactar:
Re: problema con basic
Hola, compañero carrasco79,
Justo hoy he publicado en el foro un par de enlaces a un blog que llevo con unos amigos donde estamos haciendo unos tutoriales de BASIC y unos proyectos. Creo que te puede ser muy útil lo que hemos publicado (en especial los ejemplos de los talleres) si no controlas mucho de programación. Aquí te dejo el enlace: Por otra parte, decirte que yo no usaría inkey$ para obtener caracteres del teclado en un juego, ya que los obtiene postprocesados. Eso significa que no puedes comprobar si se pulsan varias teclas a la vez (sólo obtienes la última pulsada), y, además, dependes de la configuración de repetición de pulsación de tecla para obtener nuevas pulsaciones. Lo mejor es utilizar la función inkey(). Aquí te pongo un ejemplo de como lo haría para comprobar si se han pulsado Z, X o espacio:
Puedes consultar la página 3/28 (107) del manual del Amstrad CPC 464 para ver cómo funciona inkey() con detalle y la página 4/23 (182) para ver los códigos de tecla y de joystick. Como inkey() devuelve -1 cuando una tecla no está pulsada, NOT INKEY() resulta FALSO. NOT INKEY() se hace cierto en cualquier supuesto en que la tecla sea pulsada (sea pulsando la tecla junto con mayus, control o ambos).
En los juegos que hemos hecho de ejemplo en nuestro blog puedes encontrar código que hace exactamente esto y ver cómo funciona. También tenemos una serie de artículos sobre dibujado de sprites en BASIC usando caracteres para sacarle el máximo rendimiento al BASIC.
Espero que te sea útil
Justo hoy he publicado en el foro un par de enlaces a un blog que llevo con unos amigos donde estamos haciendo unos tutoriales de BASIC y unos proyectos. Creo que te puede ser muy útil lo que hemos publicado (en especial los ejemplos de los talleres) si no controlas mucho de programación. Aquí te dejo el enlace: Por otra parte, decirte que yo no usaría inkey$ para obtener caracteres del teclado en un juego, ya que los obtiene postprocesados. Eso significa que no puedes comprobar si se pulsan varias teclas a la vez (sólo obtienes la última pulsada), y, además, dependes de la configuración de repetición de pulsación de tecla para obtener nuevas pulsaciones. Lo mejor es utilizar la función inkey(). Aquí te pongo un ejemplo de como lo haría para comprobar si se han pulsado Z, X o espacio:
Código: Seleccionar todo
[...]
1000 IF NOT INKEY(71) THEN GOSUB 2000: ' Si se pulsa Z, ir a subrutina en línea 2000
1010 IF NOT INKEY(63) THEN GOSUB 3000: ' Si se pulsa X, ir a 3000
1020 IF NOT INKEY(47) THEN GOSUB 4000: ' Si se pulsa Espacio, ir a 4000
[...]
En los juegos que hemos hecho de ejemplo en nuestro blog puedes encontrar código que hace exactamente esto y ver cómo funciona. También tenemos una serie de artículos sobre dibujado de sprites en BASIC usando caracteres para sacarle el máximo rendimiento al BASIC.
Espero que te sea útil
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
Hola y gracias ,de este verano no pasa, la espinita de un juego en basic, me la tengo que quitar
Expondré mis dudas y problemas y a ver ,si me echáis un cable .saludos
Expondré mis dudas y problemas y a ver ,si me echáis un cable .saludos
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
Tengo una duda , como no borrar el fondo al mover un carácter,
Re: problema con basic
Hola @carrasco79,
tienes varias formas de conseguirlo, pero para no reinventar la rueda, ya existe información sobre el tema en este mismo foro:
http://www.amstrad.es/forum/viewtopic.php?f=7&t=3163
Saludos
tienes varias formas de conseguirlo, pero para no reinventar la rueda, ya existe información sobre el tema en este mismo foro:
http://www.amstrad.es/forum/viewtopic.php?f=7&t=3163
Saludos
-
- Lechoncillo
- Mensajes: 17
- Registrado: Mar 26 Jun , 2012 3:34 pm
Re: problema con basic
Gracias. Pues me quedo igual
Yo estaba pensando en poner 2 caracteres , uno transparente y otro normal sobre puesto y tratarlos como uno solo, pero principal problema, es que no se como hacer uno transparente si me pones un ejemplo me seria de gran ayuda
Saludos
Yo estaba pensando en poner 2 caracteres , uno transparente y otro normal sobre puesto y tratarlos como uno solo, pero principal problema, es que no se como hacer uno transparente si me pones un ejemplo me seria de gran ayuda
Saludos
- ronaldo
- Forum Addict
- Mensajes: 358
- Registrado: Sab 14 Sep , 2013 9:31 pm
- Ubicación: Alicante
- Contactar:
Re: problema con basic
Los carácteres no se hacen transparentes. Lo que se hace es activar un modo de dibujado en pantalla en el que, al dibujarlos, se interpreta el fondo del caracter como transparente en lugar de como color de fondo. El modo se activa así:
El carácter 22 seguido del carácter 1 (CHR$(22)+CHR$(1)) son el comando que activa el modo transparente. Después de eso, pintamos en pantalla 2 caracteres en la misma posición (10,10) con distinto color y el segundo no borra al primero, como puedes ver.
Para desactivar el modo transparente, basta con hacer esto otro:
Tienes más información respecto a carácteres, definición y modo transparente en el blog de Fremos:
Código: Seleccionar todo
10 MODE 1
' Activar modo transparente
20 PRINT CHR$(22)+CHR$(1)
' Dibujar 2 caracteres en la misma posicion y ver que se entremezclan
30 LOCATE 10,10:PEN 2:PRINT CHR$(158);:LOCATE 10,10:PEN 3:PRINT CHR$(162);
Para desactivar el modo transparente, basta con hacer esto otro:
Código: Seleccionar todo
' Desactivar modo transparente
20 PRINT CHR$(22)+CHR$(0)
- Serie sprites con caracteres en BASIC: [1 / 3] [2 / 3] [3 / 3]
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |