Basic - un conejo en problemas

 
Vista:

un conejo en problemas

Publicado por Diego (2 intervenciones) el 22/11/2005 19:44:37
Hola gente. Mucho gusto. Mi nombre es Diego y doy mis primeros pasos
en esto de qbasic y de la programación en general. Intento hacer un
jueguito básico estilo "ping" pero hace días que estoy trancado. Me
gustaría saber cómo hacer para decirle a la máquina que realice dos
tareas simultáneamente: mover el conejo cuando se le pide y mover
una pelota en forma constante y siguiendo una recta pero que ésta sea
aleatoria, de manera tal que tenga como posibles destinos 3 puntos
en la parte superior de la pantalla y vuelva hacia la parte inferior.
Mi manejo de comandos es demasiado limitado y todavía no he entrado
en la lógica de todo esto. Se aceptan consejos, advertencias, risas,
alternativas y rezongos. Todo será bienvenido. Abajo adjunto el código
que llevo hecho hasta el momento, bastante desordenado y puede que
con cosas que serían más sencillas hechas de otra manera. En fin,
no pido SOLUCIONES sino AYUDA. Hasta el momento, nuestro personaje,
un conejo simpático, logra moverse en tres posiciones pero poco más,
y no saben lo aburrido que se me hace estar unos minutos moviendo
al bicho de aquí para allá sin más :(. Muchas gracias por todo y muy
bueno el sitio.



DECLARE SUB Pantalla ()

CLEAR , , 10000
SCREEN 7

CALL Pantalla

MifiIzq:
PCOPY 1, 0
KEY(12) ON
KEY(13) ON
ON KEY(12) GOSUB MifiDer
ON KEY(13) GOSUB MifiCen
DO
LOOP UNTIL INKEY$ = CHR$(27)
GOTO 4

MifiCen:
PCOPY 2, 0
KEY(12) ON
KEY(13) ON
ON KEY(12) GOSUB MifiIzq
ON KEY(13) GOSUB MifiDer
DO
LOOP UNTIL INKEY$ = CHR$(27)
GOTO 4

MifiDer:
PCOPY 3, 0
KEY(12) ON
KEY(13) ON
ON KEY(12) GOSUB MifiCen
ON KEY(13) GOSUB MifiIzq
DO
LOOP UNTIL INKEY$ = CHR$(27)

4
END

SUB Pantalla
izq = 20
der = 50
sup = 175
inf = 190
boca$ = "c2 e3"
boca2$ = "c2 h3"

SCREEN 7, 0, 1, 0
LINE (izq!, sup!)-(der!, inf!), 15, BF
DRAW "bm34, 188" + boca$
DRAW "bm37, 188" + boca2$
CIRCLE (26!, 180!), 2!, 2
CIRCLE STEP(18!, 0!), 2!, 2
SCREEN 7, 0, 2, 0
LINE (izq + 100!, sup!)-(der + 100!, inf!), 15, BF
DRAW "bm134,188" + boca$
DRAW "bm137,188" + boca2$
CIRCLE (126!, 180!), 2!, 2
CIRCLE STEP(18!, 0!), 2!, 2
SCREEN 7, 0, 3, 0
LINE (izq + 200!, sup!)-(der + 200!, inf!), 15, BF
DRAW "bm234,188" + boca$
8 DRAW "bm237,188" + boca2$
CIRCLE (226!, 180!), 2!, 2
CIRCLE STEP(18!, 0!), 2!, 2

END SUB
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:un conejo en problemas

Publicado por Antoni (1 intervención) el 22/11/2005 23:32:59
¿Que tal, Diego?
Esto de los juegos todo es empezar. Unos consejos:
Para que todo funcione simultáneamente hay que hacer las cosas una a continuación de la otra muy rápido.
Si haces un GOSUB, JAMÁS olvides de salir de él con un RETURN, si no tendrás muchos problemas.
No utilices onKey en un programa de juegos, es preferible usar INKEY$ que comprueba el teclado pero no detiene la ejecución del programa.
Lo normal en un juego es en un bucle muy rápido leer el teclado, hacer todos los cálculos y finalmente redibujar la pantalla.
Para que todo sea rápido debes evitar redibujar cada vez tus "sprites" (el conejo). Aprende a usar GET y PUT, con ellos podrás dibujar tus personajes al principio del programa, guardarlos en una variable y pegarlos donde los necesites en una sola instrucción.

Aquí tienes un borrador muy malo de lo que podría ser tu programa. Si tienes curiosidad por algo, preguntame.

[code]
avanceconejo = 5
izq = 20
der = 50
anchoconejo = der - izq+1
minconejo = avanceconejo
maxconejo = anchopantalla - anchoconejo - avanceconejo
sup = 175
inf = 190

'creamos un array para guardar el conejo ya dibujado
DIM conejo((anchoconejo) * (inf - sup + 1) + 4)
GOSUB dibujaconejo

'posicion inicial del conejo
posconejo = 140
'posicion inicial de la bola
bolax = 160
bolay = 5
'velocidad inicial de la bola (aleatoria)
bolavx = RND * 3 - 1.5
bolavy = 1

gosub refrescapantalla

'bucle principal ----------------------------------------

'indicador de que la bola ha salido fuera
fuera = 0
DO
'
'leemos teclado y convertimos a mayúsculas
a$ = UCASE$(INKEY$)
'
'si se ha pulsado una tecla, movemos la posicion del conejo
IF LEN(a$) THEN GOSUB mueveconejo
'
'de todos modos movemos la posicion de la bola
GOSUB muevebola
'
'con las posiciones de la bola y el conejo, dibujamos la pantalla
GOSUB refrescapantalla
'
'terminamos si el usuario pulsa escape o la bola va fuera
LOOP UNTIL fuera = 1 OR a$ = CHR$(27)

'fin del bucle principal----------------------------------
END

dibujaconejo:
'dibujamos el conejo (tu código)

boca$ = "c2 e3"
boca2$ = "c2 h3"
LINE (izq, sup)-(der, inf), 15, BF
DRAW "bm34, 188" + boca$
DRAW "bm37, 188" + boca2$
CIRCLE (26, 180), 2, 2
CIRCLE STEP(18, 0), 2, 2
'lo guardamos en un array llamdo conejo
GET (izq, sup)-(der, inf), conejo(0)
cls
RETURN

mueveconejo:
'movemos el conejo de acuerdo con las teclas X e Y, evitando que salga de pantalla
IF a$ = "Z" THEN IF posconejo >= minconejo THEN posconejo = posconejo - avanceconejo
IF a$ = "X" THEN IF posconejo <= maxconejo THEN posconejo = posconejo + avanceconejo
RETURN

muevebola:
'movemos la bola
bolax = bolax + bolavx
bolay = bolay + bolavy
'comprobamos rebotes izq,der, arriba. Rebotar es invertir uno de los componentes de la velocidad
IF bolax <= radiobola THEN bolax = radiobola: bolavx = -bolavx
IF bolax >= anchopantalla - radiobola THEN bolax = anchopantalla - radiobola: bolavx = -bolavx
IF bolay <= radiobola THEN bolay = radiobola: bolavy = -bolavy
'comprobamos salida por la parte inferior
IF bolay >= altopantalla - radiobola THEN fuera = 1: RETURN
'comprobamos rebote en el conejo
IF bolay >= sup AND bolax > posconejo AND bolax < posconejo + anchoconejo THEN bolay = sup: bolavy = -bolavy
RETURN

refrescapantalla:

'borramos pantalla de trabajo
CLS

'colocamos el conejo que teniamos guardado
PUT (posconejo, sup), conejo(0)

'dibujamos la bola
CIRCLE (bolax, bolay), radiobola

'esperamos el retrazo del monitor: disminuye parpadeo y mantiene la velocidad
WAIT &H3DA, 8

'intercambiamos pantallas
SWAP vscreen, wscreen
SCREEN 7, , vscreen, wscreen
RETURN
[/code]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:un conejo en problemas

Publicado por Diego (2 intervenciones) el 22/11/2005 23:57:53
Antoni. Muchísimas gracias por tomarte ese tiempo!. Voy a intentar seguir tus consejos. Es verdad que el put y el get todavía no sé usarlos. Veré si me ayuda la guía de qbasic. Supongo que todo el código que me mandaste también me servirá de ayuda. Te agradezco de nuevo por la atención que le prestaste a mi nota. Un saludo. Diego.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar