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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  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 2,633 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:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines