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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: здоровье в онлайн играх

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
кэп88
Отправлено: 09 Января, 2010 - 20:58:08
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Делаю игрушку. Сразу же столкнулся с проблемой: как сделать восстановление здровья. Там каждую минуту (например) здоровье увеличивается на 1 единицу, пока не достигнет максимума. Каждый раз обращаться к базе и переписывать значение не вариант. Как это реализовать лучше? Взять timestamp, пребавить необходимое время и при каждом обращении расчитывать текущее здоровье?
И может уже есть статья/пример по этой теме? Сильно выручило бы.
Спасибо!
 
 Top
Мелкий Супермодератор
Отправлено: 09 Января, 2010 - 21:00:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




запускать кроном или планировщиком самой базы запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE `table` SET `health` = `health`+1 WHERE `health`<100


-----
PostgreSQL DBA
 
 Top
кэп88
Отправлено: 09 Января, 2010 - 21:11:31
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




А это не создаст большую нагрузку на сервер?
 
 Top
Мелкий Супермодератор
Отправлено: 09 Января, 2010 - 21:16:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну зависит от объёма строк, не равных 100.

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


-----
PostgreSQL DBA
 
 Top
кэп88
Отправлено: 09 Января, 2010 - 21:21:38
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Понятно, спасибо!
 
 Top
Nestor
Отправлено: 10 Января, 2010 - 01:03:50
Post Id



Частый гость


Покинул форум
Сообщений всего: 220
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Вариант без крон.

1. Записываем время последнего мероприятия (сессия, cookies, БД)
2. Вычитаем на сколько изменилось здоровья
3. Обновляем базу

(Отредактировано автором: 10 Января, 2010 - 01:04:06)



-----
Aurus CMS
 
 Top
Champion Супермодератор
Отправлено: 10 Января, 2010 - 09:42:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Можно хранить здоровье и время его изменения без учета того, что оно восстанавливается во времени, чтоб не делать таких ежеминутных апдейтов. А реальное здоровье вычислять при выборке. А обновлять изредка.
 
 Top
valenok Модератор
Отправлено: 10 Января, 2010 - 11:49:22
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




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


-----
Truly yours, Sasha.
 
My status
 Top
Phantik
Отправлено: 10 Января, 2010 - 13:03:57
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




В базе хранится здоровье 3мя полями

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

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

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

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

(Отредактировано автором: 10 Января, 2010 - 13:05:58)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB