Реалтайм стратегия. Ресурсы и действия.
| |
Indev | Дата: Пятница, 03 Августа 2012, 08:32 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Здравствуйте! Прошу помощи! Создаем стратегию в реальном времени. Как правильно организовать производство ресурсов, даже когда пользователь не в сети? На верхней панели отображаются ресурсы. Возможно ли обновлять ее постоянно посредством Аякса? Также пользователь может отправлять экспедиции, каким образом хранить их в бд и как отсчитывать время рациональнее?
П.С. Если я не правильно выразился, дайте знать
Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
|
|
| |
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. Не зря же я ссылку скинул Добавлено (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) скорее всего будет тупить при больших объемах БД Обычно, с увеличением объёма бд, увеличивается объём кошелька, а с большим кошельком можно купить мощную машину, что бы не тупило. И если запускать крон раз в полчаса, то большого объема не должно быть... Ну это всё теоретически
Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
|
|
| |
Indev | Дата: Пятница, 03 Августа 2012, 10:43 | Сообщение # 11 |
частый гость
Сейчас нет на сайте
| Quote (Nosorog) Юзер X отправил разведку с планеты А на планету Б в 12:59, записали в базу эти данные... Пишем класс, который не обрабатывает передачу параметров клиента, а работает с базой. И подключаем его ко всем страницам игры, таким образом, достаточно одного юзера онлайн для обновления всех операций(разведка, постройка зданий и т.п.) Тоесть Вы предлагаете использовать для обновления ресурсов скрипт на стороне пользователя?Добавлено (03.08.2012, 10:43) --------------------------------------------- Дело в том, что мне нужно каждую секунду обновлять кол-во ресов.
Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
|
|
| |
Nosorog | Дата: Пятница, 03 Августа 2012, 10:59 | Сообщение # 12 |
участник
Сейчас нет на сайте
| Да, JavaScript+MySQL Я предлагаю для обновления ресурсов использовать 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(){}); выполняется до нажатия на кнопку. В других местах похожий код нормально исполняется.
Завел аккаунт в Твиттере, буду постить сообщения о разработке игры. Подписывайтесь)
|
|
| |
|