| Есть пару вопросов | 
|  | 
| 
| Don_Alexey | Дата: Среда, 22 Мая 2013, 21:36 | Сообщение # 1 |  |   заслуженный участник Сейчас нет на сайте | 1. Как сделать восстановление здоровья через опр. время. У примеру +1 за 2
 секунды. Как это вообще реализовывается?
 2. Работа со временем. (добыча ресурса)
 Как это осуществить я не понимаю. К
 примеру, есть ресурс камень, в БД указанно
 сколько времени нужно для его сбора.
 Нажимаем кнопку пошел отсчет, по
 окончании ресурс добыт +1. И опять это жа
 кнопка.
 Смотрел на форуме примеры, но там такого
 нет или я в силу не сильных знаний не
 увидил.
 А примеры в нете, слишком тяжелые для
 меня.
 
 Офф. Сайт Битва за Олейрент - Это мой сайт посвящённый серии игр Битва за Олейрент.
 Видео прохождение игр - Это мой сайт посвящённый прохождению игр.
 |  |  |  |  | 
| 
| Magikan | Дата: Четверг, 23 Мая 2013, 11:48 | Сообщение # 2 |  | был не раз Сейчас нет на сайте | 
 
 Цитата (Don_Alexey) 1. Как сделать восстановление здоровья через опр. время. У примеру +1 за 2
 секунды. Как это вообще реализовывается?
Хранишь в БД время начала восстановления здоровья и количество здоровья, которое было на тот момент. Когда клиент опрашивает сервер (например, открывает инфу персонажа), сервер берёт текущее время, вычисляет, сколько секунд прошло, определяет, сколько восстановилось здоровья и прибавляет его к тому, которое было на момент восстановления. Это значение и передаёт клиенту (отображает в инфе)
 
 
 Цитата (Don_Alexey) 2. Работа со временем. (добыча ресурса) Как это осуществить я не понимаю. К
 примеру, есть ресурс камень, в БД указанно
 сколько времени нужно для его сбора.
 Нажимаем кнопку пошел отсчет, по
 окончании ресурс добыт +1. И опять это жа
 кнопка.
 Смотрел на форуме примеры, но там такого
 нет или я в силу не сильных знаний не
 увидил.
 А примеры в нете, слишком тяжелые для
 меня.
Точно также. Перед началом сбора ресурса сохраняешь время. Клиент должен опрашивать сервер с каким-то определённым интервалом (например раз в 10 или 20 секунд). Во время этого опроса и проверяется, сколько времени прошло. Как только время завершилось, добавляется ресурс в рюкзачок, а клиенту отправляется соответствующая инфа.
 |  |  |  |  | 
| 
| Don_Alexey | Дата: Четверг, 23 Мая 2013, 12:39 | Сообщение # 3 |  |   заслуженный участник Сейчас нет на сайте | Так то я и сам понимаю, а как это кодом сделать нет. Просто даже не могу примеров найти подрбных, чтоб посмотреть как и что устроенно. 
 Офф. Сайт Битва за Олейрент - Это мой сайт посвящённый серии игр Битва за Олейрент.
 Видео прохождение игр - Это мой сайт посвящённый прохождению игр.
 |  |  |  |  | 
| 
| maker-rus | Дата: Четверг, 23 Мая 2013, 17:47 | Сообщение # 4 |  |   Гений Сейчас нет на сайте | Цитата Точно также. Перед началом сбора ресурса сохраняешь время. Клиент должен опрашивать сервер с каким-то определённым интервалом (например раз в 10 или 20 секунд). Во время этого опроса и проверяется, сколько времени прошло. Как только время завершилось, добавляется ресурс в рюкзачок, а клиенту отправляется соответствующая инфа.а к примеру у него будет тысячный онлайн, миллион зарегистрированных персонажей, а он будет опрашивать сервер постоянно на каждого клиента, загружая в память php файл?
 Для таких целей Don_Alexey, вам нужен для начала vps, а не хостинг. Туда ставите node.js, и в реал-тайме добавляете игрокам ресурсы, во первых процесс добавления ресурсов, хп будет в фоне и не будет грузить сервер, а во вторых, лучше все же опрашивать только онлайн игроков. А когда игрок выйдет из оффлайна, подсчитать ему уже на ходу все, что ему накапало.
   |  |  |  |  | 
| 
| Magikan | Дата: Четверг, 23 Мая 2013, 18:31 | Сообщение # 5 |  | был не раз Сейчас нет на сайте | Цитата (maker-rus) а к примеру у него будет тысячный онлайн, миллион зарегистрированных персонажей, а он будет опрашивать сервер постоянно на каждого клиента, загружая в память php файл? Ему бы для начала просто разобраться как это работает.
 По поводу мллиона зарегистрированных не понял - к чему это? Если переживаете за БД, то можно и к NoSQL технологиям прибегнуть или Memcached задействовать.
 
 
 Цитата (maker-rus) лучше все же опрашивать только онлайн игроков.Для браузерок и так все рассчеты производятся только для онлайн-игроков в момент их обращения к серверу.
 |  |  |  |  | 
