elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Juego de nave (Rutina de asteroides)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Juego de nave (Rutina de asteroides)  (Leído 3,717 veces)
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
[Ayuda] Juego de nave (Rutina de asteroides)
« en: 7 Septiembre 2013, 21:38 pm »

Hola bueno, he estado programando un juego de Naves cómo el que programó un joven llamado David en uno de sus vídeos, solo que yo lo hice sin ver sus vídeos, ehm.. Hasta ahora voy bien (bueno no tanto), estoy programando la rutina de los asteroides pero los asteroides solo se mueven cuando muevo el avión de los contrario están quietos. Cómo puedo hacer para que se muevan mientras yo presione o no presione una tecla?

El avión se mueve con las teclas: 'W', 'A', 'S' y 'D'; También se mueve con las flechas del teclado.

Acá está lo que llevo:
Código
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <conio.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. void gotoxy(int x, int y);
  9. void pintar_avion();
  10. void pintar_asteroides();
  11.  
  12. #define FLECHA_DERECHA      77
  13. #define FLECHA_IZQUIERDA    75
  14. #define FLECHA_ARRIBA       72
  15. #define FLECHA_ABAJO        80
  16.  
  17. //Avión que se pintara cuando se desplace hacia la derecha
  18. char avion_x1_1[5] = {'-',' ',' ',' ',0};
  19. char avion_x1_2[5] = {'*','-',' ',' ',0};
  20. char avion_x1_3[5] = {'*','*','-',' ',0};
  21. char avion_x1_4[5] = {'*','*','*','*',0};
  22. char avion_x1_5[5] = {'*','*','-',' ',0};
  23. char avion_x1_6[5] = {'*','-',' ',' ',0};
  24. char avion_x1_7[5] = {'-',' ',' ',' ',0};
  25.  
  26. //Avión que se pintara cuando se desplace hacia la izquierda
  27. char avion_x2_1[5] = {' ',' ',' ','-',0};
  28. char avion_x2_2[5] = {' ',' ','-','*',0};
  29. char avion_x2_3[5] = {' ','-','*','*',0};
  30. char avion_x2_4[5] = {'*','*','*','*',0};
  31. char avion_x2_5[5] = {' ','-','*','*',0};
  32. char avion_x2_6[5] = {' ',' ','-','*',0};
  33. char avion_x2_7[5] = {' ',' ',' ','-',0};
  34.  
  35. //Avión que se pintara cuando se desplace hacia abajo
  36. char avion_y1_1[8] = {'|','*','*','*','*','*','|',0};
  37. char avion_y1_2[8] = {' ','|','*','*','*','|',' ',0};
  38. char avion_y1_3[8] = {' ',' ','|','*','|',' ',' ',0};
  39. char avion_y1_4[8] = {' ',' ',' ','*',' ',' ',' ',0};
  40.  
  41. //Avión que se pintara cuando se desplace hacia arriba
  42. char avion_y2_1[8] = {' ',' ',' ','*',' ',' ',' ',0};
  43. char avion_y2_2[8] = {' ',' ','|','*','|',' ',' ',0};
  44. char avion_y2_3[8] = {' ','|','*','*','*','|',' ',0};
  45. char avion_y2_4[8] = {'|','*','*','*','*','*','|',0};
  46.  
  47. //Coordenadas del avión
  48. int cX = 37 , cY = 20;
  49.  
  50. //Coordenadas de los asteroides
  51. int xA1 , yA1;
  52. int xA2 , yA2;
  53. int xA3 , yA3;
  54. int xA4 , yA4;
  55. int xA5 , yA5;
  56.  
  57. //Asteroide
  58. char Asteroide = char(2);
  59.  
  60. //Variable que determinara el cambio de posición del avión
  61. // 0 = Arriba
  62. // 1 = Abajo
  63. // 2 = Izquierda
  64. // 3 = Derecha
  65. typedef unsigned short int USINT;
  66. USINT cPosition = 0;
  67.  
  68. int main()
  69. {
  70.    srand(time(NULL));
  71.  
  72.    xA1 = (rand() % 76);
  73.    xA2 = (rand() % 76);
  74.    xA3 = (rand() % 76);
  75.    xA4 = (rand() % 76);
  76.    xA5 = (rand() % 76);
  77.  
  78.    yA1 = (rand() % 19);
  79.    yA2 = (rand() % 19);
  80.    yA3 = (rand() % 19);
  81.    yA4 = (rand() % 19);
  82.    yA5 = (rand() % 19);
  83.  
  84.    pintar_asteroides();
  85.    pintar_avion();
  86.    char tecla = getch();
  87.  
  88.    do
  89.    {
  90.        yA1++;
  91.        yA2++;
  92.        yA3++;
  93.        yA4++;
  94.        yA5++;
  95.  
  96.        if(yA1 == 25)
  97.        {
  98.            yA1 = 0;
  99.            xA1 = (rand() % 76);
  100.        }
  101.        if(yA2 == 25)
  102.        {
  103.            yA2 = 0;
  104.            xA2 = (rand() % 76);
  105.        }
  106.        if(yA3 == 25)
  107.        {
  108.            yA3 = 0;
  109.            xA3 = (rand() % 76);
  110.        }
  111.        if(yA4 == 25)
  112.        {
  113.            yA4 = 0;
  114.            xA4 = (rand() % 76);
  115.        }
  116.        if(yA5 == 25)
  117.        {
  118.            yA5 = 0;
  119.            xA5 = (rand() % 76);
  120.        }
  121.  
  122.        if((tecla == 'a' || tecla == 'A' || tecla == FLECHA_IZQUIERDA) && cX > 2)
  123.        {
  124.           cX -= 2;
  125.           cPosition = 2;
  126.        }
  127.        else if((tecla == 'w' || tecla == 'W' || tecla == FLECHA_ARRIBA) && cY > 0)
  128.        {
  129.            cY -= 2;
  130.            cPosition = 0;
  131.        }
  132.        else if((tecla == 's' || tecla == 'S' || tecla == FLECHA_ABAJO) && cY < 22)
  133.        {
  134.            cY += 2;
  135.            cPosition = 1;
  136.        }
  137.        else if((tecla == 'd' || tecla == 'D' || tecla == FLECHA_DERECHA) && cX < 72)
  138.        {
  139.            cX += 2;
  140.            cPosition = 3;
  141.        }
  142.  
  143.        system("cls");
  144.  
  145.        pintar_avion();
  146.        pintar_asteroides();
  147.  
  148.        tecla = getch();
  149.  
  150.    }while(1);
  151.  
  152.    system("pause>nul");
  153.  
  154.    return 0;
  155. }
  156.  
  157. void pintar_avion()
  158. {
  159. // 0 = Arriba
  160. // 1 = Abajo
  161. // 2 = Izquierda
  162. // 3 = Derecha
  163.    if(cPosition == 0)
  164.    {
  165.        gotoxy(cX,cY);
  166.        cout << avion_y2_1 << endl;
  167.        gotoxy(cX,(cY + 1));
  168.        cout << avion_y2_2 << endl;
  169.        gotoxy(cX , (cY + 2));
  170.        cout << avion_y2_3 << endl;
  171.        gotoxy(cX , (cY + 3));
  172.        cout << avion_y2_4 << endl;
  173.    }
  174.    else if(cPosition == 1)
  175.    {
  176.        gotoxy(cX,cY);
  177.        cout << avion_y1_1 << endl;
  178.        gotoxy(cX,(cY + 1));
  179.        cout << avion_y1_2 << endl;
  180.        gotoxy(cX , (cY + 2));
  181.        cout << avion_y1_3 << endl;
  182.        gotoxy(cX , (cY + 3));
  183.        cout << avion_y1_4 << endl;
  184.    }
  185.    else if(cPosition == 2)
  186.    {
  187.        gotoxy(cX,cY);
  188.        cout << avion_x2_1 << endl;
  189.        gotoxy(cX,(cY + 1));
  190.        cout << avion_x2_2 << endl;
  191.        gotoxy(cX , (cY + 2));
  192.        cout << avion_x2_3 << endl;
  193.        gotoxy(cX , (cY + 3));
  194.        cout << avion_x2_4 << endl;
  195.        gotoxy(cX , (cY + 4));
  196.        cout << avion_x2_5 << endl;
  197.        gotoxy(cX , (cY + 5));
  198.        cout << avion_x2_6 << endl;
  199.        gotoxy(cX , (cY + 6));
  200.        cout << avion_x2_7 << endl;
  201.        //gotoxy(cX , (cY + 7));
  202.        //cout << avion_x2_7 << endl;
  203.    }
  204.    else if(cPosition == 3)
  205.    {
  206.        gotoxy(cX,cY);
  207.        cout << avion_x1_1 << endl;
  208.        gotoxy(cX,(cY + 1));
  209.        cout << avion_x1_2 << endl;
  210.        gotoxy(cX , (cY + 2));
  211.        cout << avion_x1_3 << endl;
  212.        gotoxy(cX , (cY + 3));
  213.        cout << avion_x1_4 << endl;
  214.        gotoxy(cX , (cY + 4));
  215.        cout << avion_x1_5 << endl;
  216.        gotoxy(cX , (cY + 5));
  217.        cout << avion_x1_6 << endl;
  218.        gotoxy(cX , (cY + 6));
  219.        cout << avion_x1_7 << endl;
  220.        //gotoxy(cX , (cY + 7));
  221.        //cout << avion_x1_7 << endl;
  222.    }
  223. }
  224.  
  225. void gotoxy(int x, int y)
  226. {
  227.    HANDLE hCon;
  228.    COORD dwPos;
  229.    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
  230.    dwPos.X = x;
  231.    dwPos.Y = y;
  232.    SetConsoleCursorPosition(hCon,dwPos);
  233. }
  234.  
  235. void pintar_asteroides()
  236. {
  237.    gotoxy(xA1,yA1);
  238.    cout << Asteroide;
  239.    gotoxy(xA2,yA2);
  240.    cout << Asteroide;
  241.    gotoxy(xA3,yA3);
  242.    cout << Asteroide;
  243.    gotoxy(xA4,yA4);
  244.    cout << Asteroide;
  245.    gotoxy(xA5,yA5);
  246.    cout << Asteroide;
  247. }
  248.  


En línea

Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: [Ayuda] Juego de nave (Rutina de asteroides)
« Respuesta #1 en: 7 Septiembre 2013, 22:09 pm »

Debes crear un evento asociado a un temporizador:

Paso 1: El temporizador avisa cada intervalo de tiempo.
Paso 2: Cada vez que avise el temporizador salta el evento.
Paso 3: El evento se encargará de actualizar los elementos que componen tu videojuego (posiciones, estados, etc.) y no tendrás que esperar a que se presione una tecla.

Evento de temporizador con WinAPI: http://support.microsoft.com/kb/180736/es

Hay cosas que puedes hacer sin complicar tanto el código, por ejemplo, la imagen de la nave la puedes imprimir con un simple bucle sin usar esa cantidad de matrices, incluso si te aclaras mejor con arrays crea uno bidimensional y no siete para cada caso:

Código
  1. //Avión que se pintara cuando se desplace hacia la derecha
  2. char avion_x1_1[5][7] =
  3. {'-',' ',' ',' ',0
  4. '*','-',' ',' ',0
  5. '*','*','-',' ',0
  6. '*','*','*','*',0
  7. '*','*','-',' ',0
  8. '*','-',' ',' ',0
  9. '-',' ',' ',' ',0};

No uses conio.h: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Un saludo.


« Última modificación: 7 Septiembre 2013, 22:35 pm por Alien-Z » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Ayuda] Juego de nave (Rutina de asteroides)
« Respuesta #2 en: 7 Septiembre 2013, 23:47 pm »

Puedes programar la parte gráfica en un hilo independiente.

Al hilo tendrás que añadirle un pequeño retardo para que se ejecute a una velocidad adecuada para el juego. Dicho hilo puede encargarse perfectamente tanto de mover la nave cuando se requiere como de mover los asteroides de forma constante.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Apple tiene permiso para construir su «nave espacial»
Noticias
almafuerte25 0 1,382 Último mensaje 18 Octubre 2013, 17:03 pm
por almafuerte25
Gasta $30.000 en convertir el sótano de su casa en la nave Enterprise de ....
Noticias
wolfbcn 1 1,261 Último mensaje 10 Enero 2014, 10:21 am
por crazykenny
Juego de naves y asteroides
Programación C/C++
cNoob 1 2,245 Último mensaje 29 Junio 2016, 01:08 am
por cNoob
AYUDA RUTINA PARA TOUCH SCREEN
Programación C/C++
Virolay 1 1,738 Último mensaje 3 Octubre 2016, 18:49 pm
por dato000
'Fiebre del oro' espacial: los asteroides traerían Tn de metales a la Tierra
Foro Libre
Machacador 3 1,722 Último mensaje 19 Junio 2018, 20:57 pm
por Orubatosu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines