C++, MIDI y alguna cuestion mas...

Buenas,

breve resumen: me han mandado un proyecto en C++, ya lo he terminado con puntuacion posible hasta el 8 sobre 10, del 8 al 10 lo saco por ampliaciones.

Por hacer algo un poco distinto que lo que haran los demas me he planteado cargar un track midi desde la memoria secundaria y ponerla durante la marcha del juego, alternandola con una mas movidita si se acerca al final jeje

el problema, me he recorrido internet (especialmente cplusplus.com) y no encuentro nada que me ayude a ampliar conocimientos, ¿alguien de por aqui podria echarme un cable?

la otra cuestion seria tambien otra ampliacion, un reloj contrarreloj, cargaria el numero de segundos desde un fichero e iria decreciendo hasta 0, ¿problema? pues que mientras yo no pulse ninguna tecla el reloj no avanzaria, hay alguna manera de hacer esto con programacion imperativa?

Saludos!
 
Ni puta idea amigo, no he tocado C++ apenas (sí bastante C) pero no conozco librerías ni comerciales ni gratuitas de manejo de MIDIs...

En Google saldrá algo, digo yo. Salud!!
 
Buenas! no sé si llego un poco tarde para tu proyecto, pero comento :p
Estás usando alguna librería en especial para programar? la mayoría poseen wrappers para C++ aunque estén programados en C u otro lenguaje.

Si no te importa incluir dependencias, igual encuentras algo interesante en SDL o con GTK usando gStreamer. A más bajo nivel ahora mismo no caigo, pero seguro que algo hay...

Si me acuerdo de alguna otra cosa y te puedo echar un cable, ya iré posteando :)
 
estoy trabajando con Allegro4.2, y tranqui el proyecto es para el 28 de enero, pero como se me da bien y quiero quitarmelo ya pues le meti a saco jaja
 
G
Si no me equivoco, hay una librería para trabajar con tiempo, buscar por time en cplusplus y así...
 
X
Has pensado en crear un hilo adicional para llevar adelante el cronómetro?

Si el hilo principal de ejecución de tu juego espera por una tecla, hasta que no se pulse, no avanza el cronómetro.

Solución: un segundo proceso ejecutándose concurrentemente.

Aquí una pequeña explicación con un ejemplo de como crear hilos en Allegro:

http://jadendreamer.wordpress.com/2007/09/10/threading-in-allegro-for-windows/


Saludos!
 
xovez dijo:
Has pensado en crear un hilo adicional para llevar adelante el cronómetro?

Si el hilo principal de ejecución de tu juego espera por una tecla, hasta que no se pulse, no avanza el cronómetro.

Solución: un segundo proceso ejecutándose concurrentemente.

Aquí una pequeña explicación con un ejemplo de como crear hilos en Allegro:

http://jadendreamer.wordpress.com/2007/09/10/threading-in-allegro-for-windows/


Saludos!

