Вторник, 26 Ноября 2024, 12:19

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Реалтайм стратегия. Ресурсы и действия.
IndevДата: Пятница, 03 Августа 2012, 08:32 | Сообщение # 1
частый гость
Сейчас нет на сайте
Здравствуйте! Прошу помощи! Создаем стратегию в реальном времени. Как правильно организовать производство ресурсов, даже когда пользователь не в сети?
На верхней панели отображаются ресурсы. Возможно ли обновлять ее постоянно посредством Аякса?
Также пользователь может отправлять экспедиции, каким образом хранить их в бд и как отсчитывать время рациональнее?

П.С. Если я не правильно выразился, дайте знать sad


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
AnarchystДата: Пятница, 03 Августа 2012, 08:35 | Сообщение # 2
Chaotic Evil
Сейчас нет на сайте
Quote (Indev)
Также пользователь может отправлять экспедиции, каким образом хранить их в бд и как отсчитывать время рациональнее?

Время? Я бы записывал дату, до которой должна быть экспедиция и проверял бы ее при апдейте.

Quote (Indev)
Как правильно организовать производство ресурсов, даже когда пользователь не в сети?

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


Good отстой, Neutral - параша, Evil, хой, победа наша!
IndevДата: Пятница, 03 Августа 2012, 08:55 | Сообщение # 3
частый гость
Сейчас нет на сайте
Quote (Anarchyst)
Каждый день, например, в полночь делать апдейт и рассчитывать, сколько кому должно добавиться ресурсов через их прирост в секунду.

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


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
AnarchystДата: Пятница, 03 Августа 2012, 08:58 | Сообщение # 4
Chaotic Evil
Сейчас нет на сайте
Quote (Indev)
Не пойдет, необходимо обновлять постоянно, например есть 1000 ресов, и только кол-во увеличилось до 1001, сразу отобразить, без обновления страницы.
Ну и время так же должно отображаться.

Это я про начисление, когда игрок оффлайн.


Good отстой, Neutral - параша, Evil, хой, победа наша!
IndevДата: Пятница, 03 Августа 2012, 09:07 | Сообщение # 5
частый гость
Сейчас нет на сайте
Ну есть функция разведки планеты одного игрока другим, как тогда?
Если первый не в сети?


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
NosorogДата: Пятница, 03 Августа 2012, 09:16 | Сообщение # 6
участник
Сейчас нет на сайте
Quote (Indev)
На верхней панели отображаются ресурсы. Возможно ли обновлять ее постоянно посредством Аякса?
Также пользователь может отправлять экспедиции, каким образом хранить их в бд и как отсчитывать время рациональнее?

Загляни сюда
Quote (Indev)
Ну есть функция разведки планеты одного игрока другим, как тогда?
Если первый не в сети?

Производить расчеты не для одного игрока, а сразу для всех.


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
IndevДата: Пятница, 03 Августа 2012, 09:21 | Сообщение # 7
частый гость
Сейчас нет на сайте
Quote (Nosorog)
Производить расчеты не для одного игрока, а сразу для всех.

Скриптом на сервере? И каким именно образом?
И как все-таки обновлять панель ресурсов?


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)

Сообщение отредактировал Indev - Пятница, 03 Августа 2012, 09:23
NosorogДата: Пятница, 03 Августа 2012, 09:50 | Сообщение # 8
участник
Сейчас нет на сайте
Quote (Indev)
Скриптом на сервере? И каким именно образом?

Юзер X отправил разведку с планеты А на планету Б в 12:59, записали в базу эти данные...
Пишем класс, который не обрабатывает передачу параметров клиента, а работает с базой. И подключаем его ко всем страницам игры, таким образом, достаточно одного юзера онлайн для обновления всех операций(разведка, постройка зданий и т.п.)
Quote (Indev)
И как все-таки обновлять панель ресурсов?

Quote (TimKruz)
Алгоритм:
1. Игрок сделал запрос на начало работы.
2. Получили время начала в секундах, прибавили N секунд.
3. Полученное время - в базу данных.
4. Если игрок делает запрос о времени или попытку делать что-то ещё, например, обновление страницы с выводящимся таймером (таймер делается банальным обратным отсчётом на JS), запрос на действие, вход в игру (с отображением таймера или статуса действия), - либо считываем и отправляем игроку время, когда работа будет закончена (а JS-скрипт обработает), либо вычисляем оставшееся время и отправляем. Тут замечание:
4.1. Если при проверке выяснится, что время уже прошло - просто удаляем (обнуляем) запись в базе данных, и формируем страницу, соответствующую состоянию простоя (персонаж ничего не делает), либо, если игрок уже запросил действие, осуществляем это действие, т.е. переходим к пункту 1.
4.2. Счётчик на JS, при достижении 0, просто выводит сообщение о завершении работы и, возможно, переводит страницу в состояние простоя (заменяет табличку с таймером на табличку с сообщением о бездействии). При этом запись в базе данных будет удалена только тогда, когда игрок сделает новый запрос, однако по этому поводу беспокоиться не нужно, т.к. по сути эта запись в БД никому не мешает.
4.3. Возможен ещё один вариант удаления записи из БД: если кто-то зайдёт на страницу профиля игрока, на которой отображается статус персонажа. Тогда при следующем запросе от самого игрока ничего удалять не придётся, там и так будет стоять 0.

На счёт времени. В PHP-коде переводить часы в минуты и т.п. тебе в принципе-то и не нужно, ты оперируешь с секундами. Например, если операция длится 1 час - прибавь к текущему времени 3600 и запиши в базу. Скорей всего, ты будешь переводить секунды в часы на JS, а там специальные функции обработки времени есть. Да и в PHP есть, но тебе же не нужны статичные HTML-страницы, нужна хоть какая-то динамика...

Для ясности приведу пример.
1. Игрок нажал на кнопку "рубить дрова 1 час".
2. Сервер получил запрос, считал текущее время - 150000, прибавил к нему 3600, внёс в базу данных статус - "рубка дров" и число 153600.
3. Игрок получил страницу с таймером на JS. Этот таймер каждую секунду вычитает из 3600 единицу, переводит это число в строку типа "Осталось HH:mm" и выводит как текст в блок типа <div> на странице. Возможно дополнение - "Завершение работы в HH:mm, DD MM YYYY".
4. Игрок сделал запрос, когда было только 152000 секунд.
5. Сервер проверил БД: завершение в 153600, а 153600 больше, чем текущее время (серверной машины) - 152000. Он просто отправляет ту же страницу, что и была, но с сообщением "невозможно начать новую работу до завершения старой", при этом оставшиеся секунды сменяются с 3600 на 1600, потому что JS-таймер после перезагрузки страницы будет сброшен.
6. Наступило время X, JS-таймер досчитал до 0, выдал в <div> информацию о завершении и отключился.
7. Во время 154000 игрок снова сделал запрос.
8. Сервер проверил БД: завершение в 153600, однако уже 154000, т.е. 153600 меньше 154000. Сервер удаляет эту запись и отправляет игроку запрашиваемую страницу (выполняет требуемую задачу, возвращаясь к пункту 2).

Как-то так. Все необходимые функции можешь легко найти в справочниках по PHP и JS.

Не зря же я ссылку скинул smile

Добавлено (03.08.2012, 09:50)
---------------------------------------------
А может не стоит изобретать велосипед, а взять на халяву нормальный мотоцикл 2Moons


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
VinchensooДата: Пятница, 03 Августа 2012, 09:53 | Сообщение # 9
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Повесь на крон, правда, скорее всего будет тупить при больших объемах БД.
А лучше улучшать алгоритмически.
Например, у тебя обновление данных о ресурсах требуется в двух случаях:
1. Игрок онлайн
2. Кто-т разведывает планету игрока.
Вот тут и вешай. Храни время с последнего события.
Например, я оффлайн. Ты разведуешь мою планету. Заходишь, с последнего начисления ресурсов прошло 100 секунд, во время запроса на разведку мне автоматически добавляется +100 к ресурсу.

Когда я онлайн, то все пересчитывается с помощью аякса. Можно заняться оптимизацией совсем на уровне бреда.
Если, например, происходит +1 ресурс каждую секунду, я бы не долбился на сервер. Повесил бы вычисление ресурсов на таймер в клиенте(чтобы прибавляло единицу каждую секунду), а по прошествии N секунд(например, 60), я бы стучал на сервер и синхронизировал инфу, например, клиент убежал на 1 вперед, значит делаем -1. И так далее =)


NosorogДата: Пятница, 03 Августа 2012, 10:22 | Сообщение # 10
участник
Сейчас нет на сайте
Quote (Vinchensoo)
скорее всего будет тупить при больших объемах БД

Обычно, с увеличением объёма бд, увеличивается объём кошелька, а с большим кошельком можно купить мощную машину, что бы не тупило.
И если запускать крон раз в полчаса, то большого объема не должно быть... Ну это всё теоретически smile


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
IndevДата: Пятница, 03 Августа 2012, 10:43 | Сообщение # 11
частый гость
Сейчас нет на сайте
Quote (Nosorog)
Юзер X отправил разведку с планеты А на планету Б в 12:59, записали в базу эти данные...
Пишем класс, который не обрабатывает передачу параметров клиента, а работает с базой. И подключаем его ко всем страницам игры, таким образом, достаточно одного юзера онлайн для обновления всех операций(разведка, постройка зданий и т.п.)

Тоесть Вы предлагаете использовать для обновления ресурсов скрипт на стороне пользователя?

Добавлено (03.08.2012, 10:43)
---------------------------------------------
Дело в том, что мне нужно каждую секунду обновлять кол-во ресов.


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
NosorogДата: Пятница, 03 Августа 2012, 10:59 | Сообщение # 12
участник
Сейчас нет на сайте
Да, JavaScript+MySQL biggrin Я предлагаю для обновления ресурсов использовать php+sql, а для отображения в клиенте счётчик на JS.

Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
VinchensooДата: Пятница, 03 Августа 2012, 11:06 | Сообщение # 13
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Indev, тогда хороший вариант, который я предположил.
Ресурсы обновляются при непосредственном обращении: разведка либо действия пользователя.
Когда пользователь онлайн, то счетчик на js просто по таймеру начисляет +1 каждую секунду, а раз в 60 или там 120 секунд информация актуализируется(сверяется с сервером). Т.е. нагрузка на сервер снижена в 60 или 120 раз, но, тем не менее, система безопасна)


NosorogДата: Пятница, 03 Августа 2012, 12:09 | Сообщение # 14
участник
Сейчас нет на сайте
Quote (Vinchensoo)
Т.е. нагрузка на сервер снижена в 60 или 120 раз

По сравнению с чем?


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
IndevДата: Пятница, 03 Августа 2012, 12:12 | Сообщение # 15
частый гость
Сейчас нет на сайте
Quote (Nosorog)
По сравнению с чем?

По сравнению с ежесекундными обращениями к базе, я полагаю.

Добавлено (03.08.2012, 12:12)
---------------------------------------------
А с помощью JavaScript можно обращаться к бд? Безопасно ли это?


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
NosorogДата: Пятница, 03 Августа 2012, 12:21 | Сообщение # 16
участник
Сейчас нет на сайте
Quote (Indev)
По сравнению с ежесекундными обращениями к базе, я полагаю.

Вроде как, никто не предлагал ежесекундно обращаться к базе?! Обновил юзер страницу, выполнился запрос к базе...
Quote (Indev)
А с помощью JavaScript можно обращаться к бд? Безопасно ли это?

Нельзя.


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
gmmmmДата: Пятница, 03 Августа 2012, 12:26 | Сообщение # 17
почетный гость
Сейчас нет на сайте
Как ты обратишься от js к базе, если javascript предполагает решение только клиентских задач.
Чем не устраивает php?


пусто!)
IndevДата: Пятница, 03 Августа 2012, 12:31 | Сообщение # 18
частый гость
Сейчас нет на сайте
Подскажите, как значение из PHP кода передать к счетчику JS?

Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)

Сообщение отредактировал Indev - Пятница, 03 Августа 2012, 12:41
NosorogДата: Пятница, 03 Августа 2012, 12:42 | Сообщение # 19
участник
Сейчас нет на сайте
<script>resource="<? echo $res; ?>"</script>

Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
IndevДата: Пятница, 03 Августа 2012, 13:27 | Сообщение # 20
частый гость
Сейчас нет на сайте
Ясно, спасибо!

Добавлено (03.08.2012, 13:27)
---------------------------------------------
Не получается!
У меня код:

Code
<script type=text/javascript>
$(document).ready(function(){
$(".tutorial_start").click(function(){
<?
include ("bd.php");   //Файл в котором выполняется подключение к бд;
$result = mysql_query("UPDATE tutorial SET task = '1.2' WHERE id='$id'",$db);
$result = mysql_query("UPDATE action SET action = '1' WHERE id='$id'",$db);
$result = mysql_query("UPDATE action SET action_time = '15' WHERE id='$id'",$db);
?>
});
});
</script>

Почему-то код внутри функции
Code
$(".tutorial_start").click(function(){});
выполняется до нажатия на кнопку.
В других местах похожий код нормально исполняется.


Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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