-- создано NaiveBug^梁疯
Подготовка перед началом
1: Установите MySQL и добавьте пользователя с именем: iphone, пароль: iphoneGame (или измените пароль в mysql/sql) (ps: обратите внимание на права доступа)
2: Импортируйте sql/sql.sql в базу данных, после чего нажмите start.bat или skynet.exe для запуска сервера игры
-- Объяснение:
1 Этот код предназначен для изучения логики Skynet, а исполняемые файлы exe можно скачать с официального сайта Skynet для Windows (неофициальная версия), если требуется коммерческое использование, то следует перейти на Linux, так как код кросс-платформен и будет работать одинаково.
2 Код находится в code/script, остальное - это оригинальные элементы Skynet.
--
Структура кода: (сначала изучите примеры кода в Skynet)
1 Для каждого игрока существует свой Agent, клиент отправляет данные, которые перенаправляются в netcommon.netPackCommon в Agent, затем данные обрабатываются в net/netcommon.netPackCommon для каждого сетевого пакета, как в самом простом примере netchat.
2 who является игроком, используйте GetPlayer() для его получения.
3 Сетевые протоколы кодируются с использованием Protobuf, для клиента вы можете посмотреть примеры в google Protobuf, в Skynet используется версия Protobuf на C языке от брата Yunfeng, протоколы находятся в protos, pb файлы можно сгенерировать с помощью поиска в интернете по запросу "protobufinit инициализация и загрузка protobuf".4 Для входа в систему с использованием учетной записи сначала выполните netbase.C2SLogin
, затем загрузите данные игрока в account/LoadPlayerData
. Данные загружаются и обрабатываются в списках m_DBList
и m_WhenUpdateSaveList
(список m_WhenUpdateSaveList
обновляется только при наличии изменений и сохраняется через определенное время). После загрузки данные передаются в функцию EnterGame
игрока. После выполнения всех операций данные отправляются обратно клиенту.
5 m_DBList
и m_WhenUpdateSaveList
являются одними из самых важных элементов этого фреймворка для работы с данными, код находится в db/dbmgr
.
6 data
— это данные из таблицы, генерация данных из таблицы может быть изучена в моем проекте python_read_excel_to_lua
, данные из таблицы инициализируются в data/share.lua
, это делается для экономии памяти, не требуется загружать каждую таблицу в каждом виртуальном окружении, достаточно загрузить только те, которые используются. Используется функция sharedata
Skynet.
7 Хранение данных NPC осуществляется в herodb/load
и herodb/save
, загрузка данных происходит в dbmgr/load
и dbmgr/save
, в конечном итоге данные сериализируются в строку с помощью g_pickle.serializeTable
и сохраняются в MySQL.8 Хранение данных осуществляется в виде блоков, то есть больших строк, которые сохраняются в базе данных и загружаются. Поэтому после упаковки, даже если вы пишете логику на верхнем уровне, вам не нужно беспокоиться о других вопросах хранения данных. Это потому что в функции AutoSave игрока каждые несколько минут вызывается Save для проверки базы данных на наличие изменений, и только если изменения есть, они сохраняются.9 Что касается обновления, вызывается функция UpdateSave. Если вызывается herodb для проверки обновлений с помощью функции CheckUpdate, то проверяется каждый объект на наличие обновлений. Каждый Chero наследует DictKeysCtrl или CDictKeysCtrl из base/only (их различие заключается в том, что один использует точку, а другой — двоеточие для определенного стиля записи). Поэтому при записи данных можно использовать операции Set и Query для работы с таблицей, например, Chero:SetName и Chero:GetName(). При вызове этих функций данные автоматически сохраняются и обновляются, что позволяет не беспокоиться о данных, делая работу очень удобной и быстрой.10. Способ написания класса BaseClass(CNpc) определен в base/BaseClass, это Lua-класс, написанный Yunfeng в 2006 году. Я использую его только для множества объектов NPC, чтобы сэкономить немного памяти. На самом деле, его можно не использовать, а просто создать объект с помощью createdbmgr, что позволяет использовать self.xx вместо self:xx, что удобнее для унифицированного использования.
-------------------------окончание----------------
Если у вас есть предложения, вы можете оставить комментарий или обратиться к Yunfeng в группе Skynet с упоминанием @clear. Yunfeng обладает большой способностью и делает большой вклад, а я, имея меньшие способности, делаю небольшой вклад.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )