Пятница, 22 Ноября 2024, 17:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Есть пару вопросов
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, и в реал-тайме добавляете игрокам ресурсы, во первых процесс добавления ресурсов, хп будет в фоне и не будет грузить сервер, а во вторых, лучше все же опрашивать только онлайн игроков. А когда игрок выйдет из оффлайна, подсчитать ему уже на ходу все, что ему накапало. happy
MagikanДата: Четверг, 23 Мая 2013, 18:31 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата (maker-rus)
а к примеру у него будет тысячный онлайн, миллион зарегистрированных персонажей, а он будет опрашивать сервер постоянно на каждого клиента, загружая в память php файл?

Ему бы для начала просто разобраться как это работает.
По поводу мллиона зарегистрированных не понял - к чему это? Если переживаете за БД, то можно и к NoSQL технологиям прибегнуть или Memcached задействовать.

Цитата (maker-rus)
лучше все же опрашивать только онлайн игроков.

Для браузерок и так все рассчеты производятся только для онлайн-игроков в момент их обращения к серверу.
maker-rusДата: Четверг, 23 Мая 2013, 19:23 | Сообщение # 6
Гений
Сейчас нет на сайте
Цитата
Ему бы для начала просто разобраться как это работает.

Лучше помучатся и понять, как это работает правильно, а не с костылями wink
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);";


Вот так smile
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг