[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помощь в разработке онлайн игры
MefiseRay
Как создать скрипт который будет обеспечивать восполнение здоровья персонажа в браузерной онлайн игре и корректно отображать эту информацию.

Есть онлайн игра которую я сам создаю. есть БД и PHP страничка клиента.
Вверху странички показывается текущее здоровье персонажа. Необходимо чтобы при неполном здоровье оно восстанавливалось и изменения записывались в бд и отображались на страничке.

Было применено несколько способов для решения.
1) создал демон который работает в фоновом режиме не сервере и раз в 30 секунд обращается к базе данных и меняет в ней значения, а клиент подхватывает изменения подгружая из из базы. Все работает но проблема в том, что мне нежелательно использовать демона на сервере.

2) в самом php скрипте стоит функция которая раз в 30 секунд обращается к базе данных и меняет в ней значения. изменения происходят но при рефреше страницы производятся незапланирвоанные изменения + слабая безопасность, так как при желании аднные можно перехватить и подсунуть свои.

3) вариант когда скрипт php раз в 30 секунд ображается к базе для внесения в нее изменений, причем каждый раз при обращении в бд записывается также и время последнего изменения. В зависимости от диапазона времени и происходит изменение в базе данных. Этот способ работает так как нужно, но проблема в том что не хотелось бы хранить лишние данные в базе и скрипту не всегда удается корректно отображать информацию о здоровье. как я подозреваю проблема в неточности временных рамок.

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



Спустя 1 час, 27 минут, 21 секунда (10.09.2011 - 15:47) YVSIK написал(а):
Цитата
вопрос в том, как реализовать скрипт атовостановления здоровья?!

ну и далее по тексту, приводишь пример 1,2, и тд. кто-нить ответит,а так это просто слова , так принято на этом форуме))
почитай Правила и они не больше твоего вопроса ))
2.3. d. наиболее полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты получены.

Спустя 1 час, 4 минуты, 12 секунд (10.09.2011 - 16:52) twin написал(а):
Все гораздо проще. Не нужно ничего менять, пока не будет запрошена страница. Ведь персонаж не по настоящему живой smile.gif и что происходит на сервере никому не интересно. А вот когда данные будут запрошены, тут и нужно произвести необходимые расчеты.

Спустя 8 часов, 39 секунд (11.09.2011 - 00:52) MefiseRay написал(а):
Тоесть хранить время последнего изменения в базе данных, при запросе сравниват временной промежуток и на этой основе проводить изменения? я так понимаю?

Спустя 7 минут, 12 секунд (11.09.2011 - 00:59) Игорь_Vasinsky написал(а):
twin
д.Коль и в такой теме..... коррупция чтоли... не спроста это.

Спустя 1 день, 22 часа, 16 минут, 58 секунд (12.09.2011 - 23:16) MefiseRay написал(а):
Данная проблемма была решена.
На сервере в бд хранится время последнего обращения. при обращении происходят соответствующие расчеты результат которых фиксируется в бд и передается в явовскую функцию, которая эмитирует процесс восполнения жизни в динамическом исполнении, хотя на самом деле никаких изменений не проводит.

Спустя 5 минут, 14 секунд (12.09.2011 - 23:22) MefiseRay написал(а):
Появилась нвоая проблемма.

модуль пошагового боя, когда все икроки елают шаги одновременно и потом их действия также одновременно выполняются. Вопрос заключается в том, как сделать без постоянного обращения к бд эмуляцию параллельности работы. Объясняю подробнее.

один игрок сделал свой ход и ожидает когда другой игрок сделает свой ход, при этом переодически опрашивает сервер на то был ли совершен ход всеми игроками в текущем бою (так реализованно сейчас) если все ходы сделаны, то происходит расчет последствий ходов. Но тут я столкнулся с проблеммой. все действия я записывал в бд и когда 4 игрока заканчивали ходу всех четверых одновременно запускался скрипт который пытается расчитатьто что произошло на боле боя и записать это в бд. А это есть не хорошо. Вопрос, можно ли ка-то заставить php работать в параллельном режиме.

