Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: hiisoka en 27 Noviembre 2014, 21:04 pm



Título: como ejecutar procesos en segundo plano
Publicado por: hiisoka en 27 Noviembre 2014, 21:04 pm
lo que pasa es que estoy programando en c++ y mi problema es que quiero usar beeps para poner musica de fondo pero si Hago esto no puedo realiZar otras acciones Hasta que terminen los beeps, mi pregunta es como puedo hacer para realiZar dos acciones distintas al mismo tiempo

Por ejemplo me gustaria realizar un videojuego el personaje lo muevo con las teclas pero por desirlo asi los enemigos quiero que se muevan por si solos sin nesesidad de apretar una tecla, como podria mover el mono y al mismo tiempo que se muevan los enemigos y se escuchen los beeps, por que cuando lo realiso si pongo primero los beeps tengo que esperar a que se terminen de ejecutar antes de poder mover al personaje quisiera poder moverlo mientras se ejecutan acciones diferentes


este es mi codigo

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
#include<windows.h>
#include<dos.h>
void main()
{
int x=20,y=23,y1;
char s='s',a;
 textcolor (BLUE);gotoxy(x+2,y-1);cprintf("%c",30);
  textcolor(BLUE);gotoxy(x,y); cprintf("%c|_|%c",17,16);
  textcolor(RED);gotoxy(x+1,y+1); cprintf("%c %c",31,31);
Beep ( 480 , 200 ) ;

    Beep ( 1568 , 200 ) ;

    Beep ( 1568 , 200 ) ;

    Beep ( 1568 , 200 ) ;



    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;


    Beep ( 369.99 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 369.99 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 392 , 400 ) ;

    Beep ( 196 , 400 ) ;



    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 83.99 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 830.61 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 987.77 , 400 ) ;


    Beep ( 880 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 830.61 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 987.77 , 400 ) ;

      Sleep ( 200 ) ;

    Beep ( 1108 , 10 ) ;
    Beep ( 1174.7 , 200 ) ;
    Beep ( 1480 , 10 ) ;
    Beep ( 1568 , 200 ) ;


    Sleep ( 200 ) ;
    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 830.61 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 987.77 , 400 ) ;


    Beep ( 880 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 698.46 , 200 ) ;


    Beep ( 659.25 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 784 , 200 ) ;

    Beep ( 880 , 400 ) ;

    Beep ( 784 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 659.25 , 200 ) ;



    Beep ( 587.33 , 200 ) ;

    Beep ( 659.25 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 784 , 400 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 659.25 , 200 ) ;

    Beep ( 587.33 , 200 ) ;



    Beep ( 523.25 , 200 ) ;

    Beep ( 587.33 , 200 ) ;

    Beep ( 659.25 , 200 ) ;

    Beep ( 698.46 , 400 ) ;

    Beep ( 659.25 , 200 ) ;

    Beep ( 587.33 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 523.25 , 200 ) ;


    Sleep ( 400 ) ;
    Beep ( 349.23 , 400 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 329.63 , 200 ) ;

    Beep ( 523.25 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 466.16 , 200 ) ;



    Beep ( 440 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 523.25 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 1760 , 200 ) ;

    Beep ( 440 , 200 ) ;



    Beep ( 392 , 200 ) ;

    Beep ( 440 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 440 ,  200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 1568 , 200 ) ;

    Beep ( 392 , 200 ) ;



    Beep ( 349.23 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 440 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 415.2 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 1396.92 , 200 ) ;

    Beep ( 349.23 , 200 ) ;



    Beep ( 329.63 , 200 ) ;

    Beep ( 311.13 , 200 ) ;

    Beep ( 329.63 , 200 ) ;

    Beep ( 659.25 , 200 ) ;

    Beep ( 698.46 , 400 ) ;

    Beep ( 783.99 , 400 ) ;



    Beep ( 440 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 523.25 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 880 , 200 ) ;

    Beep ( 1760 , 200 ) ;

    Beep ( 440 , 200 ) ;



    Beep ( 392 , 200 ) ;

    Beep ( 440 , 200 ) ;

    Beep ( 493.88 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 440 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 1568 , 200 ) ;

    Beep ( 392 , 200 ) ;



    Beep ( 349.23 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 440 , 00 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 659.25 , 200 ) ;

    Beep ( 698.46 , 200 ) ;

    Beep ( 739.99 , 200 ) ;

    Beep ( 783.99 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 392 , 200 ) ;

    Beep ( 196 , 200 ) ;

    Beep ( 196 , 200 ) ;

    Beep ( 196 , 200 ) ;



    Beep ( 185 , 200 ) ;

    Beep ( 196 , 200 ) ;

    Beep ( 185 , 200 ) ;

    Beep ( 196 , 200 ) ;

    Beep ( 207.65 , 200 ) ;

    Beep ( 220 , 200 ) ;

    Beep ( 233.08 , 200 ) ;

    Beep ( 246.94 , 200 ) ;
