Development/ru: Difference between revisions
Created page with "==== Клиентская сторона ====" |
Created page with "В настоящее время применяется следующее:" |
||
Line 112: | Line 112: | ||
< | <span id="Code_conventions"></span> | ||
== | == Кодовые конвенции == | ||
Продолжающаяся дискуссия о кодовых соглашениях находится здесь: [https://github.com/ddnet/ddnet/issues/2945 ddnet#2945]. | |||
В настоящее время применяется следующее: | |||
< | <span id="Indentation_style"></span> | ||
=== Indentation | === Indentation стиль === | ||
[https://en.wikipedia.org/wiki/Indentation_style#Allman_style Allman style] используется. | |||
[https://en.wikipedia.org/wiki/Indentation_style#Allman_style Allman style] | |||
<blockquote> | <blockquote> | ||
Этот стиль помещает скобку, связанную с управляющим оператором, на следующую строку с отступом на том же уровне, что и управляющий оператор. Утверждения внутри скобок отступают на следующий уровень. | |||
</blockquote> | </blockquote> | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
while(x == y) | while(x == y) | ||
Line 146: | Line 135: | ||
SomethingElse(); | SomethingElse(); | ||
} | } | ||
Finalthing(); | Finalthing(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <span id="Classes_and_Structs"></span> | ||
=== | === Классы и структуры === | ||
Должен иметь префикс <code>C</code> (по устаревшим причинам это игнорируется для структур в некоторых местах, например, в графическом коде) или <code>I</code> для интерфейсов. Новая структура <code></code>s должна иметь префикс <code>S</code>. | |||
Пример: | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
class CCharacter : public CEntity | class CCharacter : public CEntity | ||
Line 173: | Line 153: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <span id="Enums_and_constants"></span> | ||
=== | === Перечисления и константы === | ||
Должен быть screaming snake case, например: <code>MAX_PLAYERS</code> | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
enum | enum | ||
Line 197: | Line 172: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <span id="Variable_naming"></span> | ||
=== | === Именование переменных === | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> |
Revision as of 22:55, 7 June 2023
Цель этой статьи - познакомить вас с DDNet разработкой, поскольку это игра с открытым исходным кодом, она полагается на случайных людей, готовых внести в нее свой вклад в свободное время.
Ваша среда разработки
Крайне рекомендуется установить среду Linux для начала программирования в DDNet по следующим причинам (на данный момент):
- Большинство участников DDNet на самом деле используют Linux для внесения вклада.
- Более простое управление пакетами, вы можете легко установить все необходимые библиотеки и начать вносить свой вклад.
- Эта статья пока не имеет версии для Windows и ориентирована на Linux.
Прежде всего, DDNet написан с использованием языка программирования C++, вам необходимо быть достаточно знакомым с ним, но вы также можете знать основы и научиться большему с его помощью.
Некоторые полезные ресурсы для изучения C++:
- learncpp.com
- cppreference.com
- Предпочтительная поисковая система
Исходный код DDNet управляется с помощью Git, системы контроля версий, важного инструмента для совместной работы с несколькими разработчиками.
Если в вашем дистрибутиве Linux еще нет git, обязательно установите его, например, в большинстве дистрибутивов на базе debian/ubuntu: sudo apt install git
.
Получение исходного кода
Исходный код находится на Github, вы можете получить исходный код путем клонирования без необходимости иметь учетную запись, но если вы хотите когда-либо внести свои изменения в официальный исходный код, то она вам понадобится.
Если вы не знакомы с git/github, вы можете изучить основы здесь: Hello World - Github.
Установка зависимостей
Если вы работаете на Linux, вы можете установить все необходимые зависимости, прочитав README на странице DDNet на github: https://github.com/ddnet/ddnet#dependencies-on-linux--macos.
Для Arch Linux:
sudo pacman -S --needed base-devel cmake curl freetype2 git glew gmock libnotify opusfile python sdl2 sqlite wavpack
Компиляция DDNet
Мы используем CMake для управления процессом компиляции, если у вас установлены все зависимости, это так же просто, как выполнить следующие команды (убедитесь, что вы находитесь в папке DDNet):
mkdir build
cd build
cmake ..
make -j$(nproc)
Общая информация
Вот некоторые общие сведения:
- В настоящее время исходный код скомпилирован в соответствии со стандартом C++17, но вы увидите, что многие части кода больше похожи на C, поскольку только в основном новый код использует материал C++17.
std::string
используется редко, массивы символов плюс использованиеsystem.h
методы для их обработки являются нормой.- Большая часть кода ввода-вывода, форматирования и печати выполняется с использованием методов, предоставляемых system.h.
Расположение исходного кода
Теперь, когда вы можете создать DDNet, вы можете приступить к его редактированию.
Каталог src/base
Поскольку DDNet является кросс-платформенной игрой, для облегчения разработки необходим слой абстракции над ней, этот каталог содержит множество полезных функций для этого.
Каталог src/engine
Здесь находится игровой движок, он обрабатывает большинство вещей, не связанных с игровым процессом, таких как графика, звук, сеть и т.д.
Каталог src/game
Весь код, связанный с геймплеем, находится здесь, разделенный на клиентский и серверный.
Серверная сторона
Эта игра использует свою собственную иерархическую объектно-ориентированную систему сущностей, основным классом, от которого происходят все остальные сущности, является CEntity
located in src/game/server/entity.h
.
Эти сущности управляются игровым миром, расположенным здесь src/game/server/gameworld.h
.
К числу важных структур относятся:
- CCharacter: Представляет собой тии, который является живым, он создается при порождении тии и удаляется при его смерти. Информацию о том, как игрок сохраняется между смертями, см. в CPlayer.
Клиентская сторона
Клиентская сторона состоит из компонентов, это классы, которые наследуют CComponent
: Эти компоненты могут реализовывать виртуальные методы, такие как OnInit
, OnMessage
и т.д., чтобы обеспечить их функциональность.
Сетевое взаимодействие
Сетевой протокол в основном генерируется скриптами python, которые выводят код C++, например, datasrc/network.py
определяет все сетевые пакеты.
Кодовые конвенции
Продолжающаяся дискуссия о кодовых соглашениях находится здесь: ddnet#2945.
В настоящее время применяется следующее:
Indentation стиль
Allman style используется.
Этот стиль помещает скобку, связанную с управляющим оператором, на следующую строку с отступом на том же уровне, что и управляющий оператор. Утверждения внутри скобок отступают на следующий уровень.
while(x == y)
{
Something();
SomethingElse();
}
Finalthing();
Классы и структуры
Должен иметь префикс C
(по устаревшим причинам это игнорируется для структур в некоторых местах, например, в графическом коде) или I
для интерфейсов. Новая структура s должна иметь префикс
S
.
Пример:
class CCharacter : public CEntity
{
// ...
}
Перечисления и константы
Должен быть screaming snake case, например: MAX_PLAYERS
enum
{
FAKETUNE_FREEZE = 1,
FAKETUNE_SOLO = 2,
FAKETUNE_NOJUMP = 4,
FAKETUNE_NOCOLL = 8,
FAKETUNE_NOHOOK = 16,
FAKETUNE_JETPACK = 32,
FAKETUNE_NOHAMMER = 64,
};
Именование переменных
- The names of variables contain 3 parts: qualifier, prefix and name.
- Variable names should start with uppercase unless they are 1 char long without any prefix or qualifier, for example:
i
,x
,y
. - Variables can have more than 1 qualifier (or zero) and more than 1 prefix (or zero).
These are laid out like this: [qualifiers]_[prefixes][Name]
Qualifiers
m
for member variables:m_MyVariable
.s
for static variables:s_MyStaticVariable
,ms_MyStaticMemberVariable
.g
for global variables with external linkage:gs_MyGlobalStaticVar
.
Prefixes
p
for pointers:pMyPointer
,m_pCharacter
,ppMyPointerToPointer
.a
for arrays:aMyArray
,aBuf
.v
forstd::vector
s:vMyVector
,vpvMyVectorOfPointersToVectors
.fn
for functions:pfnMyCallback
,m_papfnMyPointerToArrayOfCallbacks
.
Common snippets
Here is a list of code that you may frequently see across the codebase:
Formatting text
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "number: %d", 2);
Iterating over all players
for(int i = 0; i < MAX_CLIENTS; i++)
{
// Server-side
CPlayer *pPlayer = GameServer()->m_apPlayers[i];
}
Printing to the game console
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "wikiprint", "Hello from the ddnet wiki!");
Debug printing
int i = 2;
dbg_msg("wikiprint", "Hello from the ddnet wiki: %d", i);
External resources
- An intro to the DDraceNetwork game source code by Ryozuki
- Code conventions in DDraceNetwork by Ryozuki
- Implementing a chat command in DDraceNetwork by Ryozuki
- Auto generated docs
- Technical documentation of Teeworlds file formats and network protocol
- The Anatomy of a One Tick Unfreeze
- Teeworlds programming YouTube tutorial by ChillerDragon