Code : Tout sélectionner
;F1 Grand Prix V.3 (5.41 LTS x86 Micoute)
EnableExplicit
Enumeration
#Voiture
#Voiture3D_IA
EndEnumeration
Enumeration Images
#Circuit
EndEnumeration
#LargeurEcr = 800
#HauteurEcr = 600
UsePNGImageDecoder()
InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(#LargeurEcr, #HauteurEcr, 32, "")
;-Structures
Structure Vecteur2
x.f
y.f
EndStructure
Structure Entite
Position.Vecteur2
x.f
y.f
Angle.f
EndStructure
;-Declarations des fonctions
Declare.f curveangle(newangle.f,oldangle.f,increments.f)
Declare.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f)
Declare track_SmoothPoint(*A.Entite,*B.Entite, turnspeed.f=1.0)
Declare .f DistanceEntre2Points(ax.f, ay.f, bx.f, by.f)
#turnspeed = 4
; ************************************************************************************
Global checkpoint = 1
Global Quit
Global NbCheck
Global Fichier$
Global NumFichier = 1
If NumFichier = 1
Restore Melbourne
ElseIf NumFichier = 2
Restore Catalogne
ElseIf NumFichier = 3
Restore Adelaide
EndIf
Read.i NbCheck
; Tableau pour stocker les différents checkpoint à atteindre
Global Dim Target.Entite(NbCheck), i
For i = 1 To NbCheck
Read.i Target(i)\x
Read.i Target(i)\y
Next i
; Voiture.
; Ses coordonnées pour la position de départ
Global Voiture.Entite
Voiture\x = Target(1)\x
Voiture\y = Target(1)\y
Voiture\Angle = 0
; Super voiture de sport rouge dont on ne citera pas la marque.
CreateSprite(#Voiture3D_IA, 16, 16)
StartDrawing(SpriteOutput(#Voiture3D_IA))
Box(3, 0, 16, 10, RGB(255, 0, 0))
Box(12, 4, 4, 2, RGB(255, 255, 255))
StopDrawing()
If NumFichier = 1
Fichier$ = "D:\Programmation\Prg Perso\P\PROJETS\F1 Grand Prix\Circuit Albert Park Melbourne Australie.png"
ElseIf NumFichier = 2
Fichier$ = "D:\Programmation\Prg Perso\P\PROJETS\F1 Grand Prix\Circuit Catalogne Espagne.png"
ElseIf NumFichier = 3
Fichier$ = "D:\Programmation\Prg Perso\P\PROJETS\F1 Grand Prix\Circuit Adelaide Australie.png"
EndIf
LoadImage(#Circuit, Fichier$,0)
; Ci-dessous on utilise le programme dans le mode fenêtré.
checkpoint = 1
Repeat
ExamineKeyboard()
ExamineMouse()
Define Mx = MouseX()
Define My = MouseY()
StartDrawing(ScreenOutput())
DrawImage(ImageID(#Circuit), 0, 0, #LargeurEcr, #HauteurEcr)
DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
; Affichage de tous les points du circuit à atteindre.
;For i = 1 To NbCheck
; Circle(Target(i)\x, Target(i)\y, 2, RGB(0, 255, 255))
;Next i
;En route les petits bolides !!!
Select checkpoint
Case 1 To NbCheck
If DistanceEntre2Points(Voiture\x, Voiture\y, Target(checkpoint)\x, Target(checkpoint)\y) > 5
track_SmoothPoint(@Voiture, @Target(checkpoint), #turnspeed)
;Afficher le prochain checkpoint
;Circle(Target(checkpoint)\x, Target(checkpoint)\y, 2, RGB(255, 255, 255))
Else
checkpoint + 1
EndIf
Default
checkpoint = 1
EndSelect
;DrawText(Voiture\x - 70, Voiture\y + 10, "{"+ Str(Target(checkpoint)\x) +" | "+ Str(Int(Voiture\x)) +", "+ Str(Target(checkpoint)\y) +" | "+ Str(Int(Voiture\y)) +"}" )
StopDrawing()
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ La voiture se dirige vers le chemin du checkpoint à la vitesse 1.5
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Voiture\x + 1.5 *Cos(Voiture\Angle*#PI/180)
Voiture\y + 1.5 *Sin(Voiture\Angle*#PI/180)
DisplayTransparentSprite(#Voiture3D_IA, Voiture\x - 8, Voiture\y - 8)
RotateSprite(#Voiture3D_IA, Voiture\Angle, 0)
If KeyboardPushed(#PB_Key_Escape)<>#Null : Quit=1 : EndIf
FlipBuffers()
Until Quit=1
End
Procedure.f curveangle(newangle.f,oldangle.f,increments.f)
If increments > 1
If (oldangle + 360) - newangle < newangle - oldangle
oldangle = 360 + oldangle
EndIf
If (newangle + 360) - oldangle < oldangle - newangle
newangle = 360 + newangle
EndIf
oldangle = oldangle - (oldangle - newangle) / increments
EndIf
If increments <= 1
ProcedureReturn newangle
EndIf
ProcedureReturn oldangle
EndProcedure
Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGRES
Protected A.f, b.f, c.f, Angle.f
A.f = x1-x2
b.f = y1-y2
c.f = -Sqr(A*A+b*b)
Angle.f = ACos(A / c) * 180 / #PI
If y1 < y2 : Angle = 360 - Angle : EndIf
ProcedureReturn Abs(Angle - 360)
EndProcedure
Procedure track_SmoothPoint(*A.Entite,*B.Entite, turnspeed.f=1.0)
Protected AngDif.f, temp_yaw.f
AngDif = ReturnDegAngle(*A\x,*A\y,*B\x,*B\y)
temp_yaw.f = curveangle(AngDif, *A\Angle, turnspeed)
*A\Angle = temp_yaw
EndProcedure
Procedure.f DistanceEntre2Points(ax.f, ay.f, bx.f, by.f)
ProcedureReturn Sqr(Pow((bx - ax), 2) + Pow((by - ay), 2))
EndProcedure
DataSection
Melbourne:
Data.i 35
Data.i 480, 461, 339, 458, 318, 424, 296, 420, 225, 420, 185, 417, 113, 398, 100, 389, 124, 349, 072, 296,
083, 223, 098, 189, 107, 167, 110, 145, 142, 144, 200, 105, 236, 117, 320, 177, 313, 205, 348, 262,
393, 302, 427, 312, 506, 310, 547, 276, 657, 268, 764, 323, 767, 343, 741, 407, 729, 418, 716, 418,
716, 419, 652, 403, 641, 411, 644, 439, 634, 458
Catalogne:
Data.i 29
Data.i 385, 475, 125, 476, 109, 451, 102, 376, 88, 349, 62, 338, 26, 301, 29, 210, 51, 157, 250, 146,
277, 175, 269, 243, 137, 253, 133, 273, 218, 370, 294, 374, 311, 356, 317, 295, 396, 140, 649, 374,
680, 354, 681, 283, 601, 207, 594, 165, 628, 147, 740, 187, 749, 424, 732, 461, 688, 474
Adelaide:
Data.i 26
Data.i 671, 217, 135, 578, 101, 585, 68, 574, 12, 480, 15, 450, 37, 422, 58, 417, 147, 415, 214, 418,
266, 405, 393, 321, 424, 317, 464, 317, 542, 267, 549, 251, 547, 237, 527, 198, 525, 166, 533, 139,
553, 111, 697, 15, 729, 13, 767, 35, 787, 80, 777, 141