while(s=='s')
 {
  a=getch();
  textcolor(BLACK);gotoxy(x,y); cprintf("%c|_|%c",17,16);
  gotoxy(x+2,y-1);cprintf("%c",30);
  gotoxy(x+1,y+1); cprintf("%c %c",31,31);
  if(a=='a')
  {
  x=x-4;
  }
  if(a=='d')
  {
  x=x+4;
  }
  if(a=='s')
  {
  y=y+4;
  }
  if(a=='w')
  {
  y=y-4;
  }
  textcolor (BLUE);gotoxy(x+2,y-1);cprintf("%c",30);
  textcolor(BLUE);gotoxy(x,y); cprintf("%c|_|%c",17,16);
  textcolor(RED);gotoxy(x+1,y+1); cprintf("%c %c",31,31);
  if(a=='l')
  {
    Beep(440,500);
  for(y1=y;y1>3;y1--)
   {

   textcolor (GREEN);gotoxy(x+2,y1-2);cprintf("%c",254);
   Sleep(15);
   textcolor (BLACK);gotoxy(x+2,y1-2);cprintf("%c",254);
   }
  }
 }
}


Título: Re: como ejecutar procesos en segundo plano
Publicado por: engel lex en 27 Noviembre 2014, 21:14 pm
Tendrás que dar mas detalles... no se entiende que pasa o quieres...


Título: Re: como ejecutar procesos en segundo plano
Publicado por: _Enko en 27 Noviembre 2014, 21:24 pm
Hola, podrías crear un hilo separado usando CreateThread si estas en windows.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx


Saludos.


Título: Re: como ejecutar procesos en segundo plano
Publicado por: kafok en 27 Noviembre 2014, 22:00 pm
Vamos a ver, antes de meterte en multi-thread, que en windows tienes aqui la documentacion (en ingles): http://msdn.microsoft.com/en-us/library/windows/desktop/ms684852(v=vs.85).aspx  Debes tener clara una cosa, en un juego vamos a tener un codigo ejecutandose en un bucle. En ese bucle cada iteraccion se considera que es un frame o una imagen a mostrar por pantalla. Cada iteraccion actualizara los estados los objetos de la escena entre otras cosas y por ultimo las pintara. Sigue el siguiente orden:
    Bucle:
        Actualizar fisica
        Actualiar pantalla (pintar)
    fin-bucle

-Actualizar pantalla: esta claro lo que es, simplemente pinta los objetos segun su estado (posicines, tamaños...)

-Actualizar fisica: esto es un poco mas complejo, la fisica de un juego depende del juego y puede ser mas o menos compleja. Para mover al jugador en algun momento debes comprobar que se presiona la tecla para moverlo en cada direccion, si es asi desplazmos en el eje de coordenadas que correspondo tantas unidades como velocidad quieras que se mueva ese objeto*. Luego mueves a los enemigos segun las condiciones que rijas tú, y despues comprueba si chocan. Despues de todas esta comprobaciones tienes que tener los objetos actualizados (en posicion, por ejemplo) y listos para ser pintados.

Al ser pintados me refiero que imprimas por consola el caracter/texto en la posicion que tengas, porque veo que es una simple aplicacion de consola (he hablado lo mas generico que pude, los juegos 3d con graficazos tambien funcionan asi)


*el tema velocidad dependera de la velocidad del ordenador, una velocidad 10 puede ir muy lento en un ordenador antiguo y demasiado rapido en un ordenador bueno. Para eso existen tecnicas complejas como el tiempo delta, o si es un juego que no consume recursos como es tu caso limitar a un numero cualquiera las iteracciones de tu bucle, pero ya te digo este tema es algo complejo


Título: Re: como ejecutar procesos en segundo plano
Publicado por: x64core en 28 Noviembre 2014, 17:01 pm
funciones como beep hace poner e hilo en modo alertable, es como que utilices Sleep ( En realidad le llama ), asi que ¿porqué no usar funciones que ya fueron diseñadas para propositos como reproducir un musica o sonido? No veo la necesidad de usar Beep para lo que estas intentando hacer.

mciSendString
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757161%28v=vs.85%29.aspx
PlaySound:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680(v=vs.85).aspx
Midi's
http://msdn.microsoft.com/en-us/library/windows/desktop/dd798495(v=vs.85).aspx