Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: здоровье в онлайн играх
Форумы портала PHP.SU » PHP » Программирование на PHP » здоровье в онлайн играх

Страниц (1): [1]
 

1. кэп88 - 09 Января, 2010 - 20:58:08 - перейти к сообщению
Делаю игрушку. Сразу же столкнулся с проблемой: как сделать восстановление здровья. Там каждую минуту (например) здоровье увеличивается на 1 единицу, пока не достигнет максимума. Каждый раз обращаться к базе и переписывать значение не вариант. Как это реализовать лучше? Взять timestamp, пребавить необходимое время и при каждом обращении расчитывать текущее здоровье?
И может уже есть статья/пример по этой теме? Сильно выручило бы.
Спасибо!
2. Мелкий - 09 Января, 2010 - 21:00:09 - перейти к сообщению
запускать кроном или планировщиком самой базы запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE `table` SET `health` = `health`+1 WHERE `health`<100
3. кэп88 - 09 Января, 2010 - 21:11:31 - перейти к сообщению
А это не создаст большую нагрузку на сервер?
4. Мелкий - 09 Января, 2010 - 21:16:49 - перейти к сообщению
Ну зависит от объёма строк, не равных 100.

Впрочем, если уровень жизни нужен только в пределах одного клиента, т.е. нет нужды его отслеживать для всех сразу - то можно и от времени последнего обновления плясать.
5. кэп88 - 09 Января, 2010 - 21:21:38 - перейти к сообщению
Понятно, спасибо!
6. Nestor - 10 Января, 2010 - 01:03:50 - перейти к сообщению
Вариант без крон.

1. Записываем время последнего мероприятия (сессия, cookies, БД)
2. Вычитаем на сколько изменилось здоровья
3. Обновляем базу
7. Champion - 10 Января, 2010 - 09:42:09 - перейти к сообщению
Можно хранить здоровье и время его изменения без учета того, что оно восстанавливается во времени, чтоб не делать таких ежеминутных апдейтов. А реальное здоровье вычислять при выборке. А обновлять изредка.
8. valenok - 10 Января, 2010 - 11:49:22 - перейти к сообщению
Если Вы хотите чтоб другие пользователи могли увидеть сколько у него здоровья в каждую единицу времени, придетеся записывать в базу. Если не хотите, то можно пересчитывать каждый раз по данным из сессии к примеру, тем не менее в базе хоть что-то хранить придется.
9. Phantik - 10 Января, 2010 - 13:03:57 - перейти к сообщению
В базе хранится здоровье 3мя полями

LastHP - последнее значение здоровья
LastUpdate - временная метка последнего изменения поля LastHP
RegenSpeed - скорость восстановления здоровья Hp\сек.

Когда игре требуется узнать текущее здоровье - происходит подсчет и перезапись в базу.

NewHP = LastHP + RegenSpeed*(time() - LastUpdate);

в базу перезапиcываешь LastHP на NewHP и LastUpdate на time()

 

Powered by ExBB FM 1.0 RC1