[jeu] gérer des évènements

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [jeu] gérer des évènements

Message par G-Rom »

Je suis au boulot. Je te fait un exemple ce soir ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] gérer des évènements

Message par blendman »

G-Rom a écrit :Je suis au boulot. Je te fait un exemple ce soir ;)
Merci beaucoup ;)
stombretrooper
Messages : 117
Inscription : dim. 21/déc./2008 18:39

Re: [jeu] gérer des évènements

Message par stombretrooper »

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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [jeu] gérer des évènements

Message par G-Rom »

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 


Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [jeu] gérer des évènements

Message par Backup »

G-Rom a écrit :pourquoi ?
parceque tu as ecris 2 fois le meme message d'affilé espece de tafiole ! :lol:

profite z'en pour t'acheter une nouvelle paire de monocle :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [jeu] gérer des évènements

Message par G-Rom »

J'avais pas vu :oops:
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...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [jeu] gérer des évènements

Message par Backup »

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 :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] gérer des évènements

Message par blendman »

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 :).
Répondre