Re: [jeu] gérer des évènements
Publié : lun. 21/mai/2012 13:07
Je suis au boulot. Je te fait un exemple ce soir 
Merci beaucoupG-Rom a écrit :Je suis au boulot. Je te fait un exemple ce soir
Code : Tout sélectionner
Structure Trigger
*Condition_func.i
*Action_func.i
List condition_parameter.i()
List action_parameter.i()
EndStructure
Procedure.b PNJ_IS_DEAD(PNJ_id.i)
bool.b = Random(1)
If bool = #True
Debug "pnj id "+Str(PNJ_id)+" is dead"
Else
Debug "pnj id "+Str(PNJ_id)+" is alive"
EndIf
ProcedureReturn bool
EndProcedure
Procedure PNJ_MOVE_TO(PNJ_id.i, x.i, y.i)
Debug "pnj id "+Str(PNJ_id)+" move to " + Str(x) + ":"+ Str(y)
EndProcedure
; EXEMPLE SIMPLE
#PNJ_A = 10
#PNJ_B = 20
#PNJ_C = 30
#PNJ_D = 40
; déclaration d'un evenement
Event.Trigger
; Condition ( si le joueur est mort )
Event\Condition_func = @PNJ_IS_DEAD()
AddElement(Event\condition_parameter())
Event\condition_parameter() = #PNJ_A
;Action ( alors on bouge )
Event\Action_func = @PNJ_MOVE_TO()
AddElement(Event\action_parameter())
Event\action_parameter() = #PNJ_B
AddElement(Event\action_parameter())
Event\action_parameter() = Random(65535)
AddElement(Event\action_parameter())
Event\action_parameter() = Random(65535)
; execution du trigger
If CallFunctionFast(Event\Condition_func, Event\condition_parameter()) = #True ; si la condition est vraie
FirstElement(Event\action_parameter()) ; on récupère les paramètres
A.i = Event\action_parameter() : NextElement(Event\action_parameter())
B.i = Event\action_parameter() : NextElement(Event\action_parameter())
C.i = Event\action_parameter()
CallFunctionFast(Event\Action_func , A,B,C ) ; on appelle l'action
EndIf
; EXEMPLE AVEC DES FONCTIONS QUI "MACHE LE TRAVAIL"
Procedure.i CreateTrigger(*Condition.i, Array cParam.i(1), *Action.i, Array aParam.i(1) )
*t.Trigger = AllocateMemory(SizeOf(Trigger))
InitializeStructure(*t,trigger)
*t\Condition_func = *Condition
*t\Action_func = *Action
; on récupère les paramètres
For i = 0 To ArraySize(aParam(),1) - 1
AddElement(*t\action_parameter())
*t\action_parameter() = aParam(i)
Next
For i = 0 To ArraySize(cParam(),1) - 1
AddElement(*t\condition_parameter())
*t\condition_parameter() = cParam(i)
Next
ProcedureReturn *t
EndProcedure
Procedure ExecuteTrigger(*t.trigger, test.b = #True )
aParamCout.i = ListSize( *t\action_parameter() )
cParamCout.i = ListSize( *t\condition_parameter() )
Dim paramCondition( cParamCout )
FirstElement(*t\condition_parameter())
For i = 0 To cParamCout
paramCondition(i) = *t\condition_parameter()
NextElement(*t\condition_parameter())
Next
Dim paramAction( aParamCout )
FirstElement(*t\action_parameter())
For i = 0 To aParamCout
paramAction(i) = *t\action_parameter()
NextElement(*t\action_parameter())
Next
conditionResult.b = #False
; appel de la fonction de condition en fonction du nombre de paramètres ( limité à 5 paramètres maxi ici )
Select cParamCout
Case 0 :
conditionResult = CallFunctionFast(*t\Condition_func)
Case 1 :
conditionResult = CallFunctionFast(*t\Condition_func, paramCondition(0) )
Case 2 :
conditionResult = CallFunctionFast(*t\Condition_func, paramCondition(0), paramCondition(1) )
Case 3 :
conditionResult = CallFunctionFast(*t\Condition_func, paramCondition(0), paramCondition(1), paramCondition(2) )
Case 4 :
conditionResult = CallFunctionFast(*t\Condition_func, paramCondition(0), paramCondition(1), paramCondition(2), paramCondition(3) )
Case 5 :
conditionResult = CallFunctionFast(*t\Condition_func, paramCondition(0), paramCondition(1), paramCondition(2), paramCondition(3), paramCondition(4) )
EndSelect
If conditionResult = test ; la condition est vraie ou fausse , selon le paramètre test, alors on execute l'action
Select aParamCout ; appel de la fonction action en fonction du nombre de paramètres ( limité à 5 paramètres maxi ici )
Case 0 :
CallFunctionFast(*t\Action_func)
Case 1 :
CallFunctionFast(*t\Action_func, paramAction(0) )
Case 2 :
CallFunctionFast(*t\Action_func, paramAction(0), paramAction(1) )
Case 3 :
CallFunctionFast(*t\Action_func, paramAction(0), paramAction(1), paramAction(2) )
Case 4 :
CallFunctionFast(*t\Action_func, paramAction(0), paramAction(1), paramAction(2), paramAction(3) )
Case 5 :
CallFunctionFast(*t\Action_func, paramAction(0), paramAction(1), paramAction(2), paramAction(3), paramAction(4) )
EndSelect
EndIf
EndProcedure
; Fonctions de condition :
Procedure.b PNJ_IS_PRESENT_IN_RECTANGLE(PNJ_ID.i, X.i, Y.i , SIZEX.i, SIZEY.i)
; a toi de la codé...
bool.b = Random(1)
If bool = #True
Debug "PNJ_ID = "+Str(PNJ_ID)+" EST DANS LE RECTANGLE"
Debug "Alors... "
EndIf
ProcedureReturn bool ; 0 ou 1...
EndProcedure
Procedure.b PNJ_HAVE_ITEM(PNJ_ID.i, ITEM.i)
; a toi de la codé...
bool.b = Random(1)
If bool = #True
Debug "PNJ_ID = "+Str(PNJ_ID)+" POSSEDE L'ITEM "+Str(ITEM)
Debug "Alors... "
EndIf
ProcedureReturn bool ; 0 ou 1...
EndProcedure
Procedure.b PNJ_OPEN_DOOR(PNJ_ID.i, DOOR_ID.i)
bool.b = Random(1)
If bool = #True
Debug "PNJ_ID = "+Str(PNJ_ID)+" OUVRE LA PORTE "+Str(DOOR_ID)
Debug "Alors... "
EndIf
ProcedureReturn bool ; 0 ou 1...
EndProcedure
; Fonctions d'action
Procedure IA_SEARCH_AND_KILL_PNJ(PNJ_ID.i)
Debug "IA SEARCH AND KILL PNJ_ID = "+Str(PNJ_ID)
EndProcedure
Procedure IA_BECOME_SLAVE(PNJ_ID.i)
Debug "IA BECOME SLAVE OF PNJ_ID = "+Str(PNJ_ID)
EndProcedure
Procedure OPEN_DOOR(DOOR_ID)
Debug "OPEN DOOR ID = " +Str(DOOR_ID)
EndProcedure
; TEST DE TOUT CA :
Debug ""
Dim ConditionParametre(5) ; paramètre de la fonction PNJ_IS_PRESENT_IN_RECTANGLE()
ConditionParametre(0) = #PNJ_A
ConditionParametre(1) = 10
ConditionParametre(2) = 10
ConditionParametre(3) = 100
ConditionParametre(4) = 200
Dim ActionParametre(1)
ActionParametre(0) = #PNJ_A
*MonEvenement = CreateTrigger(@PNJ_IS_PRESENT_IN_RECTANGLE(), ConditionParametre(), @IA_SEARCH_AND_KILL_PNJ(), ActionParametre() )
For i = 0 To 4
Debug " TEST SI PNJ_A EST DANS UNE ZONE "
Debug ""
ExecuteTrigger(*MonEvenement)
Debug ""
Delay(250)
Next
parceque tu as ecris 2 fois le meme message d'affilé espece de tafiole !G-Rom a écrit :pourquoi ?