2016-04-16 3 views
1

Я инженер-программист первого года, поэтому я немного разбираюсь в кодировании C++, так или иначе я создаю игру, в которой есть два космических корабля, стреляющих друг в друга. В настоящее время мне удалось сделать первый запуск космического корабля, используя цикл while и функцию GetASyncKeyState. но теперь я делаю пули путешествовать. Я использовал цикл, и мне удалось сделать движение пули вверх. Но есть проблема, я не могу переместить космический корабль до тех пор, пока остановка цикла for или пуля не достигнет вершины окна консоли (я использую консоль btw). есть ли способ как запустить цикл for, так и в то же время? или запускать две разные функции одновременно, поскольку GameMovement() предназначен для перемещения космического корабля, а BulletTravel() - для пули. и я вызываю BulletTravel() из GameMovement().Запуск двух петель одновременно? перемещение и перемещение с использованием петель

void GameMovements() 
{ 
bool FirstInitialization = true; 
int Player1XCoordinate = 55, Player2XCoordinate = 55; 
int Player1YCoordinateU = 28, Player1YCoordinateD = 29; 


while (true) 
{ 
    BulletPattern(Player1XCoordinate); 

    if (FirstInitialization == true) 
    { 
     GameBorderAndStatus(); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
     FirstInitialization = false; 
    } 

    //MOVEMENTS FOR PLAYER 1 
    else if (GetAsyncKeyState(VK_LEFT) && Player1XCoordinate != 16) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 

     Sleep(10); 
     Player1XCoordinate -= 3; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 
    else if (GetAsyncKeyState(VK_RIGHT) && Player1XCoordinate != 94) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 
     Player1XCoordinate += 3; 

     Sleep(10); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 
    else if (GetAsyncKeyState(VK_UP) && Player1YCoordinateU != 24) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 
     Player1YCoordinateU -= 2; 
     Player1YCoordinateD -= 2; 

     Sleep(10); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 
    else if (GetAsyncKeyState(VK_DOWN) && Player1YCoordinateU != 28) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 
     Player1YCoordinateU += 2; 
     Player1YCoordinateD += 2; 

     Sleep(10); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 

} 
} 

void GameBorderAndStatus() 
{ 
     //Draw game border 
     for (int i = 0; i < 31; i++) 
     { 
     SetCoordinate(15, i); 
     cout << "|"; 
     SetCoordinate(104, i); 
     cout << "|"; 
     } 

} 

void BulletPattern(int Player1MuzzleLocation) 
{ 
    for (int i = 25; i != 3; i--) 
    { 
     Sleep(100); 
     SetCoordinate(Player1MuzzleLocation + 3, i); 

    } 
} 

void SetCoordinate(int CoordinateX, int CoordinateY) 
{ 
    COORD Coordinate; 
    Coordinate.X = CoordinateX; 
    Coordinate.Y = CoordinateY; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coordinate); 
} 
+0

Я не уверен, что вы знаете об этом, но ни один из ваших «игровых кодов», которые вы используете ('GetAsyncKeyState',' SetCoordinate' и т. Д.), Является стандартным C++. Это означает, что мы не знаем, что это такое, или если есть какие-либо проблемы с тем, как вы их используете. Я бы честно рекомендовал вам поговорить с вашим инструктором для руководства, так как очень мало мы можем сделать, чтобы помочь вам в отладке вашего кода с таким количеством тайных функций. –

+0

@ChrisBritt это лето, и класс закончился. Я только делаю это, чтобы убить какое-то время. в любом случае, я думал, вы все узнали бы GetASyncKetState(), так что извините. любым способом я буду обновлять код с помощью SetCoordinate(). – Neo

+1

@Neo Поскольку ваш код в значительной степени зависит от Windows API, я пошел дальше и повторно поставил ваш вопрос, чтобы надеяться, вы получите более эффективное воздействие от людей, знакомых с соответствующими функциями. Не стесняйтесь возвращать мое редактирование, если вы не найдете его полезным. – computerfreaker

ответ

1

