Es/Thinking: Difference between revisions
Kestrelguy (talk | contribs) m (Kestrelguy moved page Think():es to Thinking:es: moved to match location of English page.) |
Kestrelguy (talk | contribs) (updated language bar. still needs some translation done.) |
||
Line 1: | Line 1: | ||
{{ | {{lang|title=Pensando|Thinking}} | ||
|title=Pensando | {{translate in Progress:es}} | ||
| | |||
}} | |||
Las funciones de pensar, '''"think functions"''', permiten a las entidades programar código que más tarde se ejecutará. Mediante reprogramando "thinks", se pueden hacer bucles automáticos, que pueden hacer que una entidad, sea autónoma, pueda pensar por sí misma. | Las funciones de pensar, '''"think functions"''', permiten a las entidades programar código que más tarde se ejecutará. Mediante reprogramando "thinks", se pueden hacer bucles automáticos, que pueden hacer que una entidad, sea autónoma, pueda pensar por sí misma. | ||
== Scheduling / Programar == | |||
== Scheduling / | |||
<code>SetNextThink()</code> se utiliza para configurar cuándo una entidad debería pensar la siguiente acción. Acepta valores [[Float:es|flotantes]]. | <code>SetNextThink()</code> se utiliza para configurar cuándo una entidad debería pensar la siguiente acción. Acepta valores [[Float:es|flotantes]]. | ||
Line 30: | Line 22: | ||
</source> | </source> | ||
Date cuenta del uso de | Date cuenta del uso de <tt>gpGlobals->curtime</tt>, para hacer que un valor que haya sido enviado, sea relativo al tiempo de ejecución. | ||
{{tip:es|<code>SetNextThink(-1)</code> cancelará cualquier futuro "think". Esto es mejor que utilizar <tt>SetNextThink(NULL)</tt>, porque <tt>TICK_NEVER_THINK</tt> ("«tick» nunca piensa) se significa por "-1".}} | |||
{{tip| | |||
== Nuevas funciones de pensar (think)== | == Nuevas funciones de pensar (think)== | ||
Una entidad puede tener cualquier número de funciones de pensar adicionales. Para registrar una nueva: | Una entidad puede tener cualquier número de funciones de pensar adicionales. Para registrar una nueva: | ||
# Asegúrate de que la función es un | # Asegúrate de que la función es un <tt>void</tt>. | ||
# Añádela a la tabla de descripciones de la entidad, es decir, | # Añádela a la tabla de descripciones de la entidad, es decir, [[DATADESC]] {{en}}, con el código <tt>DEFINE_THINKFUNC()</tt>. | ||
# Llama a la función | # Llama a la función <code>SetThink()</code> y envía un pointer a la función. Debajo hay un ejemplo. | ||
# Asegúrate de que | # Asegúrate de que <code>DECLARE_DATADESC();</code> está en la clase. | ||
<source lang=cpp> | <source lang=cpp> | ||
Line 63: | Line 53: | ||
Dividiendo tu código de pensar en diferentes funciones hace más fácil que una entidad pueda cambiar entre distintos modos de operación. | Dividiendo tu código de pensar en diferentes funciones hace más fácil que una entidad pueda cambiar entre distintos modos de operación. | ||
{{tip:es|<code>SetThink()</code> también puede ser llamado dentro de una función de pensar. La siguiente llamada será a la nueva función.}} | |||
== Usar contextos== | |||
== | |||
Es posible programar cualquier número de funciones Think(), simultáneamente, con los contextos de pensar, o en inglés 'think contexts'. Para crear un nuevo contexto: | Es posible programar cualquier número de funciones Think(), simultáneamente, con los contextos de pensar, o en inglés 'think contexts'. Para crear un nuevo contexto: | ||
Line 105: | Line 91: | ||
Esto crea dos bucles de pensar simultáneos, los dos escriben un mensaje en la consola, a una velocidad distinta. | Esto crea dos bucles de pensar simultáneos, los dos escriben un mensaje en la consola, a una velocidad distinta. | ||
{{tip:es|Crear un nuevo contexto es una buena forma de retrasar llamadas a funciones al futuro, sin romper los bucles Think() que se estén ejecutando.}} | |||
{{tip|Crear un nuevo contexto es una buena forma de retrasar llamadas a funciones al futuro, sin romper los bucles Think() que se estén ejecutando.}} | |||
== Utilidades == | == Utilidades == | ||
Esto se explica por sí solo: | Esto se explica por sí solo: | ||
Line 123: | Line 106: | ||
The <code>GetLast</code> functions are useful for controlling the rate at which something occurs. | The <code>GetLast</code> functions are useful for controlling the rate at which something occurs. | ||
This think code from | This think code from {{ent:es|npc_barnacle}} modulates the speed of tongue movement, even if the frequency of thinking changes: | ||
<source lang=cpp> | <source lang=cpp> | ||
Line 152: | Line 135: | ||
; CLIENT_THINK_ALWAYS | ; CLIENT_THINK_ALWAYS | ||
: Think on the client once every frame. Use with caution! {{tip|Use <code>[[gpGlobals]]->frametime</code> to regulate speed.}} | : Think on the client once every frame. Use with caution! {{tip:es|Use <code>[[gpGlobals]]->frametime</code> to regulate speed.}} | ||
; CLIENT_THINK_NEVER | ; CLIENT_THINK_NEVER | ||
: Pause all automated client thinking. | : Pause all automated client thinking. | ||
[[Category:Programming]] | [[Category:Programming:es]] | ||
[[Category:AI]] | [[Category:AI:es]] | ||
[[Category:Functions]] | [[Category:Functions:es]] |
Revision as of 16:46, 31 May 2022
Template:Translate in Progress:es Las funciones de pensar, "think functions", permiten a las entidades programar código que más tarde se ejecutará. Mediante reprogramando "thinks", se pueden hacer bucles automáticos, que pueden hacer que una entidad, sea autónoma, pueda pensar por sí misma.
Scheduling / Programar
SetNextThink()
se utiliza para configurar cuándo una entidad debería pensar la siguiente acción. Acepta valores flotantes.
void CMyEntity::Spawn()
{
BaseClass::Spawn();
SetNextThink( gpGlobals->curtime ); // Pensar AHORA
}
void CMyEntity::Think()
{
BaseClass::Think(); // Always do this if you override Think() ... Siempre hacer esto si sobreescribimos "Think()".
Msg( "Pienso, luego existo.\n" );
SetNextThink( gpGlobals->curtime + 1 ); // Volver a pensar dentro de un segundo.
}
Date cuenta del uso de gpGlobals->curtime, para hacer que un valor que haya sido enviado, sea relativo al tiempo de ejecución. Template:Tip:es
Nuevas funciones de pensar (think)
Una entidad puede tener cualquier número de funciones de pensar adicionales. Para registrar una nueva:
- Asegúrate de que la función es un void.
- Añádela a la tabla de descripciones de la entidad, es decir, DATADESC
, con el código DEFINE_THINKFUNC().
- Llama a la función
SetThink()
y envía un pointer a la función. Debajo hay un ejemplo. - Asegúrate de que
DECLARE_DATADESC();
está en la clase.
BEGIN_DATADESC( CMiEntidad )
DEFINE_THINKFUNC( MiPensamiento ), // Register new think function .... Registra una nueva funcion Think()
END_DATADESC()
void CMiEntidad::Spawn()
{
BaseClass::Spawn();
SetThink( &CMiEntidad::MiPensamiento ); // Pass a function pointer ... Envia un pointer a la funcion
SetNextThink(gpGlobals->curtime);
}
void CMiEntidad::MiPensamiento()
{
Msg( "Pienso, luego existo.\n" );
SetNextThink( gpGlobals->curtime + 1 );
}
Dividiendo tu código de pensar en diferentes funciones hace más fácil que una entidad pueda cambiar entre distintos modos de operación. Template:Tip:es
Usar contextos
Es posible programar cualquier número de funciones Think(), simultáneamente, con los contextos de pensar, o en inglés 'think contexts'. Para crear un nuevo contexto:
- Llama a
RegisterThinkContext(string NombreContexto)
- Llama a
SetContextThink(void* Function, float NextThinkTime, string NombreContexto)
- Para Thinks() subsecuentes llama a
SetNextThink(float NextThinkTime, string NombreContexto)
BEGIN_DATADESC( CMiEntidad )
DEFINE_THINKFUNC( NombreContexto ),
END_DATADESC()
void CMiEntidad::Spawn()
{
SetNextThink( gpGlobals->curtime ); // Bucle por defecto de pensar - sin contexto
RegisterThinkContext( "ContextoPrueba" );
SetContextThink( & CMiEntidad::NombreContexto , gpGlobals->curtime, "ContextoPrueba" );
}
void CMiEntidad::Think()
{
BaseClass::Think();
Msg( "Pensar\n" );
SetNextThink( gpGlobals->curtime + .1 );
}
void CMiEntidad::NombreContexto()
{
Msg( "Pensar contexto\n" );
SetNextThink(gpGlobals->curtime + .2, "ContextoPrueba" );
}
Esto crea dos bucles de pensar simultáneos, los dos escriben un mensaje en la consola, a una velocidad distinta. Template:Tip:es
Utilidades
Esto se explica por sí solo:
float GetLastThink()
float GetNextThink()
int GetLastThinkTick()
int GetNextThinkTick()
The GetLast
functions are useful for controlling the rate at which something occurs.
This think code from npc_barnacle modulates the speed of tongue movement, even if the frequency of thinking changes:
float dt = gpGlobals->curtime - GetLastThink(); // dt is "delta time"
SetAltitude( m_flAltitude + m_flBarnaclePullSpeed * dt ); // Change tongue altitude
For its non-skeletal animation to be smooth this code would need to be executed every frame. This is exactly what happens, until the barnacle is no longer in the player's PVS and the rate is slowed down – thus requiring the above code.
ClientThink()
Thinking can also occur on the client, but its effects are limited. Only one think function is supported for each entity.
void C_MyEntity::ClientThink() { Msg( "Don't put anything expensive in this function!\n" ); SetNextClientThink( CLIENT_THINK_ALWAYS ); // Think every frame }
Some examples of client-side thinking are:
- Visual effects / particles
- VGUI screen interaction
- Modifying player speed (done on the client as well as server to avoid prediction errors)
- Striders’ legs snapping ropes (disabled by default)
SetNextClientThink()
is used to schedule ClientThink()
. There are two special values it accepts:
- CLIENT_THINK_ALWAYS
- Think on the client once every frame. Use with caution! Template:Tip:es
- CLIENT_THINK_NEVER
- Pause all automated client thinking.