Development/es: Difference between revisions

From DDraceNetwork
Created page with "== Obtener el código fuente =="
Tags: mobile web edit mobile edit
Created page with "=== El directorio src/game ==="
Line 96: Line 96:
Algunas entidades importantes son:
Algunas entidades importantes son:


<div lang="en" dir="ltr" class="mw-content-ltr">
* [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].
* [https://github.com/ddnet/ddnet/blob/master/src/game/server/entities/character.h CCharacter]: Represents a [[Special:MyLanguage/Common_Terminology#Tee|tee]] that is alive, it is instantiated when a tee spawns and deleted when it dies. For information about the player kept between deaths, see [https://github.com/ddnet/ddnet/blob/master/src/game/server/player.h CPlayer].
</div>




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Client_side"></span>
==== Client side ====
==== Lado del cliente ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
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.
The client side is made up of components, these are classes that inherit <code>CComponent</code>: These components can implement the virtual methods such as <code>OnInit</code>, <code>OnMessage</code>, etc. to provide their functionality.
</div>




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Networking"></span>
==== Networking ====
==== Redes ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 119: Line 113:




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Code_conventions"></span>
== Code conventions ==
== Convenciones de código ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 127: Line 120:
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Actualmente, se aplica lo siguiente:
Currently, the following applies:
</div>




Line 169: Line 160:
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Ejemplo:
Example:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 233: Line 222:




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Prefixes"></span>
==== Prefixes ====
==== Prefijos ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 253: Line 241:




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Formatting_text"></span>
=== Formatting text ===
=== Formato del texto ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 291: Line 278:




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Debug_printing"></span>
=== Debug printing ===
=== Impresión de depuración ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 303: Line 289:




<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="External_resources"></span>
== External resources ==
== Recursos externos ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">

Revision as of 02:11, 10 March 2023

Este artículo pretende introducirte en el desarollo 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++:

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 freetype2 git glew gmock libnotify opusfile python sdl2 sqlite wavpack


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 sólo la mayoría del código nuevo utiliza cosas de C++17.
  • std::string rara vez se usa, además de utilizar system.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 Entity 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

The network protocol is mostly generated by python scripts that output C++ code, for example, datasrc/network.py defines all network packets.


Convenciones de código

The ongoing discussion on code conventions is located here: ddnet#2945

Actualmente, se aplica lo siguiente:


Indentation style

Allman style is used.

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.

Ejemplo:

class CCharacter : public CEntity
{
    // ...
}


Enums and constants

Should be screaming snake case, 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.
  • g for global variables with external linkage: gs_MyGlobalStaticVar.


Prefijos

  • p for pointers: pMyPointer, m_pCharacter, ppMyPointerToPointer.
  • a for arrays: aMyArray, aBuf.
  • 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);


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);


Recursos externos