Нужны ли параллельные циклы?

Я делаю текстовую игру, используя библиотеку Curses. Есть часть игры, где игрок выходит на «арену». Находясь внутри арены, программа должна запустить цикл (1), который позволяет игроку двигаться, а также запустить цикл (2), который перемещает врагов вокруг. Цикл (2) необходимо отложить с помощью Sleep, чтобы враги двигались медленнее, чем игрок. Исследуя этот вопрос, я столкнулся с тем, что называется многопоточностью. Я не уверен, что мне нужно учиться этому, чтобы получить желаемые результаты. Мне нужно, чтобы одна из этих функций зациклилась медленнее, чем другая.

While ( true )
{
movePlayer(player_xy);
arena.moveEnemies();
}

0

Решение

Структура просто игра обновит позиции перед рендерингом каждого кадра.

Вот упрощенный пример, который должен соответствовать вашим потребностям. Для получения дополнительной информации посетите gamedev.net, там вы найдете множество учебников и руководств для вашей игры.

Псевдокод ниже

MainLoop()
{
// Get Keyboard Input
...

// Game Logic Impl
...

// Update Positions
UpdatePlayerPosition();

for each ai
UpdateAiPosition();

// Check for sound triggers
ProcessSoundTriggers();

// Draw the scene if needed, you can skip some to limit the FPS
DrawScene();

// Flip the buffers if needed ...
DoubleBufferFlip();

}
3

Другие решения

Вам не нужно использовать многопоточность для этого. Один из подходов, который вы можете использовать, состоит в том, чтобы рассчитать время, прошедшее между каждым вызовом основного цикла, и использовать его для обновления позиции игроков. Вы также можете проверить ввод пользователя и использовать его для обновления позиции пользователя. Вы можете умножить прошедшее время на разные константы, чтобы контролировать относительные скорости движения. Более подробное объяснение игрового цикла можно найти здесь: http://www.koonsolo.com/news/dewitters-gameloop/

1

использовать заголовочный файл библиотеки stl <нить>
Вы можете определить циклы в двух функциях
Например:

#include<chrono>
#include<thread>
void fun1(){
while(/*condition*/){
//statments
std::this_thread::sleep_for (std::chrono::seconds(1));
}
}
void fun2(int y){
while(/*codition*/){
//statments
std::this_thread::sleep_for (std::chrono::seconds(2));
}
}
void main(){
std::thread th1(fun1);
std::thread th2(fun2,5);
//now both thread are running concurrently
}

Для более подробной информации обратитесь к ссылке:
http://www.cplusplus.com/reference/thread/thread/

1

Если вы хотите избежать многопоточности, вы можете запускать петли с высокой частотой и позволить игроку перемещать каждые X петель, тогда как враги могут перемещать только каждые Y петель. Таким образом, вы можете варьировать соотношение скорости движения игрока и врага и устанавливать смещения таким образом, чтобы разные враги перемещались в разное время (т. Е. В течение другого цикла цикла).

Примерно так (псевдокод):

int loop_counter = 0;
while(doing_battle)
{
if (loop_counter is a multiple of X)
{
Move player;
}

if (loop_counter is a multiple of Y)
{
Move evenmy_0;
}

if ((loop_counter + offset_1) is a multiple of Y)
{
Move enemy_1;    // This enemy will move at a different time from enemy_0
}

loop_counter++;

delay();    // Will vary based on how quickly things need to move and how long your loop takes to complete
}
0
По вопросам рекламы [email protected]