Socorroooooo

Started by Futu-block, December 13, 2009, 08:59:19 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.


Futu-block

¿no os entra ganas de matarme  ;D ;D ;D?

otra cosa que me pasa es que mientras tengo pulsada una tecla avanza el personaje, me interesa que ande un poquirto, de forma de juego como la de track & field, de machaca botones...

con el BREAK; no me interrumpe ese proceso...
tendré que ponerlo en otro sitio o de otra forma, o hacer procesos a cada tecla y así rompo el proceso y tracatrá (o sea que funciona)

gracias josebita

Windgate

Para que ande a medida que aporreas la tecla _SPACE te puede servir algo como esto (No digo que sea la mejor solucion ni mucho menos):

PROCESS track_and_field ( )
PRIVATE
   int pulsacion = FALSE;
   int velocidad = 0;
BEGIN
   IF ( key ( _SPACE ) AND NOT pulsacion )
      pulsacion = TRUE;
      velocidad += 2;
   ELSEIF ( NOT key ( _SPACE ) AND pulsacion )
      pulsacion = FALSE;
   END
   x = x + velocidad;
   IF ( velocidad > 0 )
      velocidad--;
   END
   FRAME;
END


Es una solucion dependiente de los fps, ya que se acelera o decelera siempre 1 pixel/FRAME^2.

Tambien se podria limitar el maximo de velocidad.

La verdad es que nunca he programado un sistema como el que dices, seria cuestion de probar, si lo haces comenta resultados.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Futu-block

#48
Es para un menú de inicio, y medio lo tengo;

creo un proceso con una imagen por opcion, las meto en una variable que segun el valor nos muestra en el menú una opción...
que me lio, pongo una imagen mejor:


bueno, para que al darle pa bajo no me cree un bucle infinito y no se pare donde quiero, pruebo con dos procesos que mueran cuando se haya movido una opción del menú con este codigo:

[code language="bennu"]PROCESS sube()
BEGIN
   LOOP
      IF ( key (_UP) )
         IF (var_seleccion < 1)
            var_seleccion = 4;
            BREAK;
         END
         var_seleccion = var_seleccion - 1;
         BREAK;
      END
      FRAME;
   END
END[/code]
uno para subir y otro para bajar, pero como el buen BREAK me dice, se pierde el proceso una vez que mueve y ya no mueve mas, ¿quizas deberia ponerlo en un LOOP de otro proceso para que me corte el LOOP del proceso sube()?

aparte, el primer BREAK no afecta al segundo  si no se cumple la condición del primero ¿no?

y pa terminar, ¿el BREAK por lo que veo rompe el LOOP y no se vuelve a repetir a menos que llame al proceso ¿no?

ji ji ji

Windgate

Si, break sale del LOOP. El ejemplo que pones no lo entiendo bien, var_seleccion es GLOBAL? Cuanto vale al comenzar?

Lo unico que tengo claro es que tu ejemplo hace que el proceso subir ( ) muera tras reducir var_seleccion en 1 al pulsar UP la primera vez.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Aqui falta el típico código de "comprobar que se acaba de pulsar una tecla".
Pongo la "versión clásica":

int pulsada1,pulsada2;
int opcion, max_opcion;

loop
if (key(_up) and !pulsada1)
  if (opcion>0) opcion--; else opcion=max_opcion; end
  pulsada1=true;
end
if (!key(_up) and pulsada1) pulsada1=false; end
if (key(_down) and !pulsada2)
  if (opcion<max_opcion) opcion++; else opcion=0; end
  pulsada2=true;
end
if (!key(_down) and pulsada2) pulsada2=false; end

frame;
end

Es decir, creamos una variable por tecla que nos indica el estado de la tecla en el frame anterior. Si antes no estaba pulsada y ahora si, hacemos la accion e informamos de que la tecla está pulsada a partir de ahora. Si antes estaba pulsada y ahora no, pues lo indicamos.
Así no tienes que estar creando y destruyendo procesos continuamente.
El control de teclas usando un proceso externo que lo explique otro, yo me voy a dormir ^^U
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

si, esto es lo que quiero, lo estaba intentando pero me hacia falta echarle muuuuuuuchisimas horas para sacarlo, dado el nivel que tengo...  ;D

a probarlo...

SplinterGU

otra cosa, aunque ya creo es tarde... te faltaba el END del IF con el BREAK;

aca


IF (var_flecha == 1) //esta variable deberia declararla al principio
// es la que verifica si al pulsar la tecla correspondiente devuelve un valor que deberia ser true, aunque ahora mismo me da igual
x=x+5;
BREAK  //espero que con este break aqui funcione para que si dejas pulsada la tecla no siga funcionando...
END // << ESTE FALTABA
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

los end se me olvidan una mijita...


otra cosa que no termino de aclararme es con los temporizadores o los timers, me voy al wiki pero no puedo, está en ingles y no consigo sacar nada en claro:
[code language="bennu"]import "mod_timers"

Process Main()
Begin

    write_int(0,0,100,0,&timer[0]);

    Repeat
        frame;
    Until(key(_ESC))

