National Game Zone
https://www.ngz.ro/forum/

[Tutorial] Touch
https://www.ngz.ro/forum/viewtopic.php?f=494&t=11235
Pagina 1 din 1

Autor:  Wizz. [ 07 Feb 2018, 14:46 ]
Subiectul mesajului:  [Tutorial] Touch

Touch = atingere, interactiune. In multe cazuri avem nevoie sa stim cand 2 entitati se ating, adica intra in contact una cu cealalta.



Exemplu: Entitatea A trece peste entitatea B, asta inseamna ca cele 2 entitati s-au atins. A este entitatea care atinge, B este cea care este atinsa.



Pentru a putea manipula putem sa alegem forwardurile puse la dispozitie de modulul engine, fakemeta si hamsandwich.

Cod:
//Engine
register_touch( "touched", "toucher", "public" )
//touched = cel care atinge
//toucher = cel care este atins
//public = publicul care este chemat


Cod:
//Fakemeta
register_forward( FM_Touch, "public" )
//public = publicul care este chemat


Cod:
//Hamsandwich
RegisterHam( Ham_Touch, "toucher", "public" )
//toucher = cel care atinge
//public = publicul care este chemat


Ce observam din exemplele de mai sus ?

Engine este cel mai flexibil, putem sa setam exact ce entitati ne intereseaza
Fakemeta este chemat pentru orice fel de touch, depinde de noi sa verificam ce entitati se ating.
Hamsandwich inregistreaza orice fel de touch cu entitatea toucher.

Headerul publicului va arata asa:


public public( touched, toucher )


Engine este cel mai rapid si cel mai flexibil. Poate sa preia modul in care hamsandwich functioneaza:

Cod:
register_touch( "touched", "*", "public" ) ( adica va inregistra orice touch dintre touched si o entitate ).


In forwardul fakemeta trebuie sa verificati manual daca entitatile care se ating sunt cele care va intereseaza. Hamsandwich va permite sa inregistrati orice touch facut de o entitate, dar trebuie sa verificati manual ce a atins.



Toucher, touched sunt clasele entitatilor. Fiecare entitate are o clasa, de exemplu un player are clasa "player", un ostatic are clasa "func_hostage", mapa are clasa "worldspawn". Pe langa aceste clasa default, va puteti crea propriile entitati cu clase custom.

Pentru a afla clasa unei entitati folosim:

Cod:
new szClassName[ 20 ]
pev( entittate, pev_classname, szClassName, charsmax( szClassName )


// in stringul szClassName va fi stocata clasa respectiva. O puteti compara cu equal/equali sau chiar contain/containi


Acum un mic exemplu: sa spunem ca vrei sa detectati atunci cand un player atinge un alt player.

Cod:
register_touch( "player", "player", "HookTouch" )


Cod:
public HookTouch( touched, toucher )
{
//toucher si touched sunt id-urile entitatilor.
client_print( toucher, print_chat, "Ai atins un player: %i", touched )
}



Pentru hamsandwich ar trebui sa verificati daca touched are clasa "player", in fakemeta trebuie sa verificati daca ambele au clasa player.



Pentru a simula un touch intre 2 entitati:
//engine
fake_touch( touched, toucher )
//fakemeta
dllfunc( DLLFunc_Touch, touched, toucher )


Pentru a bloca touch folositi:

Cod:
return 1( engine ), return FMRES_SUPERCEDE( fakemeta ) sau return HAM_SUPERCEDE( hamsandwich )

Pagina 1 din 1 Ora este UTC + 2 [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/