![]() |
|
||||||||||
|
|||||
|
[+1 25.04.11]
|
Вот такой вопрос. Научился работать с базой данных, сделал пару игр с использованием дб по способу "Записал уровень, деньги и.т.п". Т.е. прямая запись.
Теперь меня затронул другой вопрос. Хочу сделать стратегию, но не знаю как правильно реализовать базу данных. Т.е. к примеру, человек нажал на кнопку выучить какой то навык, который будет учиться 2 часа. Хорошо, с этим все понятно, записать timestamp в базу, а потом при следующем входе игрока проверить прежний timestamp, если время прошло, значит навык выучен. Вот сам вопрос, а что если этих навыков десятки?? Десятки навыков одновременно учатся (десятки таймстепов и уровней навыка находятся в бд). Не писать же все тайм степы и уровни навыков в одну строку вместе с данными игрока... Если кто то имеет опыт в стратегиях, просьба помочь, все таки это не легко и интересно. |
|
|||||
|
Ну наверняка у стратегии сервер - демон. Записать timestamp ради сохранения прокачки в случае краша сервера, а сам таймер тикает в памяти.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
[+1 25.04.11]
|
Psycho Tiger
а сам таймер тикает в памяти А можно поподробней об этом. Т.е. память php скрипта, или что? Скажите пожалуйста ключевое слово, по какому мне найти мануалы с использованием этого. Это снимет нагрузку на сервер? Ну на бд... И еще, по какому принципу работает счетчик "кто онлайн", я знаю что ежесекундно подается пакет на сервер, что человек в сети. Я так понял этот тоже пхп память? |
|
|||||
|
Lorem ipsum
|
table skills ------------------------------------------------- sid - id навыка title - название period1 -сколько развивать до уровня 1 period2 -сколько развивать до уровня 2 period3 -сколько развивать до уровня 3 user_skills_progress ------------------------------------------------- uid - id пользователя* sid - id навыка* tolevel - до какого уровня качаем time - timestamp начала прокачки *первые два поля — составной ключ
__________________
Поймай яблоко 2! |
|
|||||
|
[+1 25.04.11]
|
Zebestov
Спасибо большое. Но вот еще по поводу правельности чтения хотел узнать. При входе в игру, игрок, должен получить состояние всех своих навыков из user_skills_progress. Если какой то навык выучен, записать его в user_skills. Главный вопрос заключается в том, будет ли такие постоянные обращения к базе данных нагружать сервер? Помимо этого передача результата (действия) игрока будет очень часто предаваться и записыватся в базу |
|
|||||
|
Lorem ipsum
|
Ну во-первых надо определиться в терминологии: игрок ничего не записывает, это должен делать сервер.
При входе синхронизируешь время с сервером. Также при входе клиент получает от сервера ответ, в котором содержится список текущих навыков на прокачке: {
skill_id : 'id навыка',
skill_title : 'название',
start : 'timestamp начала прокачки',
stop : 'timestamp окончания',
done : '0|1' — завершена ли прокачка
}
// currentLocalTimestamp - текущее синхронизированное время // PARU_SEKUNDEN - некий запас по времени в пределах пинга (max ? avg). чтобы наверняка var skillTimer:Timer = new Timer(currentSkill.stop - currentLocalTimestamp + PARU_SEKUNDEN, 1); skillTimer.addEventListener(TimerEvent.TIMER, hanlder_currentSkillComplete); skillTimer.start(); ![]() Следует отметить, что в запросе http://myserver.com/api/?method=getSkillsProgress следует предусмотреть необязательный "&sid=<id интересующего навыка>", чтобы по таймерам не грузить весь список, когда это не надо. Ну вот как бы это делал я. Но может это все чушь или не самое лучшее решение — надо чтобы кто-то из опытных что посоветовал.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
|
Надежней будет проверять время при самой уже записи, а не синхронизировать его с не понятным клиентом на стороне которого может произойти со временем что угодно. Клиент вобще должен только отображать то, что происходит на сервере и отправлять запросы на какие то действия
При старте устанавливаем таймер на разницу в текущем времени ( которое взяли с сервера ) и временем окончанием "прокачки" ( тоже с сервера взяли ( записанное в базу )) при срабатывании таймера отправляем данные на сервер, где уже берем текущее время и сравниваем, если все плохо ( не совпало/раньше и т/д/ ) отправляем назад в приложение текущее время и время окончания и опять ставим таймер, тут нада конечно добавить, что к времени таймеру стоит добавлять не много миллисекунд, либо на сервере делать допуск при проверке. Все действия конечно должны происходит через проверку приложения, например придумайте схему идентификации приложения на сервере и при всех действиях ( ну разве, что можно исключить запросы на получения данных ) проверяйте валидное ли приложение схем может быть много |
|
|||||
|
Lorem ipsum
|
а что изменилось?
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
|
Изменился сам подход к задаче, я предлагаю не синхронизировать время с самим флешом, а просто ставить таймер и проводить операцию только на сервере, то есть при срабатывании таймера не слать - навык "прокачан", а слать попытку установить значение навыка в прокачан.
|
|
|||||
|
Lorem ipsum
|
Я полагаю, что лучше клиент пускай отсчитывает миллисекунды и в нужный момент сдает "домашнее задание" серверу на проверку, нежели сервак будет трещать по швам от миллионов таймеров за каждым подключенным к нему клиентом.
__________________
Поймай яблоко 2! |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:22. |
|
|
« Предыдущая тема | Следующая тема » |
|
|