tengo restringida la programacion paralela tio :(

gracias de todos modos
 
No sé como tienes montado el programa, pero en la libreria standard de c tienes el fichero time.h con el que tienes varias funciones de tiempos.

usando la funcion time (dentro de time.h) tienes el tiempo, creo que iba en milisegundos, pero no estoy fijo, mira la referencia. La cosa es, tu cargas el tiempo que quieras del fichero y con time miras la hora que es y la almacenas también.

En el programa tendrías que meter dentro de tu bucle de ejecución:

Código:
while(!exit()){
/*codigo de programa*/
if(time() >= (tiempoInicial + tiempoEspera)){
   /*El cronometro llegó a 0, haz lo que necesites*/

}else{
 /*Imprime por pantalla el tiempo restante*/
printf("Cuenta atrás: %f",tiempoInicial-time()+tiempoEspera);
}

if(getch()){
/*Aqui ves si se pulsó tecla, así no bloqueas la ejecución esperando por que el usuario pulse una tecla*/
}

/*codigo  de programa*/
}

No sé como va el resto del programa, por lo que no sé si tienes un bucle principal, o es todo del tirón o cómo.

Si no tienes un bucle principal, con la programación paralela vetada, y sin saber exactamente qué tienes que hacer (Alerta palos de ciego spotted) solo se me ocurre "imitar" la programación paralela, dividiendo la ejecución del programa entre el cronometro y el resto del programa, con un autómata de estados o algo... :confused:
 
X
resakosix dijo:
Código:
while(!exit()){
/*codigo de programa*/
if(time() >= (tiempoInicial + tiempoEspera)){
   /*El cronometro llegó a 0, haz lo que necesites*/

}else{
 /*Imprime por pantalla el tiempo restante*/
printf("Cuenta atrás: %f",tiempoInicial-time()+tiempoEspera);
}

if(getch()){
/*Aqui ves si se pulsó tecla, así no bloqueas la ejecución esperando por que el usuario pulse una tecla*/
}

/*codigo  de programa*/
}

El problema es que este código puede mantener el juego activo, con tiempo terminado, hasta que se pulse una tecla.

Otra posible solución, que no se si te valdrá, porque es necesaria la librería conio.h:


Código:
#include <conio.h>


// y esto en el bucle de ejecución


while (juegoActivo) {

   while( !kbhit() )
   {

       /*codigo de programa*/
        if(time() >= (tiempoInicial + tiempoEspera)){
            /*El cronometro llegó a 0, haz lo que necesites*/

        }else{
            /*Imprime por pantalla el tiempo restante*/
            printf("Cuenta atrás: %f",tiempoInicial-time()+tiempoEspera);
        }

   }

  teclaPulsada = getch();

  // y aquí el código de cuando se pulsa una tecla


}


Este código hace que mientras no se haya pulsado una tecla, se ejecuta el bucle que controla al cronómetro. Cuando se ha pulsado alguna tecla, se salta ese bucle para atender al resto del código leyendo la tecla.

Una vez acaba de tratar la tecla leída, comienza de nuevo a prestar atención al cronómetro hasta pulsar otra tecla.

Espero ayudar!
 
a ver, no voy a poner cosas muy concretas porque si mis compis buscan por internet con buenas referencias pueden encontrar este post y trincar mi codigo, por lo que pongo la estructura basica que nos han dado y por tanto la que hay que respetar:

//bucle principal del juego
while(movimientos>0$$!teclasalir&&!ganador){
tecla = TEntornoLeerTecla();//se le asigna un valor enumerado en el Entorno.

switch (tecla) {
case: tecla1
casetecla 2
.............................
con sus respectivas acciones.
}//fin del bucle principal

para leer el teclado uso la funcion readkey(); que supongo que esta contenida en allegro.h (creo, porque esa parte no la diseñe yo, si no los profesores)

y aqui el contenido de TEntornoLeerTecla():

TipoTecla TEntornoLeerTecla (void) {

TipoTecla tecla = TNada;

readkey();

if (key[KEY_UP]) tecla = TArriba;
else if (key[KEY_DOWN]) tecla = TAbajo;
else if (key[KEY_RIGHT]) tecla = TDerecha;
else if (key[KEY_LEFT]) tecla = TIzquierda;
else if (key[KEY_ENTER]) tecla = TEnter;
else if (key[KEY_ESC]) tecla = TSalir;
else if (key[KEY_C]) tecla = TC;
else if (key[KEY_X]) tecla = TX;

clear_keybuf();
return tecla;

}


TipoTecla es un tipo enumerado, no me gustan, pero no me dejan cambiarlo xD.


he agregado un "crono" interno mediante la funcion clock(); de ctime.h, almaceno el valor inicial en el que se ejecuta el juego y cuando acaba la partida repito para tomar el final y saber lo que ha durado la partida en segundos ((final-inicio)/CLOCKS_PER_SEC) pero esto solo me sirve para calcular la puntuacion que me dio por diseñar (por ampliar algo...) pero la manera de leer el teclado me jode sacar el tiempo por pantalla XD

gracias por la ayuda compañeros

por cierto xovez, que pasa con la libreria conio.h? es de pago o algo raro? si es una estandarizada no debería tener ningún problema jejeje

saludos
 
X
Vale, pues entonces podemos adaptar tu código para usar tus mismas funciones pero sin esperar hasta pulsar una tecla. Es usando una función propia de Allegro: keypressed(). Esta función nos permite saber si se ha pulsado una tecla, antes de llamar a readkey(), y con eso evitamos que el bucle se detenga hasta pulsar la tecla. Tu mismo código quedaría:


Código:
//bucle principal del juego

while (movimientos>0 $$ !teclasalir && !ganador) {
  
   if (keypressed()) {  // con esto, si no se pulsó ninguna tecla, no detenemos el bucle

       tecla = TEntornoLeerTecla();//se le asigna un valor enumerado en el Entorno.

       switch (tecla) {
            case: tecla1
            case: tecla 2
            .............................
            con sus respectivas acciones.
   }


   //  Y AQUÍ el código que avanza y muestra el cronómetro


} //fin del bucle principal

Es lo mismo que te propuse, pero con tu propio código. Espero que ahora si te sirva!!!

Cuéntanos qué tal....


Por cierto, lo de "conio.h" es que no es estándar de C... simplemente, pero si muy utilizada :)
 
hmhmhmhm, interesante, hablare con los profesores a ver si les parece bueno, porque lo que haria yo seria modificar su modulo con esa funcion :D

como me retorna la tecla que he pulsado? llamando al modulo de leer el teclado si hay algo presionado al ser verdad que hay una tecla pulsada?

EDIT: vale acabo de ver la invocacion xd, esque no tengo costumbre de dejar saltos entre un f y la instruccion jejeje


muchisimas gracias tioi
 
Arriba Pie