End
[/code]

me rayo, alguien que me eche una manita???

Hokutoy

#54
Futublog no se que quieres hacer con el code que has pasteado pero para que funcione te falta algun import.
Este sí funciona.

import "mod_timers"
import "mod_key";
import "mod_text";

Process Main()
Begin

   write_int(0,0,100,0,&timer[0]);

   Repeat
       frame;
   Until(key(_ESC))

End


Para testear mejor hazte un prg plantilla con todos los imports.
Que duda tienes con los timers? Piensa en ellos como unos cronometro que puedes consultar o reiniciar a tu gusto.

Saludos

Futu-block

si, yo puedo pensar como tu quieras, pero como no lo comprenda y razone como que no lo entiendo...
ejemplo de lo que digo es que quité los otros import, para que sirve el mod_key y el mod_text??

lo que quiero hacer es que aparezca un enemigo (por ejemplo) con un graph aleatorio, cuando pase determinado tiempo (pongo 2 seg. por concretar) si no ha sido destruido cambie el graph, y evidentemente si ha sido destruido al 0.1 seg aparezca a los dos segundos de la primera aparición con otro graph...

a lo mejor estoy liando un poco la cosa, lo escribo en una especie de pseudo-codigo:

-crear el TIMERy empezar a contar;

-cada dos segundos:
- SI (enemigo es destruido o no existe)
--- crear enemigo graph(rand)
- SI NO
--- cambiar el graph a otro (rand)
- FIN

je je je, ojala programar fuera así, pero crearía un cacao que no veas (creo) aparte he querido resaltar o traducir la opcion IF, aunque eso no es lo que quiero, lo que quiero es saber manejar el TIMER

Hokutoy

#56
Quote from: Futublog on December 28, 2009, 10:11:50 AM
a lo mejor estoy liando un poco la cosa, lo escribo en una especie de pseudo-codigo:

crear el TIMERy empezar a contar;

-cada dos segundos:
- SI (enemigo es destruido o no existe)
--- crear enemigo graph(rand)
- SI NO
--- cambiar el graph a otro (rand)
- FIN

je je je, ojala programar fuera así, pero crearía un cacao que no veas (creo) aparte he querido resaltar o traducir la opcion IF, aunque eso no es lo que quiero, lo que quiero es saber manejar el TIMER

Los timers no hace falta crearlos... se crean solos al iniciar el programa y se ponen en marcha. Lo que si puedes hacer es reiniciarlos. Te contesto en pseudocodigo que si no uno nunca aprende  ;D

cronometro=0;
timer[0]=0; // Reiniciar timer
loop
if(timer[0]==100) cronometro++; timer[0]=0; end // un segundo ha pasado
if cronometro==2 cambio graph enemigo; cronometro=0;
if cronometro==2 and type enemigo no existe; enemigo(); cronometro=0

Espero que este cutre ejemplo te sirva para algo... quizá no es la mejor manera de hacerlo pero es una manera que te puede servir para aprender el uso.

Saludos!

PD: Hay por ahí un listado para que sirve cada "import" pero para el caso:
import "mod_key"; // para que funcione el Until(key(_ESC))
import "mod_text"; // para que funcione el write_int(0...


Futu-block

Lo unico que todavia no tengo claro es lo de ++, eso equivale a algo que no caigo - macuerdo...

Hokutoy

Quote from: Futublog on December 28, 2009, 11:10:04 AM
Lo unico que todavia no tengo claro es lo de ++, eso equivale a algo que no caigo - macuerdo...
CRONOMETRO++ EQUIVALE A CORNOMETRO=CRONOMETRO+1 Y TAMBIEN A CRONOMETRO+=1

Drumpi

Explicado de forma rápida, TIMER es un array de 10 posiciones (desde TIMER[0] a TIMER[9]) que contienen el tiempo real que ha transcurrido desde la última vez que se pusieron a cero. Sus valores cambian solos y vienen representados en CENTÉSIMAS de segundo.

Como es un array, puedes asignarles el valor que tu quieras (normalmente cero, para empezar a contar desde ahi), y consultarlo igualmente.

Como miden el tiempo real, no se ralentizan si el rendimiento cae, así que, aunque los fps caigan a 3, los timers contarán un segundo en el mismo periodo de tiempo.

Y un consejo valioso: NUNCA hagais TIMER[0]==xxx, porque es MUY dificil que coincida el timer con un valor exacto, porque ejecutar código consume tiempo y es probable que entre un frame completo y otro pase más de 1 centésima, y nos encontremos que en el primer frame, timer vale 99 y en el siguiente 104, y no llega a pasar por 100. Usad siempre operadores >, <, >= ó <=.

Estos dos últimos párrafos muestran el por qué nunca uso timers para medir el tiempo en mis juegos, mejor usar contadores (variables que definimos nosotros y que incrementamos, manualmente, 1 unidad a cada frame).

Los timers vienen bien para eventos no sincronizados con el juego, o para tareas en tiempo real.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)