
[jeu] gérer des évènements
Re: [jeu] gérer des évènements
Je suis au boulot. Je te fait un exemple ce soir 

Re: [jeu] gérer des évènements
Merci beaucoupG-Rom a écrit :Je suis au boulot. Je te fait un exemple ce soir

http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
-
- Messages : 117
- Inscription : dim. 21/déc./2008 18:39
Re: [jeu] gérer des évènements
Merci G-Rom, ton exemple est très clair, je vais m'y essayer de ce pas.
http://www.purebasicstreet.com/ - Site dédié à purebasic.
Re: [jeu] gérer des évènements
voila, c'est du vite fait , mais c'est déjà pas mal robuste pour faire une très bonne base :
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
Re: [jeu] gérer des évènements
parceque tu as ecris 2 fois le meme message d'affilé espece de tafiole !G-Rom a écrit :pourquoi ?

profite z'en pour t'acheter une nouvelle paire de monocle

Re: [jeu] gérer des évènements
J'avais pas vu
C'est bizarre ce double post a la meme heure. Cela montre une des faiblesses du php & de html.
Faudrais vraiment que l'on passe a autre chose... Enfin bon je m'éloigne...

C'est bizarre ce double post a la meme heure. Cela montre une des faiblesses du php & de html.
Faudrais vraiment que l'on passe a autre chose... Enfin bon je m'éloigne...
Re: [jeu] gérer des évènements
t'es trop nerveux sur le Click gauche !
t'as envoyé 2 fois le meme message avec le meme click
G-Rom l'homme qui click plus vite que la pensée
t'as envoyé 2 fois le meme message avec le meme click
G-Rom l'homme qui click plus vite que la pensée

Re: [jeu] gérer des évènements
salut
G-rom : encore une fois, merci beaucoup, sacré exemple. Je vais le garder sous la main. Je ne sais pas si je vais l'utiliser tel quel (car sinon, je devrais ré-écrire une grosse partie de mon code et comment dire, je suis un peu en retard dans mes prévisions ^^). Mais c'est vraiment intéressant. En plus, j'ai pratiquement tout compris
.
G-rom : encore une fois, merci beaucoup, sacré exemple. Je vais le garder sous la main. Je ne sais pas si je vais l'utiliser tel quel (car sinon, je devrais ré-écrire une grosse partie de mon code et comment dire, je suis un peu en retard dans mes prévisions ^^). Mais c'est vraiment intéressant. En plus, j'ai pratiquement tout compris

http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english