| 
| maker-rus | Дата: Четверг, 23 Мая 2013, 19:23 | Сообщение # 6 |  |   Гений Сейчас нет на сайте | Цитата Ему бы для начала просто разобраться как это работает. Лучше помучатся и понять, как это работает правильно, а не с костылями
   |  |  |  |  | 
| 
| Faraon | Дата: Пятница, 24 Мая 2013, 00:35 | Сообщение # 7 |  | почетный гость Сейчас нет на сайте | Приведите пример пожалуйста. |  |  |  |  | 
| 
| Magikan | Дата: Пятница, 24 Мая 2013, 11:48 | Сообщение # 8 |  | был не раз Сейчас нет на сайте | Цитата (Faraon) Приведите пример пожалуйста.
 Цитата (Don_Alexey) Так то я и сам понимаю, а как это кодом сделать нет. Просто даже не могу примеров найти подрбных, чтоб посмотреть как и что устроенно. Лучший пример - хождение по своим граблям. Если бы вы сами попробовали что-нибудь сделать, да выложили бы сюда код, на котором произошёл затык, можно было бы вам ткнуть в то место и даже расписать детально.
 Свой код я сюда выкладывать не собираюсь (пока что), теорию как это делается, я написал.
 |  |  |  |  | 
| 
| Talco | Дата: Пятница, 24 Мая 2013, 18:19 | Сообщение # 9 |  |   почетный гость Сейчас нет на сайте | <?php 
 $id_user = 100500;
 $query = mysql_query("SELECT `hp`, `last_time`, `max_hp` FROM `user_table` WHERE `id_user`=$id_user");
 $result = mysql_fetch_array($query);
 $hp = $result['hp']; // Количество здоровья при последнем обновлении БД
 $max_hp = $result['max_hp']; // максимально возможное количество здоровья
 $last_time = $result['last_time']; // время последнего обновления здоровья
 $seconds = time() - $last_time; // секунд прошло с последнего обновления БД
 $cur_hp = $hp + 0.5*$seconds; // +1 здоровья за 2 секунды
 $current_hp = min($cur_hp, $max_hp); // текущее количество здоровья не должно превышать максимальное
 $query = mysql_query("UPDATE `user_table` `hp`=$current_hp, `last_time`='. time() .' WHERE `id_user`=$id_user");
 
 ?>
 <!-- тоже самое отдаем клиенту -->
 <html>
 <head>
 <script language = 'javascript'>
 function hitPoint() {
 var i = <? echo $current_hp ?>;
 var max = <? echo $max_hp ?>;
 var timer = setInterval(function() { document.getElementById("hp").innerHTML = Math.min(i++, max); }, 2000);
 }
 </script>
 </head>
 <body onLoad = 'hitPoint()'>
 <b>Здоровье: <span id="hp">32</span></b>
 </body>
 </html>
 
 xNova: Революция
 |  |  |  |  | 
| 
| scn | Дата: Суббота, 25 Мая 2013, 17:26 | Сообщение # 10 |  |   был не раз Сейчас нет на сайте | Не знаю решило ли проблему сообщение выше, выложу свой вариант который стоит у меня. Работает с jQuery
 Отображение хп
 
 Код  <span id="thishp"><?=$checkMe['health'];?></span>/<span id="maxhp"><?=MaxHp($checkMe['con']);?></span>
 
 JavaScript:
 
 Код  setInterval("RegenHp()", 1000);
 function RegenHp() {
 var thp = parseInt($('#thishp').html()); // текущее состояние хп
 var mhp = parseInt(con*60);  // максимум хп (выносливость * 60)
 if (thp < mhp) { // Если хп меньше максимума
 $('#thishp').html(thp+1); // добавляется 1 к текущему состоянию хп
 var wd = (thp / mhp * 100); // Это красная полоса хп (ширина)
 $('#health').css({'width':''+wd+'%'});  // отображение полосы
 }
 if (thp > mhp || thp == mhp) { // если хп равно максимуму или больше вдруг
 $('#health').css({'width':'100%'});
 $('#thishp').html(mhp);
 }
 }
 
 Каждые 5 сек идет аякс запрос к файлу refresh.php где обновляет данные и редактирует хп
 
 файл refresh.php:
 
 Код  function MaxHp($con) {
 return $con * 60;
 }
 $hpcoef = 1; // Сколько хп восстанавливать в секунду
 $row = mysql_fetch_array(mysql_query("SELECT `con`, `lastupdate`, `health` FROM `gm_users` WHERE `id` = $id LIMIT 1"));
 $maxhp = MaxHp($row['con']);
 $uphp = round((time() - $row['lastupdate']) * $hpcoef + $row['health']);
 if ($uphp > $maxhp) $uphp = $maxhp;
 @mysql_query("UPDATE `gm_users` SET `lastupdate` = ".time().", `health` = $uphp WHERE `id` = $id LIMIT 1");
 echo "$('#thishp').html($uphp);";
 
 Вот так
   |  |  |  |  |