Вместо того чтобы использовать две различные функции и перемещение одного объекта внутри каждого, вы можете найти лучшие результаты отслеживать, где каждый объект должен быть, и с помощью одной функции рисовать обоих.

Немного сложно рассказать, что происходит в вашем коде, поскольку некоторые функции и объявления переменных отсутствуют (я не вижу, чтобы вы когда-либо на самом деле рисовали пулю, например, может быть ошибка в вашем BulletPattern?), но что-то вроде этого может сделать трюк:

void GameMovements() 
{ 
    while (true) 
    {   
     //MOVEMENTS FOR PLAYER 1 
     if (GetAsyncKeyState(VK_LEFT) && Player1XCoordinate != GAMEBOARD_LEFT) 
     { 
      Player1XCoordinate -= 3; 
     } 
     else if (GetAsyncKeyState(VK_RIGHT) && Player1XCoordinate != GAMEBOARD_RIGHT) 
     { 
      Player1XCoordinate += 3; 
     } 
     else if (GetAsyncKeyState(VK_UP) && Player1YCoordinate != SPACESHIP_TOP) 
     { 
      Player1YCoordinate -= 2; 
     } 
     else if (GetAsyncKeyState(VK_DOWN) && Player1YCoordinate != SPACESHIP_BOTTOM) 
     { 
      Player1YCoordinate += 2; 
     } 

     Sleep(10); 

     UpdateBulletPosition(); 
     DrawObjects(); 
    } 
} 

void UpdateBulletPosition() 
{ 
    //if the bullet hits the top of the screen, remove it 
    if (bulletYCoordinate == GAMEBOARD_TOP) 
    { 
     bulletXCoordinate = 0; 
     bulletYCoordinate = 0; 
    } 

    //I assume you're automatically generating bullets whenever possible; you'll have to adjust this conditional if that's not the case 

    //no bullet? generate one 
    if (bulletXCoordinate == 0) 
    { 
     bulletXCoordinate = Player1XCoordinate + 3; 
     bulletYCoordinate = 25; 
    } 
    else 
    { 
     bulletYCoordinate--; 

     Sleep(100); 
    } 
} 

void DrawObjects() 
{ 
     //wipe the screen and show status first 
     system("cls"); 
     GameBorderAndStatus(); 

     SetCoordinate(Player1XCoordinate, Player1YCoordinate); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinate + 1); 
     cout << "^==|==^ \n"; 

     //only draw the bullet if there's a bullet there to draw 
     if (bulletXCoordinate != 0) 
     { 
      SetCoordinate(bulletXCoordinate, bulletYCoordinate); 
      cout << ".\n"; 
     } 
} 

const int GAMEBOARD_LEFT = 16; 
const int GAMEBOARD_RIGHT = 94; 
const int GAMEBOARD_TOP = 3; 
const int SPACESHIP_TOP = 24; 
const int SPACESHIP_BOTTOM = 28; 

int Player1XCoordinate = 55, Player2XCoordinate = 55; 
int Player1YCoordinate = 28; 
int bulletXCoordinate = 0, bulletYCoordinate = 0; 

Я также внес некоторые изменения в остальную часть вашего кода. В каждом случае в вашем блоке if-else использовался один и тот же базовый код чертежа, поэтому я полностью вытащил его из if-else. Это также позволило мне удалить всю инициализацию if-else.

Я также сбросил одну из ваших вертикальных координат для космического корабля. Вам действительно не нужны два; просто следите за верхней координатой и нарисуйте нижнюю половину судна на Player1YCoordinate + 1.

Наконец, я заменил ваши жестко закрепленные края доски постоянными. Магические числа, как правило, неодобрительно; использование именованных констант упрощает определение того, почему вы используете заданное значение в определенном месте, а также упрощаете обновление кода в будущем (возможно, вам нужно обновить его для другого размера консоли).

+0

@Neo Это считается хорошей практикой, чтобы поддержать ответ, который вы считаете полезным, и принять в качестве правильного ответа. :-) –

+0

@CareyGregory Я бы с удовольствием поддержал, но мне нужно, по крайней мере, 15 репутации, чтобы повысить :( – Neo

Смежные вопросы