Development/es: Difference between revisions
Created page with "Primero que todo, DDNet está codificado usando el lenguaje de programación C++, necesitarás estar bastante familiarizado con él, pero también puedes saber lo básico y aprender más con él." |
Updating to match new version of source page |
||
(20 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> | <languages /> | ||
Este artículo pretende introducirte en el ''''' | |||
Este artículo pretende introducirte en el '''''desarrollo''''' de DDNet, Al tratarse de un juego de código abierto, depende de las personas que contribuyen a él en su tiempo libre. | |||
Line 11: | Line 12: | ||
* Este artículo aún no tiene versión para Windows y se centra en Linux. | * Este artículo aún no tiene versión para Windows y se centra en Linux. | ||
<div class="mw-translate-fuzzy"> | |||
Primero que todo, DDNet está codificado usando el lenguaje de programación C++, necesitarás estar bastante familiarizado con él, pero también puedes saber lo básico y aprender más con él. | Primero que todo, DDNet está codificado usando el lenguaje de programación C++, necesitarás estar bastante familiarizado con él, pero también puedes saber lo básico y aprender más con él. | ||
</div> | |||
Algunos recursos útiles para aprender C++: | |||
* [https://www.learncpp.com/ learncpp.com] | * [https://www.learncpp.com/ learncpp.com] | ||
* [https://en.cppreference.com/w/ cppreference.com] | * [https://en.cppreference.com/w/ cppreference.com] | ||
* | * El motor de búsqueda que prefiera | ||
El código fuente de DDNet se gestiona mediante [https://git-scm.com/ Git], un sistema de control de versiones, una herramienta esencial para colaborar con múltiples desarrolladores. | |||
Si aún no tiene git en su distribución Linux, asegúrese de instalarlo, por ejemplo, en la mayoría de las distribuciones basadas en debian/ubuntu se instala con el siguiente comando en la terminal: <code>sudo apt install git</code>. | |||
< | <span id="Getting_the_source_code"></span> | ||
== | == Obtener el código fuente == | ||
El código fuente se encuentra en [https://github.com/ddnet/ddnet Github], puedes obtener el código fuente clonándolo sin necesidad de una cuenta, pero si alguna vez quieres poner tus cambios en el código fuente oficial necesitarás una. | |||
Si no estás familiarizado con git/github puedes aprender lo básico aquí: [https://docs.github.com/en/get-started/quickstart/hello-world Hola Mundo - Github] | |||
< | <span id="Installing_the_dependencies"></span> | ||
== | == Instalación de dependencias == | ||
Si utiliza Linux, puede instalar todas las dependencias necesarias leyendo el archivo README en la página de DDNet en github: https://github.com/ddnet/ddnet#dependencies-on-linux--macos | |||
Para Arch Linux: | |||
< | <syntaxhighlight lang="bash"> | ||
sudo pacman -S --needed base-devel cmake curl ffmpeg freetype2 git glew glslang gmock libnotify libpng opusfile python rust sdl2 spirv-tools sqlite vulkan-headers vulkan-icd-loader wavpack x264 | |||
</ | </syntaxhighlight> | ||
Para Debian: | |||
<div | <div class="mw-translate-fuzzy"> | ||
= | <syntaxhighlight lang="bash"> | ||
sudo apt install build-essential cargo cmake git glslang-tools google-mock libavcodec-extra libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libcurl4-openssl-dev libfreetype6-dev libglew-dev libnotify-dev libogg-dev libopus-dev libopusfile-dev libpng-dev libsdl2-dev libsqlite3-dev libssl-dev libvulkan-dev libwavpack-dev libx264-dev python rustc spirv-tools4 | |||
</syntaxhighlight> | |||
</div> | </div> | ||
< | <span id="Compiling_DDNet"></span> | ||
== Compilación de DDNet == | |||
Usamos CMake para controlar el proceso de compilación, si tienes todas las dependencias instaladas, es tan fácil como seguir estos comandos (asegúrate de estar en la carpeta de DDNet): | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
mkdir build | mkdir build | ||
Line 74: | Line 64: | ||
make -j$(nproc) | make -j$(nproc) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <span id="General_information"></span> | ||
== | == Información general == | ||
Aquí tienes algo de información general: | |||
* Actualmente, el código fuente está compilado con el estándar C++17, pero verás que muchas partes del código son más parecidas a C ya que solo la mayor parte del código nuevo utiliza cosas de C++17. | |||
* | * <code>std::string</code> rara vez se usa, además de utilizar <code>system.h</code> métodos para manejarlos es la norma. | ||
* <code>std::string</code> | * La mayor parte del código de E/S, formateo e impresión se realiza utilizando los métodos proporcionados por <code>system.h</code>. | ||
* | |||
< | <span id="The_source_code_layout"></span> | ||
== | == La disposición del código fuente == | ||
Ahora que ya puedes construir DDNet, puedes empezar a editarlo. | |||
< | <span id="The_src/base_directory"></span> | ||
=== | === El directorio src/base === | ||
Dado que DDNet es un juego multiplataforma, se necesita una capa de abstracción para facilitar el desarrollo, y este directorio contiene muchas funciones útiles para ello. | |||
< | <span id="The_src/engine_directory"></span> | ||
=== | === El directorio src/engine === | ||
Aquí se encuentra el motor del juego, que se encarga de la mayoría de las cosas que no están relacionadas con la jugabilidad, como los gráficos, el sonido, la red, etc. | |||
< | <span id="The_src/game_directory"></span> | ||
=== | === El directorio src/game === | ||
Todo el código relacionado con el juego está aquí, separado en cliente y servidor. | |||
< | <span id="Server_side"></span> | ||
==== | ==== Del lado del servidor ==== | ||
Este juego utiliza su propio sistema jerárquico orientado a objetos de entidades, la clase principal de la que derivan todas las demás entidades es[https://en.wikipedia.org/wiki/Entity_component_system Entity Component System], the main class to which all other entities derive from is <code>CEntity</code> located in <code>src/game/server/entity.h</code>. | |||
Estas entidades son gestionadas por el game world ubicado aquí <code>src/game/server/gameworld.h</code> | |||
Algunas entidades importantes son: | |||
<div | <div class="mw-translate-fuzzy"> | ||
* [https://github.com/ddnet/ddnet/blob/master/src/game/server/entities/character.h CCharacter]: | * [https://github.com/ddnet/ddnet/blob/master/src/game/server/entities/character.h CCharacter]: Representa un [[Special:MyLanguage/Common_Terminology#Tee|tee]] que esté vivo, se crea cuando aparece un tee y se elimina cuando muere. Para más información sobre el jugador que se mantiene entre muertes, véase [https://github.com/ddnet/ddnet/blob/master/src/game/server/player.h CPlayer]. | ||
</div> | </div> | ||
< | <span id="Client_side"></span> | ||
==== | ==== Lado del cliente ==== | ||
<div | <div class="mw-translate-fuzzy"> | ||
El lado del cliente está formado por componentes, que son clases que heredan de <code>CComponent</code>: Estos componentes pueden aplicar métodos virtuales como <code>OnInit</code>, <code>OnMessage</code>, etc. Para proporcionar su funcionalidad. | |||
</div> | </div> | ||
< | <span id="Networking"></span> | ||
==== | ==== Redes ==== | ||
El protocolo de red en su mayoría es generado por scripts python que generan código C++, por ejemplo, <code>datasrc/network.py</code> define todos los paquetes de red. | |||
< | <span id="Code_conventions"></span> | ||
== | == Convenciones de código == | ||
El debate en curso sobre las convenciones del código se encuentra aquí: | |||
[https://github.com/ddnet/ddnet/issues/2945 ddnet#2945] | |||
Actualmente, se aplica lo siguiente: | |||
< | <span id="Indentation_style"></span> | ||
=== | === Estilo de indentación === | ||
[https://en.wikipedia.org/wiki/Indentation_style#Allman_style Allman style] se utiliza. | |||
[https://en.wikipedia.org/wiki/Indentation_style#Allman_style Allman style] | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 201: | Line 157: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
FinalThing(); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
=== Classes and Structs === | ===Classes and Structs=== | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Must be prefixed by <code>C</code> (for legacy reasons this is ignored for structs in some places, such as in graphics code) or <code>I</code> for interfaces. | Must be prefixed by <code>C</code> (for legacy reasons this is ignored for structs in some places, such as in graphics code) or <code>I</code> for interfaces. New <code>struct</code>s should be prefixed by <code>S</code>. | ||
</div> | </div> | ||
Ejemplo: | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 229: | Line 182: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
=== Enums and constants === | ===Enums and constants=== | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Should be screaming snake case, for example: <code>MAX_PLAYERS</code> | Should be ''screaming snake case [https://en.wikipedia.org/wiki/Snake_case]'', for example: <code>MAX_PLAYERS</code> | ||
</div> | </div> | ||
Line 253: | Line 206: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
=== Variable naming === | ===Variable naming=== | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
* The names of variables contain 3 parts: qualifier, prefix and name. | *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: <code>i</code>, <code>x</code>, <code>y</code>. | *Variable names should start with uppercase unless they are 1 char long without any prefix or qualifier, for example: <code>i</code>, <code>x</code>, <code>y</code>. | ||
* Variables can have more than 1 qualifier (or zero) and more than 1 prefix (or zero). | *Variables can have more than 1 qualifier (or zero) and more than 1 prefix (or zero). | ||
</div> | </div> | ||
Line 268: | Line 221: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
==== Qualifiers ==== | ====Qualifiers==== | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
* <code>m</code> for member variables: <code>m_MyVariable</code>. | *<code>m</code> for member variables: <code>m_MyVariable</code>. | ||
* <code>s</code> for static variables: <code>s_MyStaticVariable</code>. | *<code>s</code> for static variables: <code>s_MyStaticVariable</code>, <code>ms_MyStaticMemberVariable</code>. | ||
* <code>g</code> for global variables with external linkage: <code>gs_MyGlobalStaticVar</code>. | *<code>g</code> for global variables with external linkage: <code>gs_MyGlobalStaticVar</code>. | ||
</div> | </div> | ||
< | <span id="Prefixes"></span> | ||
==== | ==== Prefijos ==== | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
* <code>p</code> for pointers: <code>pMyPointer</code>, <code>m_pCharacter</code>, <code>ppMyPointerToPointer</code>. | *<code>p</code> for pointers: <code>pMyPointer</code>, <code>m_pCharacter</code>, <code>ppMyPointerToPointer</code>. | ||
* <code>a</code> for arrays: <code>aMyArray</code>, <code>aBuf</code>. | *<code>a</code> for arrays: <code>aMyArray</code>, <code>aBuf</code>. | ||
* <code>fn</code> for functions: <code>pfnMyCallback</code>, <code>m_papfnMyPointerToArrayOfCallbacks</code>. | *<code>v</code> for <code>std::vector</code>s: <code>vMyVector</code>, <code>vpvMyVectorOfPointersToVectors</code>. | ||
*<code>fn</code> for functions: <code>pfnMyCallback</code>, <code>m_papfnMyPointerToArrayOfCallbacks</code>. | |||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
== Common snippets == | ==Common snippets== | ||
</div> | </div> | ||
Line 298: | Line 251: | ||
< | <span id="Formatting_text"></span> | ||
=== | === Formato del texto === | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 308: | Line 260: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
=== Iterating over all players === | See [https://cplusplus.com/reference/cstdio/printf/ printf documentation] for a list of all format specifiers. | ||
===Iterating over all players=== | |||
</div> | </div> | ||
Line 326: | Line 278: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
=== Printing to the game console === | ===Printing to the game console=== | ||
</div> | </div> | ||
Line 336: | Line 288: | ||
< | <span id="Debug_printing"></span> | ||
=== | === Impresión de depuración === | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 347: | Line 298: | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
===Translating text in the client=== | |||
<code>Localize</code> can be used in the game client to get the translation for a specific string from the language file selected by the user.<syntaxhighlight lang="cpp"> | |||
DoButton(..., Localize("Connect"), ...); | |||
</syntaxhighlight>The string can also contain format specifiers. The translated string must contain the same format specifiers.<syntaxhighlight lang="cpp"> | |||
char aBuf[128]; | |||
str_format(aBuf, sizeof(aBuf), Localize("%d of %d servers"), NumServers, TotalServers); | |||
</syntaxhighlight>A script is used to scan the code for calls to <code>Localize</code> and collect the strings to update the translation files. For this reason, the call to <code>Localize</code> must not contain any other code, or the script cannot determine the text correctly.<syntaxhighlight lang="cpp"> | |||
// Do NOT do this: | |||
const char *pStr = Localize(Team == TEAM_RED ? "Red team" : "Blue team"); | |||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
// Do this instead: | |||
const char *pStr = Team == TEAM_RED ? Localize("Red team") : Localize("Blue team"); | |||
</syntaxhighlight> | |||
</div> | |||
<span id="External_resources"></span> | |||
== Recursos externos == | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
*[https://edgarluque.com/blog/ui-code-ddnet/ UI Code in DDraceNetwork] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]] | |||
*[https://edgarluque.com/blog/intro-to-ddnet/ An intro to the DDraceNetwork game source code] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]] | |||
*[https://edgarluque.com/blog/code-conventions-in-ddnet/ Code conventions in DDraceNetwork] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]] | |||
*[https://edgarluque.com/blog/chat-command-ddracenetwork/ Implementing a chat command in DDraceNetwork] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]] | |||
*[https://codedoc.ddnet.org/ Auto generated docs] | |||
*[https://ddnet.org/libtw2-doc/ Technical documentation of Teeworlds file formats and network protocol] | |||
*[https://heinrich5991.github.io/blog/blog/one-tick-unfreeze The Anatomy of a One Tick Unfreeze] | |||
*[https://www.youtube.com/playlist?list=PLhJkqAQmOh5LyYOfnMy4PJB6CSZltQyTc Teeworlds programming YouTube tutorial] by [[User:ChillerDragon|ChillerDragon]] | |||
*[https://chillerdragon.github.io/teeworlds-protocol/ Teeworlds 0.6/0.7 network protocol documentation] by [[User:ChillerDragon|ChillerDragon]] | |||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
== | ==About Tee Skin Rendering== | ||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
This section explains how to render a tee skin. | |||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
Values put together by Patiga | |||
Special Thanks to Jupstar | |||
* | |||
Segment Scaling: | |||
body: 100% | |||
feet: 150% | |||
eyes: 120% | |||
eye blink: 45% | |||
hand: 93.75% | |||
Positioning: | |||
64/64 = 1 = width or height of the body segment | |||
body: 4/64 up | |||
feet: | |||
10/64 down | |||
7/64 left/right | |||
eyes: | |||
0.125 up | |||
0.05 left/right | |||
eye movement: | |||
dir = angle of eyes (view angle), right = 0 | |||
eyes: | |||
x: cos(dir) * 0.125 | |||
y: sin(dir) * 0.1 | |||
each eye (away from the other): | |||
x: abs(cos(dir)) * 0.01 | |||
</div> | </div> |
Latest revision as of 17:29, 4 May 2024
Este artículo pretende introducirte en el desarrollo de DDNet, Al tratarse de un juego de código abierto, depende de las personas que contribuyen a él en su tiempo libre.
Tu entorno de desarrollo
Es extremadamente recomendable configurar algún entorno de Linux para empezar a programar en DDNet por las siguientes razones (a partir de ahora):
- La mayoría de los colaboradores de DDNet utilizan Linux para contribuir.
- Gestión de paquetes más simple, puedes instalar fácilmente todas las librerías necesarias y empezar a contribuir.
- Este artículo aún no tiene versión para Windows y se centra en Linux.
Primero que todo, DDNet está codificado usando el lenguaje de programación C++, necesitarás estar bastante familiarizado con él, pero también puedes saber lo básico y aprender más con él.
Algunos recursos útiles para aprender C++:
- learncpp.com
- cppreference.com
- El motor de búsqueda que prefiera
El código fuente de DDNet se gestiona mediante Git, un sistema de control de versiones, una herramienta esencial para colaborar con múltiples desarrolladores.
Si aún no tiene git en su distribución Linux, asegúrese de instalarlo, por ejemplo, en la mayoría de las distribuciones basadas en debian/ubuntu se instala con el siguiente comando en la terminal: sudo apt install git
.
Obtener el código fuente
El código fuente se encuentra en Github, puedes obtener el código fuente clonándolo sin necesidad de una cuenta, pero si alguna vez quieres poner tus cambios en el código fuente oficial necesitarás una.
Si no estás familiarizado con git/github puedes aprender lo básico aquí: Hola Mundo - Github
Instalación de dependencias
Si utiliza Linux, puede instalar todas las dependencias necesarias leyendo el archivo README en la página de DDNet en github: https://github.com/ddnet/ddnet#dependencies-on-linux--macos
Para Arch Linux:
sudo pacman -S --needed base-devel cmake curl ffmpeg freetype2 git glew glslang gmock libnotify libpng opusfile python rust sdl2 spirv-tools sqlite vulkan-headers vulkan-icd-loader wavpack x264
Para Debian:
sudo apt install build-essential cargo cmake git glslang-tools google-mock libavcodec-extra libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libcurl4-openssl-dev libfreetype6-dev libglew-dev libnotify-dev libogg-dev libopus-dev libopusfile-dev libpng-dev libsdl2-dev libsqlite3-dev libssl-dev libvulkan-dev libwavpack-dev libx264-dev python rustc spirv-tools4
Compilación de DDNet
Usamos CMake para controlar el proceso de compilación, si tienes todas las dependencias instaladas, es tan fácil como seguir estos comandos (asegúrate de estar en la carpeta de DDNet):
mkdir build
cd build
cmake ..
make -j$(nproc)
Información general
Aquí tienes algo de información general:
- Actualmente, el código fuente está compilado con el estándar C++17, pero verás que muchas partes del código son más parecidas a C ya que solo la mayor parte del código nuevo utiliza cosas de C++17.
std::string
rara vez se usa, además de utilizarsystem.h
métodos para manejarlos es la norma.- La mayor parte del código de E/S, formateo e impresión se realiza utilizando los métodos proporcionados por
system.h
.
La disposición del código fuente
Ahora que ya puedes construir DDNet, puedes empezar a editarlo.
El directorio src/base
Dado que DDNet es un juego multiplataforma, se necesita una capa de abstracción para facilitar el desarrollo, y este directorio contiene muchas funciones útiles para ello.
El directorio src/engine
Aquí se encuentra el motor del juego, que se encarga de la mayoría de las cosas que no están relacionadas con la jugabilidad, como los gráficos, el sonido, la red, etc.
El directorio src/game
Todo el código relacionado con el juego está aquí, separado en cliente y servidor.
Del lado del servidor
Este juego utiliza su propio sistema jerárquico orientado a objetos de entidades, la clase principal de la que derivan todas las demás entidades esEntity Component System, the main class to which all other entities derive from is CEntity
located in src/game/server/entity.h
.
Estas entidades son gestionadas por el game world ubicado aquí src/game/server/gameworld.h
Algunas entidades importantes son:
- CCharacter: Representa un tee que esté vivo, se crea cuando aparece un tee y se elimina cuando muere. Para más información sobre el jugador que se mantiene entre muertes, véase CPlayer.
Lado del cliente
El lado del cliente está formado por componentes, que son clases que heredan de CComponent
: Estos componentes pueden aplicar métodos virtuales como OnInit
, OnMessage
, etc. Para proporcionar su funcionalidad.
Redes
El protocolo de red en su mayoría es generado por scripts python que generan código C++, por ejemplo, datasrc/network.py
define todos los paquetes de red.
Convenciones de código
El debate en curso sobre las convenciones del código se encuentra aquí: ddnet#2945
Actualmente, se aplica lo siguiente:
Estilo de indentación
Allman style se utiliza.
This style puts the brace associated with a control statement on the next line, indented to the same level as the control statement. Statements within the braces are indented to the next level.
while(x == y)
{
Something();
SomethingElse();
}
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
FinalThing();
Classes and Structs
Must be prefixed by C
(for legacy reasons this is ignored for structs in some places, such as in graphics code) or I
for interfaces. New struct
s should be prefixed by S
.
Ejemplo:
class CCharacter : public CEntity
{
// ...
}
Enums and constants
Should be screaming snake case [1], for example: MAX_PLAYERS
enum
{
FAKETUNE_FREEZE = 1,
FAKETUNE_SOLO = 2,
FAKETUNE_NOJUMP = 4,
FAKETUNE_NOCOLL = 8,
FAKETUNE_NOHOOK = 16,
FAKETUNE_JETPACK = 32,
FAKETUNE_NOHAMMER = 64,
};
Variable naming
- 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
.
Prefijos
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:
Formato del texto
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "number: %d", 2);
See printf documentation for a list of all format specifiers.
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!");
Impresión de depuración
int i = 2;
dbg_msg("wikiprint", "Hello from the ddnet wiki: %d", i);
Translating text in the client
Localize
can be used in the game client to get the translation for a specific string from the language file selected by the user.DoButton(..., Localize("Connect"), ...);
char aBuf[128];
str_format(aBuf, sizeof(aBuf), Localize("%d of %d servers"), NumServers, TotalServers);
Localize
and collect the strings to update the translation files. For this reason, the call to Localize
must not contain any other code, or the script cannot determine the text correctly.// Do NOT do this:
const char *pStr = Localize(Team == TEAM_RED ? "Red team" : "Blue team");
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
// Do this instead:
const char *pStr = Team == TEAM_RED ? Localize("Red team") : Localize("Blue team");
Recursos externos
- UI Code in DDraceNetwork by Ryozuki
- 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
- Teeworlds 0.6/0.7 network protocol documentation by ChillerDragon
About Tee Skin Rendering
This section explains how to render a tee skin.
Values put together by Patiga
Special Thanks to Jupstar Segment Scaling: body: 100% feet: 150% eyes: 120% eye blink: 45% hand: 93.75% Positioning: 64/64 = 1 = width or height of the body segment body: 4/64 up feet: 10/64 down 7/64 left/right eyes: 0.125 up 0.05 left/right eye movement: dir = angle of eyes (view angle), right = 0 eyes: x: cos(dir) * 0.125 y: sin(dir) * 0.1 each eye (away from the other): x: abs(cos(dir)) * 0.01