@nezzard

Как продумать регенерацию жизней на php?

Добрый вечер, допустим есть миниигра, у игрока есть 100 пунктов жизни, если ему нанесли урон, то жизни должны восстанавливатся.
Я думал сделать так:
-В бд есть указанное общее количество жизней, например 100
-Скорость восстановления 1 пункта 1 секунда
-В бд заноситься последнее время когда игроку наносили урон
-Ну а потом расчетом времени регенерировать. На стороне клиента анимировать через javascript, на стороне сервера обновлять, когда клиент обновил страницу.

Но правильно ли это? Подскажите пожалйста
  • Вопрос задан
  • 2389 просмотров
Пригласить эксперта
Ответы на вопрос 5
nobodynoone
@nobodynoone
Да, почему бы и нет.
Ответ написан
@larionov_n
Используйте sleep для обновления и чтения с БД.
while(1) {
    exec('php path/to/script.php');
    sleep(20);
}


Или Mysql:

CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 15 MINUTE
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
Правильный подход в данном типе игр реализуется через использование технологий в виде демонов и разделяемых структур в памяти.
Приведенный пример как нельзя лучше вписывается в приложение, использующее WebSockets для транспорта данных и Node.JS сервер с хранилищем в виде Redis. NodeJs использует концепцию таймеров и событий для подобных вещей. .
Оба вышеприведенных примера достаточно примитивны и подходят для игрушек с небольшим количеством одновременных игроков. С ростом их количества начнут появляться проблемы с блокировкой строк в базе и т.п.
В общем где-то до 1000 игроков это еще будет работать, но потом появятся серьезные проблемы производительности.
Ответ написан
BoneFletcher
@BoneFletcher
Можно попробовать использовать reactphp вместе с event-loop. Это позволит сильно сократить количество запросов к БД, т.к. большинство данных (те же самые жизни игроков) можно хранить в переменных и работать с ними.

Есть хорошая статья, где автор сделал свой поисковик, который обрабатывает страницы раз в секунду:
elfet.ru/creating-a-search-engine-on-react-php
Ответ написан
Комментировать
Я бы занес в базу такой параметр, как скорость регенерации, при каждом обращении клиента к серверу - проверял бы, не пора бы регенерировать жизнь. Для того, что бы это было безопасно, вам надо проверить не только время нанесения последнего урона, но и время последней регенерации.
Иными словами, в базе будем хранить:
урон(кол-во, время наненсеня)
регенерация(сколько едениц регенерировать, как часто, время последней регенерации)
При обращении клиента к серверу(рекомендую сделать некий запрос poll, который будет запрашивать необработанные игровые события, такие как регенерация) спрашиваем, сколько у игрока жизней. Если меньше 100, то проверяем, дату нанесения последнего урона и можем ли мы пользователю отрегенить жизнь, если да, то делаем это и возвращаем клиенту событие регенерации, которое он отрисует уже как хочет.
Регенирировать мы можем в следующих случаях:
  1. Пользователь получил урон, но еще небыло регенераций, а время регенерации уже >= текщему времени - время нанесения урона
  2. Пользователь получил урон, регенерации были, и время регенерации уже >= текущему времени - время последней регенерации


По такой схеме Вы сможете не только в "реальном времени"(конечно, это не websockets, но все же) регенирировать игрока, но и, например, если он был в оффлайн и не поллил игровые события вычислить сколько жизней он отрегенил, пока был оффлайн.

Полл-запрос можете делать, например, каждую секунду. Ну и вообще, присмотритесь к идеям, которые я Вам изложил, особенно про игровые события и полл. Я имею некий опыт в геймдеве, в том числе на PHP и эта практика для небольших игр довольно неплохо себя зарекомендовала.
Ответ написан
Ваш ответ на вопрос

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

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