std :: chrono Не пойму, как использовать

155
20 марта 2018, 01:42

Работаю над заданием по созданию игры "Танчики" (Battle city). И уже почти все готово, но не могу настроить скорость полета снарядов. Они у меня молниеносно проходят всю карту, пока не долетят до препятствия. Узнал про std :: chrono, но никак не пойму, как его использовать.

      void tanks :: fire() {
    bullet();
    if (map[bulletY - 3][bulletX] == ' ' && map[y - 1][x] == 'I') {
        bulletY -= 2;
        for (int i = bulletY; i > 0; i--) {
            time_t BulletTimeNow = time(NULL);
            map[bulletY + 1][bulletX] = ' ';
            bulletY -= 1;
            if (map[bulletY - 2][bulletX] != ' ') {
                map[bulletY][bulletX] = ' ';
            }
            else {
                map[bulletY][bulletX] = 'o';
                time_t BulletTimeOld = time(NULL);
                if ((BulletTimeNow - BulletTimeOld) < 50) continue;
            }
        }
    }
}
Answer 1

Я бы использовал не время, а скорость (bulletSpeed = 0,052) и в цикле к координатам снаряда прибавлял скорость, но если ты принципиально хочешь через время, то проще сделать через time

Что-то типа

time_t BulletTimeOld = time(NULL);
time_t BulletTimeNow = time(NULL);
if ((BulletTimeNow - BulletTimeOld) < 200) continue;

где 200 - это время в миллисекундах (0.2 сек), за которое снаряд пролетает одну клетку.

UPD

Я уже и написал, что вводишь переменную скорости, и с каждым тиком цикла меняешь координаты в зависимости от скорости. Раз у тебя текстовая игра, то нужно координаты хранить в float, а рисовать снаряд на округлённых координатах.

Не знаю, как у тебя устроена игра, но по хорошему, должен быть отдельный бесконечный цикл, в котором последовательно выполняются все действия (движение_танка->движение_снаряда->проверка_на_попадание и т.д.) после чего уходить в сон на необходимое время.

Через время реализовывать плохая идея, ибо если прошло, допустим 192мс, то при ограничении 200мс, эти 192мс просто не засчитается, будто снаряд просто застыл на это время.

UPD2 Попробуй так

time_t BulletTimeOld = time(NULL);
void tanks :: fire() {
    bullet();
    if (map[bulletY - 3][bulletX] == ' ' && map[y - 1][x] == 'I') {
        bulletY -= 2;
        for (int i = bulletY; i > 0; i--) {
            map[bulletY + 1][bulletX] = ' ';
            bulletY -= 1;
            if (map[bulletY - 2][bulletX] != ' ') {
                map[bulletY][bulletX] = ' ';
            }
            else {
                map[bulletY][bulletX] = 'o';
                time_t BulletTimeNow = time(NULL);
                if ((BulletTimeNow - BulletTimeOld) < 50) continue;
                else BulletTimeNow = = time(NULL);
                }
            }
        }
    }
}
READ ALSO
Расширение интерфейса библиотеки

Расширение интерфейса библиотеки

В книге Брюса Эккеля "Философия С++ часть 2" автор приводит пример использование множественного наследование в качестве средства для расширения...

157
syntax error C2760. Что означает?

syntax error C2760. Что означает?

Добрый деньПомогите пожалуйста найти ошибку в коде

241
Как закрыть Socket?

Как закрыть Socket?

есть отдельный поток класс который работает с Socket-омКогда я отключаю клиент он все равно продолжает работать

193