@dada_arewnd

Как сделать что бы со временем восстанавливались HP?

Мне нужно что бы раз в 10 минут восстанавливалось 10 HP, и при этом не использовать sleep.
К примеру человек закончил бой и пошел к кузнецу(персонаж в игре), и при этом у него восстанавливались жизни. Но если он снова начал бой то восстановление прекратилось.
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 4
freeExec
@freeExec
Участник OpenStreetMap
Бой закончен, восстановить 10 ХП в 12 часов 32 минуты
Время 11 часов 50 минут, ничего не делаем
Время 11 часов 51 минут, ничего не делаем
Начался бой, восстановление здоровья остановлено
Бой закончен, восстановить 10 ХП в 12 часов 55 минуты
Время 12 часов 03 минут, ничего не делаем
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Разработка игр
software engineer
восстанавливай без слипа.

А если хочешь больше конкретики в ответе, добавь конкретики в вопрос.
Ответ написан
GavriKos
@GavriKos Куратор тега Разработка игр
У 99% игровых движков есть Update. Вот в нем и считайте. Или гуглите как для вашего движка сделать таймер.
Ответ написан
Комментировать
@MasterGod
.

Отслеживать время, и добавлять хп по истечению нужного времени. Используем таймер и события

Логика будет такая :
1 Создаём переменную, ставим значение на 0.
2 далее увеличиваем значение переменной
3 когда истекает 10 минут добавляем 10 хп к жизни персонажа и сбрасывает значение переменной на 0.
4. Если персонаж начинает бой, значение переменной сбрасывается на 0.

В зависимости от движка синтаксис и способы реализации могут отличаться, но логика будет та же самая.
На плюсах это будет выглядеть примерно так:


#include <iostream>
#include <chrono>
#include <thread>

using namespace std;

int main() {
    int maxHP = 100; // максимальное количество HP
    int currentHP = maxHP; // текущее количество HP
    int hpPerInterval = 10; // количество HP, восстанавливаемых за интервал
    int intervalInSeconds = 600; // интервал в секундах (10 минут = 600 секунд)
    
    while (true) {
        auto startTime = chrono::steady_clock::now(); // запоминаем время начала интервала
        
        // сюда вставь  код для обработки событий и действий персонажа
        
        auto endTime = chrono::steady_clock::now(); // запоминаем время окончания интервала
        auto elapsedTime = chrono::duration_cast<chrono::seconds>(endTime - startTime).count(); // вычисляем прошедшее время в секундах
        
        if (elapsedTime >= intervalInSeconds) { // если прошло достаточно времени
            currentHP += hpPerInterval; // увеличиваем текущее количество HP
            if (currentHP > maxHP) {
                currentHP = maxHP; // ограничиваем текущее количество HP максимальным значением
            }
            
            // сюда вставь код для обновления интерфейса и отображения текущего количества HP
            
            startTime = endTime; // обновляем время начала интервала
        }
        
        // сюда вставь  код для обработки других событий и действий персонажа
        
        this_thread::sleep_for(chrono::seconds(1)); // пауза 1 секунда между итерациями цикла
    }
    
    return 0;
}


В начале кода объявляем необходимые переменные: `maxHP` (максимальное количество HP), `currentHP` (текущее количество HP), `hpPerInterval` (количество HP, восстанавливаемых за интервал) и `intervalInSeconds` (интервал в секундах, через который происходит восстановление HP).

Затем входим в бесконечный цикл `while (true)`, который будет выполняться постоянно.

Затем мы входим в бесконечный цикл `while (true)`, который будет выполняться постоянно.

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

Затем мы запоминаем время начала интервала с помощью `auto startTime = chrono::steady_clock::now();`.
После этого запоминаем время окончания интервала с помощью `auto endTime = chrono::steady_clock::now();`.

Потом вычисляем прошедшее время в секундах с помощью `auto elapsedTime = chrono::duration_cast(endTime - startTime).count();`.

После проверяем, прошло ли достаточно времени для восстановления HP с помощью условия `if (elapsedTime >= intervalInSeconds)`.

Если прошло достаточно времени, мы увеличиваем текущее количество HP на `hpPerInterval` и ограничиваем его максимальным значением `maxHP`.

После этого обновляем время начала интервала с помощью `startTime = endTime;`.


В конце каждой итерации цикла делаем паузу на 1 секунду с помощью `this_thread::sleep_for(chrono::seconds(1))`, чтобы не перегруж


решил дополнить c#, пример :

using System;
using System.Timers;

public class HPSystem
{
    private int hp;
    private Timer timer;

    public HPSystem()
    {
        hp = 100; // начальное значение HP
        timer = new Timer(10 * 60 * 1000); // 10 минут в миллисекундах
        timer.Elapsed += OnTimerElapsed;
    }

    public void Start()
    {
        timer.Start();
    }

    public void Stop()
    {
        timer.Stop();
    }

    private void OnTimerElapsed(object sender, ElapsedEventArgs e)
    {
        hp += 10; // увеличение HP на 10
        Console.WriteLine("HP восстановлено: " + hp);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        HPSystem hpSystem = new HPSystem();
        hpSystem.Start();

        // Ваш код игрового цикла
        // ...

        hpSystem.Stop();
    }
}


В этом примере создается класс `HPSystem`, который содержит переменную `hp` для отслеживания текущего значения HP и таймер `timer`, который срабатывает каждые 10 минут. В методе `OnTimerElapsed` происходит восстановление HP на 10 единиц. В основной программе создается экземпляр `HPSystem`, запускается таймер с помощью метода `Start()`, выполняется игровой цикл, а затем таймер останавливается с помощью метода `Stop()`.

javascript примерно так
javascript
let hp = 100; // начальное значение HP
let isFighting = false; // флаг, указывающий, идет ли бой

function restoreHP() {
  if (!isFighting) {
    hp += 10; // восстановление HP
    console.log("HP восстановлено: " + hp);
  }
}

// запускаем восстановление HP каждые 10 минут (600000 миллисекунд)
setInterval(restoreHP, 600000);

// пример использования
// персонаж начинает бой, устанавливаем флаг isFighting в true
isFighting = true;

// персонаж закончил бой, устанавливаем флаг isFighting в false
isFighting = false;

В этом примере функция `restoreHP` будет вызываться каждые 10 минут (600000 миллисекунд), если флаг `isFighting` равен `false`. Когда персонаж начинает бой, флаг устанавливается в `true`, и восстановление HP прекращается. Когда бой заканчивается, флаг снова устанавливается в `false`, и восстановление HP возобновляется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы