[Ayuda] Juego de nave (Rutina de asteroides)

Iniciado por Zodiak98, 7 Septiembre 2013, 21:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Zodiak98

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 (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>

using namespace std;

void gotoxy(int x, int y);
void pintar_avion();
void pintar_asteroides();

#define FLECHA_DERECHA      77
#define FLECHA_IZQUIERDA    75
#define FLECHA_ARRIBA       72
#define FLECHA_ABAJO        80

//Avión que se pintara cuando se desplace hacia la derecha
char avion_x1_1[5] = {'-',' ',' ',' ',0};
char avion_x1_2[5] = {'*','-',' ',' ',0};
char avion_x1_3[5] = {'*','*','-',' ',0};
char avion_x1_4[5] = {'*','*','*','*',0};
char avion_x1_5[5] = {'*','*','-',' ',0};
char avion_x1_6[5] = {'*','-',' ',' ',0};
char avion_x1_7[5] = {'-',' ',' ',' ',0};

//Avión que se pintara cuando se desplace hacia la izquierda
char avion_x2_1[5] = {' ',' ',' ','-',0};
char avion_x2_2[5] = {' ',' ','-','*',0};
char avion_x2_3[5] = {' ','-','*','*',0};
char avion_x2_4[5] = {'*','*','*','*',0};
char avion_x2_5[5] = {' ','-','*','*',0};
char avion_x2_6[5] = {' ',' ','-','*',0};
char avion_x2_7[5] = {' ',' ',' ','-',0};

//Avión que se pintara cuando se desplace hacia abajo
char avion_y1_1[8] = {'|','*','*','*','*','*','|',0};
char avion_y1_2[8] = {' ','|','*','*','*','|',' ',0};
char avion_y1_3[8] = {' ',' ','|','*','|',' ',' ',0};
char avion_y1_4[8] = {' ',' ',' ','*',' ',' ',' ',0};

//Avión que se pintara cuando se desplace hacia arriba
char avion_y2_1[8] = {' ',' ',' ','*',' ',' ',' ',0};
char avion_y2_2[8] = {' ',' ','|','*','|',' ',' ',0};
char avion_y2_3[8] = {' ','|','*','*','*','|',' ',0};
char avion_y2_4[8] = {'|','*','*','*','*','*','|',0};

//Coordenadas del avión
int cX = 37 , cY = 20;

//Coordenadas de los asteroides
int xA1 , yA1;
int xA2 , yA2;
int xA3 , yA3;
int xA4 , yA4;
int xA5 , yA5;

//Asteroide
char Asteroide = char(2);

//Variable que determinara el cambio de posición del avión
// 0 = Arriba
// 1 = Abajo
// 2 = Izquierda
// 3 = Derecha
typedef unsigned short int USINT;
USINT cPosition = 0;

int main()
{
    srand(time(NULL));

    xA1 = (rand() % 76);
    xA2 = (rand() % 76);
    xA3 = (rand() % 76);
    xA4 = (rand() % 76);
    xA5 = (rand() % 76);

    yA1 = (rand() % 19);
    yA2 = (rand() % 19);
    yA3 = (rand() % 19);
    yA4 = (rand() % 19);
    yA5 = (rand() % 19);

    pintar_asteroides();
    pintar_avion();
    char tecla = getch();

    do
    {
        yA1++;
        yA2++;
        yA3++;
        yA4++;
        yA5++;

        if(yA1 == 25)
        {
            yA1 = 0;
            xA1 = (rand() % 76);
        }
        if(yA2 == 25)
        {
            yA2 = 0;
            xA2 = (rand() % 76);
        }
        if(yA3 == 25)
        {
            yA3 = 0;
            xA3 = (rand() % 76);
        }
        if(yA4 == 25)
        {
            yA4 = 0;
            xA4 = (rand() % 76);
        }
        if(yA5 == 25)
        {
            yA5 = 0;
            xA5 = (rand() % 76);
        }

        if((tecla == 'a' || tecla == 'A' || tecla == FLECHA_IZQUIERDA) && cX > 2)
        {
           cX -= 2;
           cPosition = 2;
        }
        else if((tecla == 'w' || tecla == 'W' || tecla == FLECHA_ARRIBA) && cY > 0)
        {
            cY -= 2;
            cPosition = 0;
        }
        else if((tecla == 's' || tecla == 'S' || tecla == FLECHA_ABAJO) && cY < 22)
        {
            cY += 2;
            cPosition = 1;
        }
        else if((tecla == 'd' || tecla == 'D' || tecla == FLECHA_DERECHA) && cX < 72)
        {
            cX += 2;
            cPosition = 3;
        }

        system("cls");

        pintar_avion();
        pintar_asteroides();

        tecla = getch();

    }while(1);

    system("pause>nul");

    return 0;
}

void pintar_avion()
{
// 0 = Arriba
// 1 = Abajo
// 2 = Izquierda
// 3 = Derecha
    if(cPosition == 0)
    {
        gotoxy(cX,cY);
        cout << avion_y2_1 << endl;
        gotoxy(cX,(cY + 1));
        cout << avion_y2_2 << endl;
        gotoxy(cX , (cY + 2));
        cout << avion_y2_3 << endl;
        gotoxy(cX , (cY + 3));
        cout << avion_y2_4 << endl;
    }
    else if(cPosition == 1)
    {
        gotoxy(cX,cY);
        cout << avion_y1_1 << endl;
        gotoxy(cX,(cY + 1));
        cout << avion_y1_2 << endl;
        gotoxy(cX , (cY + 2));
        cout << avion_y1_3 << endl;
        gotoxy(cX , (cY + 3));
        cout << avion_y1_4 << endl;
    }
    else if(cPosition == 2)
    {
        gotoxy(cX,cY);
        cout << avion_x2_1 << endl;
        gotoxy(cX,(cY + 1));
        cout << avion_x2_2 << endl;
        gotoxy(cX , (cY + 2));
        cout << avion_x2_3 << endl;
        gotoxy(cX , (cY + 3));
        cout << avion_x2_4 << endl;
        gotoxy(cX , (cY + 4));
        cout << avion_x2_5 << endl;
        gotoxy(cX , (cY + 5));
        cout << avion_x2_6 << endl;
        gotoxy(cX , (cY + 6));
        cout << avion_x2_7 << endl;
        //gotoxy(cX , (cY + 7));
        //cout << avion_x2_7 << endl;
    }
    else if(cPosition == 3)
    {
        gotoxy(cX,cY);
        cout << avion_x1_1 << endl;
        gotoxy(cX,(cY + 1));
        cout << avion_x1_2 << endl;
        gotoxy(cX , (cY + 2));
        cout << avion_x1_3 << endl;
        gotoxy(cX , (cY + 3));
        cout << avion_x1_4 << endl;
        gotoxy(cX , (cY + 4));
        cout << avion_x1_5 << endl;
        gotoxy(cX , (cY + 5));
        cout << avion_x1_6 << endl;
        gotoxy(cX , (cY + 6));
        cout << avion_x1_7 << endl;
        //gotoxy(cX , (cY + 7));
        //cout << avion_x1_7 << endl;
    }
}

void gotoxy(int x, int y)
{
    HANDLE hCon;
    COORD dwPos;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    dwPos.X = x;
    dwPos.Y = y;
    SetConsoleCursorPosition(hCon,dwPos);
}

void pintar_asteroides()
{
    gotoxy(xA1,yA1);
    cout << Asteroide;
    gotoxy(xA2,yA2);
    cout << Asteroide;
    gotoxy(xA3,yA3);
    cout << Asteroide;
    gotoxy(xA4,yA4);
    cout << Asteroide;
    gotoxy(xA5,yA5);
    cout << Asteroide;
}

Alien-Z

#1
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 (cpp) [Seleccionar]
//Avión que se pintara cuando se desplace hacia la derecha
char avion_x1_1[5][7] =
{'-',' ',' ',' ',0
'*','-',' ',' ',0
'*','*','-',' ',0
'*','*','*','*',0
'*','*','-',' ',0
'*','-',' ',' ',0
'-',' ',' ',' ',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.

eferion

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.