Есть пару вопросов
|
|
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);";
Вот так
|
|
| |