Many thanks for your help. I'll use this code into my game editor. So the editor user could describe/add some paths to the ennemies ships.
Concept code :
Concept code :
Strict Const CTE_VITESSE = 1 Const CTE_DEPLACER = 2 Const CTE_TOURNER = 3 Const CTE_PAUSE = 4 Const CTE_VITESSE_ROTATION = 5 Const CTE_ARRETER = 6 ' -------------------------------------------------------------------------------------------------- Type Tpile Field Code_action Field Parametre Function Ajouter:TPile (Code_action, Parametre) Local p:TPile = New Tpile p.Code_action = Code_action p.Parametre = Parametre Return p End Function End Type ' -------------------------------------------------------------------------------------------------- Type TVecteur Field Liste_action : TList = CreateList() Field Link_liste_action:TLink = Liste_action.FirstLink() Field bAction_terminee Field bEnPause Field PosX : Float Field PosY : Float Field Angle : Float Field Vitesse : Float Field angle_cible : Float Field Vitesse_rotation : Float Field Deplacement_index Field Deplacement_max Field Deplacement_sens Field TempsPause : Int Field Temps : Int Field x_dep# Field y_dep# Field Code_action '----------------------------------------------------------------------------------------------- Function Creer : Tvecteur (PosX#, PosY#) Local v:TVecteur = New TVecteur v.PosX# = PosX# v.PosY# = PosY# v.Angle = 0 v.Vitesse# = 0.0 v.Vitesse_rotation# = 0.0 v.Deplacement_index = 0 v.Deplacement_max = 0 v.bAction_terminee = True v.bEnPause = False Return v End Function '----------------------------------------------------------------------------------------------- Method Ajouter_action (Code_action, pParametre) Local a:TPile a = TPile.Ajouter (Code_action, pParametre) Link_liste_action = Liste_action.FirstLink() ListAddLast Liste_action, a End Method '----------------------------------------------------------------------------------------------- Method Donner_prochaine_action:TPile() Local a:TPile If TPile(Link_liste_action.value()) <> Null Then a.Code_action = TPile(Link_liste_action.value() ).code_action a.Parametre = TPile(Link_liste_action.value() ).parametre Else Return Null End If If Link_liste_action.NextLink() <> Null Then Link_liste_action = Link_liste_action.NextLink() Else Return Null End If Return a End Method '----------------------------------------------------------------------------------------------- Method Gerer_actions() Local a:TPile If bAction_terminee = True Then a = Donner_prochaine_action() If a.Code_action<>Null Then Select a.Code_action Case CTE_VITESSE FixerVitesse (a.Parametre) bAction_terminee = False Code_action = a.Code_action Case CTE_DEPLACER Deplacer (a.Parametre) bAction_terminee = False Code_action = a.Code_action Case CTE_TOURNER Tourner (a.Parametre) bAction_terminee = False Code_action = a.Code_action Case CTE_PAUSE Pause (a.Parametre) bAction_Terminee = False Code_action = a.Code_action Case CTE_VITESSE_ROTATION FixerVitesse_rotation (a.Parametre) bAction_Terminee = False Code_action = a.Code_action Case CTE_ARRETER Arreter() bAction_terminee = False Code_action = a.Code_action End Select End If End If End Method '----------------------------------------------------------------------------------------------- Method Deplacer (pNombre_de_points) If pNombre_de_points > 0 Then Deplacement_Sens = 1 End If If pNombre_de_points < 0 Then Deplacement_Sens = - 1 End If Deplacement_Max = Abs (pNombre_de_points) End Method '----------------------------------------------------------------------------------------------- Method FixerVitesse_rotation (pVitesse#) Vitesse_rotation# = pVitesse# End Method '----------------------------------------------------------------------------------------------- Method FixerVitesse (pVitesse#) Vitesse# = pVitesse# End Method '----------------------------------------------------------------------------------------------- Method Tourner (pAngle) Angle_Cible = pAngle End Method '----------------------------------------------------------------------------------------------- Method Pause (pTempsPause) TempsPause = pTempsPause End Method '----------------------------------------------------------------------------------------------- Method Arreter () End Method '----------------------------------------------------------------------------------------------- Method Calculer() Select Code_action Case CTE_VITESSE bAction_terminee = True Case CTE_DEPLACER If deplacement_index >= deplacement_max Then deplacement_index = 0 x_dep# = 0 y_dep# = 0 bAction_terminee = True Else deplacement_index = deplacement_index + 1 x_dep# = Cos (Angle) * Vitesse# y_dep# = Sin (Angle) * Vitesse# End If Select deplacement_sens Case 1 posx# = posx# + x_dep# posy# = posy# + y_dep# Case -1 posx# = posx# - x_dep# posy# = posy# - y_dep# End Select Case CTE_PAUSE If bEnPause = False And bAction_terminee = False Then Temps = MilliSecs() bEnPause = True End If If Temps + TempsPause < MilliSecs() Then bEnPause = False bAction_terminee = True Temps = 0 TempsPause = 0 End If Case CTE_TOURNER ' deviation progressive Local TE# = RotaryDir( angle# , angle_cible#) If TE# < 0 Then angle# :- Vitesse_rotation# If TE# > 0 Then angle# :+ Vitesse_rotation# ' While angle# > 360 angle#:-360 Wend While angle# <= 0 angle#:+360 Wend angle = Int (angle) x_dep# = Cos (Angle#) * Vitesse# y_dep# = Sin (Angle#) * Vitesse# Select deplacement_sens Case 1 posx# = posx# + x_dep# posy# = posy# + y_dep# Case -1 posx# = posx# - x_dep# posy# = posy# - y_dep# End Select If Angle# = Angle_cible# Then bAction_terminee = True Case CTE_VITESSE_ROTATION bAction_terminee = True Case CTE_ARRETER x_dep# = 0 y_dep# = 0 bAction_terminee = True End Select End Method '----------------------------------------------------------------------------------------------- Method Afficher() DrawOval posx#-3.0, posy#-3.0,6,6 End Method ' Fonction split Noel Cower's dans le code archive du site officiel '----------------------------------------------------------------------------------------------- Function SplitString$[]( s$, sp$ ) Local p:Int, l:Int, o$[32], x% Local n:Int For n = 0 Until s.length Local lx% = x For p = 0 Until sp.length If s[n] = sp[p] Then If x = o.length Then o = o[..o.length*2] o[x] = s[l..n+(n = s.Length-1 And (Not (s[n]=sp[p])))].Trim( ) l = n+1 If o[x].length=0 Then Exit x :+ 1 Exit EndIf Next If x <> lx Then Continue If n = s.length-1 Then If x = o.length Then o = o[..o.length*2] o[x] = s[l..n+(n = s.length-1 And (Not (s[n]=sp[p])))].Trim( ) If o[x].length = 0 Then Exit x :+ 1 EndIf Next If x = 0 Then Return Null Return o[0..x] End Function ' Parser codé par SebHoll (http://www.blitzbasic.com/Community/posts.php?topic=72190) '----------------------------------------------------------------------------------------------- Method ProcessInstructionsFromString( pString$ ) 'Let's remove all spaces from the string, and then split up the instructions Local strInstructions$[] = SplitString(pString.Replace(" ",""),",") 'Now, we can process each instruction one at a time For Local tmpInstruction$ = EachIn strInstructions 'For each instruction, we want to split it to retrieve the function (index: 0) and the value (index: 1) Local tmpParts$[] = SplitString(tmpInstruction,"=") 'Let's make sure that there was an equals in the instruction, and that there was a value (index: 1) If tmpParts.length <> 2 Or Not tmpParts[1].length Then Print "Error: Cannot parse instruction: ~q" + tmpInstruction + "~q" Continue EndIf 'Next, let's find out what function we should be using Select tmpParts[0].ToLower$() 'Pass the value (index: 1) to the function we want by casting it as a float Case "ro";Ajouter_action(CTE_VITESSE_ROTATION, Float(tmpParts[1])) Case "v";Ajouter_action(CTE_VITESSE, Float(tmpParts[1])) Case "a";Ajouter_action(CTE_DEPLACER, Float(tmpParts[1])) Case "r";Ajouter_action(CTE_DEPLACER, - Float(tmpParts[1])) Case "t";AJouter_action(CTE_TOURNER, Float(tmpParts[1])) Case "p";Ajouter_action(CTE_PAUSE, Int(tmpParts[1])) Case "s";Ajouter_action(CTE_ARRETER, Float(tmpParts[1])) 'Otherwise, let us know that the function specified is not understood Default;Print "Error: I do not understand the instruction ~q" + tmpParts[0] + "~q" EndSelect Next End Method ' Function trouvée sur le forum officiel ' (http://www.blitzbasic.com/Community/posts.php?topic=57317#637149) '----------------------------------------------------------------------------------------------- Function RotaryDir#(SourceDir#,DestDir#) Local Diff1#,Diff2#,Dir# If SourceDir# > DestDir# Diff1#=SourceDir-DestDir diff2#=(360.0-SourceDir)+DestDir If diff2<diff1 dir#=diff2 Else dir#=diff1/-1 EndIf Else If SourceDir#<DestDir# diff1=DestDir-SourceDir diff2=(360.0-DestDir)+SourceDir If diff2<diff1 dir#=diff2/-1 Else dir#=diff1 EndIf Else dir=0 EndIf EndIf Return dir End Function End Type ' -------------------------------------------------------------------------------------------------- ' Programme principal ' -------------------------------------------------------------------------------------------------- ' v : set speed, param# = speed ' ro : set rotation, ro# = rotation factor ' a : advance, param = pixels ' r : rear, param = pixels ' t : turn, param = angle ' p : pause, param = millisecs ' s=0 put this at the end. Local v1:TVecteur = TVecteur.Creer (100,100) v1.ProcessInstructionsFromString( "v=2.0,ro=6.0,a=100,t=120,a=200,p=2000,t=180,r=200,t=30,r=200,s=0" ) Local v2:TVecteur = TVecteur.Creer (400,400) v2.ProcessInstructionsFromString( "v=1.0,ro=2.0,a=100,t=020,a=300,t=80,a=100,p=3000,t=130,r=100,s=0" ) Graphics 1024,768 SetBlend alphablend While Not KeyDown (KEY_ESCAPE) 'Cls v1.Gerer_actions() v2.Gerer_actions() v1.Calculer() v2.Calculer() SetColor 255,0,0 v1.Afficher() SetColor 0,255,0 v2.Afficher() Flip Wend