Source SDK

Source SDK

Not enough ratings
Partículas en el código - Motor Source 2013
By Oitnemood
Esta página detalla el manejo de las partículas de la "Caja Naranja" en código C++. No cubre la antigua tecnología de partículas codificadas.
https://developer.valvesoftware.com/wiki/Particles_In_Code
   
Award
Favorite
Favorited
Unfavorite
Precaching
Los sistemas de partículas deben ser precacheados antes de poder ser utilizados. Esto se puede conseguir listando el archivo PCF que los contiene en particles_manifest.txt y utilizando la función PrecacheParticleSystem() en el código. Como alternativa, todos los efectos de partículas dentro de un PCF pueden ser precacheados añadiendo un carácter '!' como prefijo a la ruta utilizada en particles_manifest.txt.

Precache mediante código:

PrecacheParticleSystem( "your_particle_effect_name" );

Precache mediante script:

particles_manifest { "file" "!particles/blood_impact.pcf" // todos los efectos se almacenarán en el mapa "file" "particles/fire_01.pcf" // los efectos contenidos en este archivo tendrán que ser precargados manualmente [...] }
Shared
Dispatching
Cuando se envíen desde el servidor, los sistemas de partículas se conectarán en red como entidades temporales.
#include "particle_parse.h" // Crear en coordenadas mundiales DispatchParticleEffect( "my_particle", vecOrigin, angAngles, pOwnerEntity ) // Crear en el anexo del modelo DispatchParticleEffect( "my_particle", ParticleAttachment_t, pOwner, iAttachment, bResetAllParticlesOnEntity )

  • Véase también ParticleAttachment_t, más abajo.
  • vecStart, tomado por algunas sobrecargas de DispatchParticleEffect(), define la ubicación del punto de control 1. Si no se especifica vecStart, se utiliza el valor de vecOrigin en su lugar.
  • Bug: El código de Valve para despachar una partícula en un anexo del modelo está roto. Obtenga la corrección aquí.
Client
Creación

Para un mayor control sobre el efecto, un sistema de partículas puede ser creado por un nuevo objeto CNewParticleEffect y gestionado a través del accesorio ParticleProp() de la entidad propietaria:

#include "particles_new.h" C_MyEntity::MessWithParticles() { // Crear un nuevo sistema CNewParticleEffect* pEffect = ParticleProp()->Create( "my_particles", PATTACH_ABSORIGIN ); // El sistema ya existe CNewParticleEffect* pEffect = ParticleProp()->FindEffect( "my_particles" ); }

Particles_new.h también debe ser #incluido aquí.

Alternativamente, puedes engancharte a los eventos de creación de partículas:

void C_MyEntity::OnNewParticleEffect( const char* pszParticleName, CNewParticleEffect* pNewParticleEffect ) { if ( V_strcmp(pszParticleName, "target_effect_name") == 0 ) { // Haz algo } }

Advertencia: Un mensaje de envío desde el servidor configura tanto el punto de control 0 COMO el 1. Los valores se aplican después de llamar a OnNewParticleEffect(), ¡así que no te molestes en intentar asignar ninguno de esos CP desde él!
Puntos de control
Al despachar un efecto desde el servidor puedes definir la ubicación de los puntos de control 0 (con vecOrigin) y 1 (con vecStart).

En el cliente, puedes configurar la localización, rotación y entidad padre de cualquier CP con estas funciones de CNewParticleEffect:

SetControlPoint( Vector )
Establece arbitrariamente el valor del CP.
SetControlPointEntity( CBaseEntity* )
Sigue el origen de la entidad dada.
Confirmar: Establecer a NULL para deshabilitar el seguimiento.
SetControlPointOrientation( QAngle )
SetControlPointRightVector()
SetControlPointForwardVector()
SetControlPointUpVector()
Establece la orientación con un QAngle o una serie de Vectores.
Destrucción de
StopParticleEffects( CBaseEntity* )
Detiene todos los efectos en la entidad dada.
ParticleProp()->StopParticlesInvolving( CBaseEntity* )
Detiene todos los efectos con un punto de control unido a la entidad dada. Para hacer: ¿Global o sólo en la entidad actual?
ParticleProp()->StopParticlesNamed( const char* )
Detiene todos los efectos con el nombre del sistema dado. Para hacer: ¿Global o sólo en la entidad actual? ¿Global o sólo en la entidad actual?
CNewParticleEffect::StopEmission( bool bInfiniteOnly, bool bRemoveAllParticles, bool bWakeOnStop)
Detiene el sistema de partículas actual, sin eliminarlo. Para hacer: Significado del primer y tercer argumento.
ParticleAttachment_t
Uno de estos valores se pasa al despachar o crear un efecto:

PATTACH_ABSORIGIN
PATTACH_ABSORIGIN_FOLLOW
Desaparece en (y opcionalmente sigue) el origen de la entidad.
PATTACH_POINT
PATTACH_POINT_FOLLOW
Aparece en (y opcionalmente sigue) un punto de fijación en el modelo de la entidad.
PATTACH_CUSTOMORIGIN
Desaparece en un origen determinado.
PATTACH_WORLDORIGIN
No se asocia con una entidad en absoluto. Utilícelo con precaución
podría causar fácilmente fugas