Спустя 47 минут, 55 секунд (13.09.2011 - 00:10) inpost написал(а):
MefiseRay
Можно одного из игроков назначать ведущим, им и производить все расчеты, по этой же аналогии устроены все настольные игры, в случае, если никаких действий игрок №1 не запросил, тогда по истечению 20 сек., допустим, ведущим назначать другого, и от его лица производить расчеты. Сами действия храни в БД.
Есть и другой способ, хранить в отдельной таблице идентификатор, что данный человек начал действие, допустим подсчет данных, значит другие игроки будут проверять наличие в этой таблице этого поединка этого раунда на предмет начала действий, и если есть, то ждать и получать результат, в противном случае поменять, что они начале результат вычислений, и сами это проводят.

Надеюсь я понял, в чём заключается твой вопрос smile.gif

Спустя 16 часов, 24 минуты, 4 секунды (13.09.2011 - 16:34) MefiseRay написал(а):
inpost, спасибо за совет. Вы все правильно поняли. Я тоже не терял времени даром и нашел еще пару способов, впорос только в том какой из них наиболе эфективный.

Способы реализации:
1) расчеты перекладываются на фиксированного игрока, если он вылетел из сети, тогда расчеты выполняет следующий в списке. (совпадает с советом inpost)

2) расчеты выполняют параллельно все игроки, попеременно обращаясь к базе данных и удаляя из лога уже обработанные действия. (проблемма - частое обращение бд, невозможно обработать сложные действия состоящие из нескольких взаимодействий)

3) расчеты выполняют все пользователи но получают результаты только непосредственно для себя и заносят их в бд. (работает отлично, уже протестировал, единственная проблемма много одинаковых расчетов и невозможность расчетов для игроков которые ушли в дисконект. Последнюю проблему планируется решить путем переноса расчетов на для этого пользователя на какого-то игрока или просто засчитать поражение и поставить параметр hp в 0)

интерисует ваше менение по данным вариантам реализации, особенно интерисуют ваши идеи о том как можно исправить баг в третем способе (там где я привел свои способы исправления)

Спустя 14 минут, 15 секунд (13.09.2011 - 16:48) inpost написал(а):
MefiseRay
Пользователь должен хранить у себя лишь визуальную часть расчетов, логическая должна выполняться лишь 1 раз, иначе будет .как ты уже сказал, переизбыток данных.
У тебя не только будет проблема по переизбытку данных, но ещё и трудность в анализировании результатов, поиске багов внутри одной битвы. Когда данные единичны и линейны, то найти недостающий дефект гораздо проще, чем когда он дублируется, а если игроков вообще на столе будет около 10, то хранить в БД информации в 10 раз больше? Это неправильно.

Вообщем, тебе надо создавать виртуальную область, где будут происходить расчеты, а не у каждого пользователя, если баг произойдет, и у одного будет в его таблице числиться ХП 2, а у второго - ХП 3? Что тогда? Поэтому данные должны храниться в единичном варианте. Поэтому лучше первый вариант.

Есть как альтернатива использовать CRON, и делать нужные обработки на стороне сервера, а пользователи тогда будут дергать лишь данные. Но мне что-то за 2 года ни разу не довелось с ним поработать. smile.gif Хотя мне кажется, что крон был бы более вкусным, чем все остальные варианты, в свою очередь пользователи будут отсылать на сайт действия, и получать лишь готовый результат, никаких обработок одинаковых действий по 100 раз.

Твой третий вариант не только нагрузит в 10 раз БД объемом, но так же и запросов станет куда больше, и сайт не будет справляться даже с несколькими ХХХ людей онлайн, из-за дублирования одинаковых процессов, а это уже неправильно.

Спустя 6 дней, 22 часа, 29 минут, 23 секунды (20.09.2011 - 15:17) MefiseRay написал(а):
Прошу прощения, вы не совсем поняли что я имел в виду. Во всех вышеперечисленных вариантах используется одна общая база данных. В бд заносится список действий от каждого игрока (ходы). Таким образом информация в базе данных не избыточна, там хранятся только уникальные записи дял текущего хода.

Проблема была в том, что расчеты выполняющиеся на стороне сервера, выполняются на PHP а PHP файлы для своего запуска ожидают обращения к ним пользователя. таким образом у нас получается ситуация:
1) есть общий набор данных
2) есть скрипт PHP который неким образом делает просчеты результата боя
3) есть от 1-10 игроков в текущем бою.

проблема в том что начало расчетов берется как раз от этих 1-10 игроков, которые никак не связаны друг с другом!

Дальше возникает вопрос кому из 1-10 юзеров запускать скрипт расчетов и сразу варианты.
1) Скрипт запсукается изначално выбранным игроком, который должен быть в игре на момент расчетов, в противном случае скрипт передается на расчет следующему игроку.
В этом случае скрипт расчитывает исход боя 1 раз за всех и занисот данные в базу данных откуда эту информацию потом получают другие игроки на момент следующего хода.
2)скрипт запускается всеми 1-10 юзерами и выполняется параллельно. Если скрипт не был запущен на выполенне или не был выполнен через какое-то время, пользователь считается отсоединенным.
В этом случае в скрипте идет просчет только тех данных которые связаны с пользователем запустившим скрипт. В бд записываются только изменения связанные с пользователем запустившим скрипт. При атком раскладе каждый расчитывает только свою часть изменений и записывает ее.
3) скрипт запускается всеми 1-10 юзерами и выполняется поочередно.
В этом случае данные берутся из базы данных всеми скриптами, причем если скрипт обратился к бд и загрузил оттуда часть данных для расчетов, эти данные удаляются из базы. пока один скрипт не завершит работу с бд другой скрипт не может обратиться к базе.

вот что я имел в виду в прошлом посте. Сейчас я склоняюсь либо к первому либо ко второму варианту. Скорее всего выберу вариант 1, в связи с тем что в варианте 2 возникает проблема расчета если одного из игроков отключит от сети.

Спустя 2 дня, 4 часа, 43 минуты, 9 секунд (22.09.2011 - 20:00) inpost написал(а):
MefiseRay
Ожидают обращения пользователя... Сделай обращение на Кроне, чтобы сервер к ним обращался.

Спустя 2 часа, 27 минут, 58 секунд (22.09.2011 - 22:28) MefiseRay написал(а):
Цитата (inpost @ 22.09.2011 - 17:00)
MefiseRay
Ожидают обращения пользователя... Сделай обращение на Кроне, чтобы сервер к ним обращался.

идея конечно хорошая, но вместе с тем что она идеально подходит для решения этой проблеммы она совершенно не идеальна с точки зрения производительности, к томуже моя задача создать движок работающий на любом сервере и не зависящий от его составляющих, демонов и софта.

Но спасибо за идею. ее я уще не раз слышал на другом форуме, правда не по данной тематике.

Спустя 47 секунд (22.09.2011 - 22:29) MefiseRay написал(а):
и главное что вы понимаете под фразой "чтобы сервер к ним обращался" к кому обращался? Оо

Спустя 1 час, 47 минут, 38 секунд (23.09.2011 - 00:17) inpost написал(а):
к скрипту smile.gif Мы же о нём говорим.

Спустя 1 день, 11 часов, 32 минуты, 32 секунды (24.09.2011 - 11:49) MefiseRay написал(а):
не вариант

Спустя 4 часа, 52 минуты, 15 секунд (24.09.2011 - 16:42) inpost написал(а):
Ну напишешь, прославишься, расскажешь, какой вариант smile.gif

Спустя 2 дня, 6 часов, 25 минут, 5 секунд (26.09.2011 - 23:07) MefiseRay написал(а):
Вариант был найден, причем просто идеальный! В MySQL начиная с 5 версии есть такая вещь как события. Пишем скрипт расчетов или других действий в MySQL сохраняем как событие, ставим тригеры и задем время выполнения события. стартовать событие можно на каждом ходе или в начале боя. Таким образом исбавляемся вообще от привязки к инородным програмам и ос системы + это обеспечит надежную защиту данных.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.