Dans Mon jeu Arkeos chronicle, j'ai :
- des ennemis que je peux combattre (en leur envoyant des sorts de magie (boule de feu, cercle de feu..)
- des sorts que j'envoie pour combattre les monstres.
Je dispose de plusieurs types de sorts et parmi ceux-ci, j'ai des sorts dit "de groupe", autrement dit qui peuvent attaquer plusieurs ennemis en même temps.
J'ai donc une question pour ceux que cela intéressent

- comment pensez-vous que je doive gérer les monstres et les sorts
Je vérifie déjà plusieurs le tableau des monstres (avec une boucle) et je me dis que faire encore une boucle sur le même tableau est un peu une perte de performance j'ai l'impression.
Pour le moment, j'ai créé un tableau pour les monstres, et une liste pour les sorts.
Lorsque je clique droit, j'ajoute un élément à cette liste (avec plein de paramètres).
J'ai donc le choix entre :
1) commencer une boucle sur les sorts, puis tester la collision avec chaque monstre
- faire une boucle pour chaque sorts
- vérifier le type de sort
- si c'est un sort de groupe, faire une boucle pour chaque ennemi
- vérifier la collision : sort/ennemi
- si collision => action du sort
2) commencer une boucle sur les monstres, puis tester la collision avec chaque sort
- faire une boucle pour chaque monstre
- faire une boucle pour chaque sorts
- vérifier la collision : sort/ennemi
- vérifier le type de sort
- si c'est un sort de groupe
- si collision => action du sort sur le monstre
Le problème est que je dois mettre un délai sur ce sort sinon, ça enlève trop de vie d'un coup sur les mobs.
Autre problème : j'effectue déjà une boucle sur les monstres pour tester d'autres choses (déplacement, perte de vie, combat..).
En gros, voici un code (incomplet, mais je peux le compléter si besoin, c'est juste pour que vous voyez l'idée) :
Code : Tout sélectionner
;{ structures
Structure stSort
sprite.w
type.a ; sort d'attaque, de soin, téléportation...
cible.a ; mobile, fixe, cible ennemi, cible player.; + = seul, - = de groupe.
vie.w; durée de vie du sort
degat.w
; position
cible_pos.point
x.w : y.w
EndStructure
Global NewList sort.stSort()
Structure stMonstre
sprite.w
; caractéristique
vie.w
vie_max.w
degat.w
armure.w
type.a ; 0 = normal, 1 = agressif, 10 = se retourne contre les autres mobs
; position
cible.point
x.w : y.w
; event
eventId.w
EndStructure
Global Dim monstre.stMonstre(50); je crée 50 monstres
Structure StDrop
id.w
pos.point
nb.a
EndStructure
Global NewList drop.StDrop()
;}
;{ procedures
Procedure.a Collision(Array monstre.stMonstre(1),i.a,List sort.stSort())
If SpriteCollision(monstre(i)\sprite,monstre(i)\x,monstre(i)\y,sort()\sprite,sort()\x,sort()\y)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CheckSort(List sort.stSort(), Array monstre.stMonstre(1))
ForEach sort()
Select sort()\type
Case 1; attaque
Select sort()\cible
Case 1 ;mobile - boule de feu
Case 2 ; fixe (cercle de feu, sort de groupe)
For i =0 To 50
If collision(monstre(),i, sort())
monstre(i)\vie - sort()\degat
; if monstre(i)\vie <=0 etc...
EndIf
Next i
EndSelect
Case 2 ; soin, ajout vie
Case 3 ; ajout mana
Case 4; invocation
Case 5 ; téléportation
EndSelect
Next
EndProcedure
Procedure.w rnd(i.w)
ProcedureReturn Random(i)-Random(i)
EndProcedure
Macro DropMob()
AddElement(drop())
drop()\id =1
drop()\nb = 1
drop()\pos\x = monstre(i)+rnd(50)
EndMacro
Procedure AddEvent(id)
; on créé l'évènement si besoin
EndProcedure
Procedure MobDead(Array monstre.stMonstre(1),i.a)
If monstre(i)\vie <=0
Select monstre(i)\type
Case 0,1,10 ; normal, agressif, retourné
DropMob()
monstre(i)\x = Random(1000)
monstre(i)\y = Random(1000)
monstre(i)\vie = monstre(i)\vie_max
monstre(i)\type = 0
Case 11 ; mob de quête
AddEvent(monstre(i)\eventId)
EndSelect
EndIf
EndProcedure
Macro SortType()
Select sort()\type
Case 1; attaque
monstre(i)\vie - sort()\degat
MobDead(monstre(),i)
Case 8; on retourne le monstre contre les autres monstres
monstre(i)\type = 10
EndSelect
EndMacro
Procedure CheckMob(List sort.stSort(),Array monstre.stMonstre(1))
For i=0 To 50
;{ deplacement
;}
;{ cible sur la mob (clic droit dessus par exemple)
;}
;{ Combat
If monstre(i)\vie <= 0
;{ le mob meurt
MobDead(monstre(),i)
;}
Else
;{ on attaque le mob
If monstre(i)\vie < monstre(i)\vie_max Or monstre(i)\type =1
; combat, attaque joueur, etc..
Select monstre(i)\type
Case 0 ; normal
Case 1 ; agressif
Case 10 ; attaque les autres mobs
EndSelect
EndIf
;}
;{ collision sort/mob
ForEach sort()
Select sort()\cible
Case 1 ; mobile - boule de feu
If collision(monstre(),i, sort())
SortType()
DeleteElement(sort(),1)
EndIf
Case 2 ; fixe (cercle de feu, sort de groupe)
If collision(monstre(),i, sort())
SortType()
EndIf
EndSelect
Next
EndIf;}
;}
Next i
EndProcedure
;}
InitSprite() : InitKeyboard() : InitSprite3D() :
OpenWindow(0, 0,0,1024,768, "", #PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
Repeat
ExamineKeyboard()
event =WaitWindowEvent(10)
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
End
j'ai donc le choix de 2 techniques :
- CheckSort(List sort.stSort(), Array monstre.stMonstre(1))
- CheckMob(List sort.stSort(),Array monstre.stMonstre(1)))
- Soit je vérifie chaque sort, puis la collision avec chaque mob
- soit je vérifie chaque mob puis la collision avec chaque sort., en sachant que ce serait compris dans une boucle qui s'occupe déjà de vérfier certains paramètre de mob.
n'hésitez pas si vous une idée de la meilleure technique à adopter pour ça
