De/CHandle: Difference between revisions

From Valve Developer Community
< De
Jump to navigation Jump to search
(Created page with '{{otherlang2 |en=CHandle }} {{toc-right}} '''CHandle''' ist eine C++ Klasse, die eine eindeutige 32-Bit ID (entindex + serial number) für jede vergangene und kommende Entity im…')
 
m (language...)
Line 4: Line 4:
{{toc-right}}
{{toc-right}}


'''CHandle''' ist eine C++ Klasse, die eine eindeutige 32-Bit ID (entindex + serial number) für jede vergangene und kommende Entity im Spiel darstellt. Es wird verwendt, um auf Entities zu verweisen, wo [[pointer:de|Pointer]] und [[entity index:de|Entity Index]]e unsicher sind; hauptsächlich über die Client-/Server-Kluft und nach dem Laden eines Spielstands.
'''CHandle''' ist eine C++ Klasse, die eine eindeutige 32-Bit ID (entindex + serial number) für jede entfernte und neu erstellte Entity im Spiel darstellt. Es wird verwendet, um auf Entities zu verweisen, wo [[pointer:de|Pointer]] und [[entity index:de|Entity Indizes]] unsicher sind; hauptsächlich über die Client-/Server-Kluft und nach dem Laden eines Spielstandes.


{{tip:de|Zugriffe auf CHandles sind langsamer, als Zugriffe auf Pointer. Wenn man Pointer zu Zugriffszwecken erzeugt und sie Spielstände unterstützen, muss man an das wiedererzeugen über <code>[[Restore()]]</code> denken!}}
{{tip:de|Zugriffe auf CHandles sind langsamer als Zugriffe auf Pointer. Wenn man Pointer zu Zugriffszwecken erzeugt und sie Spielstände unterstützen sollen, muss man sie über <code>[[Restore()]]</code> neu definieren!}}


== Gebrauch ==
== Gebrauch ==
Line 12: Line 12:
  CHandle<YourStoredClass> hMyHandle;
  CHandle<YourStoredClass> hMyHandle;


Ein CHandle ist den Pointern sehr ähnlich, aber weil es eine maßgeschneiderte C++ Klasse ist und kein Built-In Feature, ist extra Syntax an manchen Stellen notwendig:
Ein CHandle ist den Pointern sehr ähnlich, aber weil es eine maßgeschneiderte C++ Klasse ist und kein built-in Feature, ist eine besondere Syntax an manchen Stellen notwendig:


* Man muss einen Pointer zum Objekt anbinden, nicht das Objekt selbst.
* Man muss einen Pointer zum Objekt anbinden, nicht das Objekt selbst.
* Des <code>CHandle</code>s <code>Get()</code> Funktion oder ein Cast ist erforderlich, um auf die gespeicherte Klasse zuzugreifen.
* Des <code>CHandle</code>s <code>Get()</code> Funktion oder ein Cast ist erforderlich, um auf die gespeicherte Klasse zuzugreifen.
* <code>IsValid()</code> wird benutzt, um zu überprüfen, ob ein Wert gespeichert wird.
* <code>IsValid()</code> wird benutzt, um zu überprüfen, ob ein Wert gespeichert wird.
* Zum ungültig machen, muss <code>Term()</code> aufgerufen oder <code>INVALID_EHANDLE_INDEX</code> zugeordnet werden.
* Um ein <code>CHandle</code> ungültig zu machen, muss <code>Term()</code> aufgerufen oder <code>INVALID_EHANDLE_INDEX</code> zugeordnet werden.


== EHANDLE ==
== EHANDLE ==


CHandle wird häufig durch das <code>EHANDLE</code> typedef durch benutzt, welches die Kurzschrift für <code>CHandle<C_BaseEntity></code> ist. Wenn man eine bestimmte Klasse speichern will, ist es besser, einen spezifischeren CHandle manuell zu deklarieren (siehe vorheriger Abschnitt).
CHandle wird häufig durch das <code>EHANDLE</code> typedef benutzt, welches die Kurzform für <code>CHandle<C_BaseEntity></code> ist. Wenn man eine bestimmte Klasse speichern will, ist es besser, einen spezifischeren CHandle manuell zu deklarieren (siehe vorheriger Abschnitt).


== Beispiel ==
== Beispiel ==
Line 28: Line 28:
CBasePlayer* pPlayer = gEntList.FindEntityByClassname( NULL, "player" );
CBasePlayer* pPlayer = gEntList.FindEntityByClassname( NULL, "player" );
   
   
// speichere es(zwei Mal, zu Demonstrationszwecken)
// speichere es (zwei Mal, zu Demonstrationszwecken)
EHANDLE hPlayer = pPlayer;
EHANDLE hPlayer = pPlayer;
CHandle<CBasePlayer> hPlayer_ = pPlayer;
CHandle<CBasePlayer> hPlayer_ = pPlayer;

Revision as of 06:39, 24 May 2011

Template:Otherlang2

CHandle ist eine C++ Klasse, die eine eindeutige 32-Bit ID (entindex + serial number) für jede entfernte und neu erstellte Entity im Spiel darstellt. Es wird verwendet, um auf Entities zu verweisen, wo Pointer und Entity Indizes unsicher sind; hauptsächlich über die Client-/Server-Kluft und nach dem Laden eines Spielstandes.

Template:Tip:de

Gebrauch

CHandle<YourStoredClass> hMyHandle;

Ein CHandle ist den Pointern sehr ähnlich, aber weil es eine maßgeschneiderte C++ Klasse ist und kein built-in Feature, ist eine besondere Syntax an manchen Stellen notwendig:

  • Man muss einen Pointer zum Objekt anbinden, nicht das Objekt selbst.
  • Des CHandles Get() Funktion oder ein Cast ist erforderlich, um auf die gespeicherte Klasse zuzugreifen.
  • IsValid() wird benutzt, um zu überprüfen, ob ein Wert gespeichert wird.
  • Um ein CHandle ungültig zu machen, muss Term() aufgerufen oder INVALID_EHANDLE_INDEX zugeordnet werden.

EHANDLE

CHandle wird häufig durch das EHANDLE typedef benutzt, welches die Kurzform für CHandle<C_BaseEntity> ist. Wenn man eine bestimmte Klasse speichern will, ist es besser, einen spezifischeren CHandle manuell zu deklarieren (siehe vorheriger Abschnitt).

Beispiel

// Erzeuge einen Pointer auf eine Entity
CBasePlayer* pPlayer = gEntList.FindEntityByClassname( NULL, "player" );
 
// speichere es (zwei Mal, zu Demonstrationszwecken)
EHANDLE hPlayer = pPlayer;
CHandle<CBasePlayer> hPlayer_ = pPlayer;
 
// konvertiere das EHANDLE zurück in einen CBasePlayer-Pointer
pPlayer = dynamic_cast<CBasePlayer*>( hPlayer.Get() );

Siehe auch