Manejando caracteres

Programando el Amstrad en BASIC, C, etc.
carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Manejando caracteres

Mensajepor carrasco79 » Mar 26 Jun , 2012 4:13 pm

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.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: problema con basic

Mensajepor Artaburu » Mar 26 Jun , 2012 5:43 pm

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$
Salu2,
Arta

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Mar 26 Jun , 2012 6:02 pm

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

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: problema con basic

Mensajepor Artaburu » Mar 26 Jun , 2012 6:10 pm

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
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í:
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

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Mar 26 Jun , 2012 8:05 pm

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

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: problema con basic

Mensajepor Artaburu » Mar 26 Jun , 2012 9:18 pm

Yo haría algo como esto:

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
Ojo que no lo he probado, lo he hecho a ojo pero de esta forma todo se mueve en paralelo ;)
Salu2,
Arta

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Mar 26 Jun , 2012 9:39 pm

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

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Mié 27 Jun , 2012 6:32 pm

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

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: problema con basic

Mensajepor Artaburu » Mié 12 Sep , 2012 7:08 pm

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.

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
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!!
Salu2,
Arta

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: problema con basic

Mensajepor ronaldo » Mar 06 May , 2014 10:53 pm

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:

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
[...]
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 :)

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Lun 29 Jun , 2015 10:47 pm

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

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Dom 05 Jul , 2015 9:03 am

Tengo una duda , como no borrar el fondo al mover un carácter,

abalore
Forero habitual
Forero habitual
Mensajes: 152
Registrado: Dom 09 Jul , 2006 8:59 pm

Re: problema con basic

Mensajepor abalore » Dom 05 Jul , 2015 12:30 pm

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

carrasco79
Lechoncillo
Lechoncillo
Mensajes: 17
Registrado: Mar 26 Jun , 2012 3:34 pm

Re: problema con basic

Mensajepor carrasco79 » Dom 05 Jul , 2015 12:52 pm

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

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: problema con basic

Mensajepor ronaldo » Dom 05 Jul , 2015 1:12 pm

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í:

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);
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:

Código: Seleccionar todo

' Desactivar modo transparente
20 PRINT CHR$(22)+CHR$(0)
Tienes más información respecto a carácteres, definición y modo transparente en el blog de Fremos:


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic