Code: Select all
@SCREEN {Mode="Ask",Width=640, Height=480, depth=16}
; *******************************************
; * *
; * Tutoriel : Brosse avec rotation *
; * Déplacement de la brosse selon un angle *
; * *
; * Code : Artblink *
; * *
; *******************************************
; Création de la brosse, un carré noir de 32x32 pixel
CreateBrush (1,32,32,$000000)
; Sélection de la brosse créé
SelectBrush(1)
; Définir le mode de remplissage des formes primitives
; Ici remplir avec la couleur de traçage
SetFillStyle(#FILLCOLOR)
; Traçage d'un triangle rouge
Polygon (0,0,{32,16,0,32,0,0},3,$FF0000)
; Fin sélection de la Brosse
EndSelect
; Définir la couleur de fond de la brosse 1 comme transparente
; Si nous ne faisons pas sa, on verra un triangle rouge dans
; un carré noir
SetBrushTransparency(1, $000000)
; Définition de la Position initial du triangle en pixel
X=320
Y=240
; Définition de la valeur de l'angle initiale
Angle=0
; Définition de la vitesse de déplacement
; vitesse=0, l'objet est statique
vitesse=0
; Définition de la fonction
Function Deplacement()
; Mettons un chrono pour calculer le nombre
; d'image par seconde
; Top chrono
StartTimer(1)
; Basculement d'écran, techinque du double buffer
Flip
; Clear screen ou effacement de l'écran
Cls
; Définition des variable local
; Si on appui sur la touche correspondante, la
; valeur de la variable sera égal à True sinon,
; la valeur de la variable sera égal à False.
Local Avance = IsKeyDown("UP")
Local Recule = IsKeyDown("Down")
Local Droite = IsKeyDown("RIGHT")
Local Gauche = IsKeyDown("LEFT")
; Si on appui sur la Flêche "Vers le haut"
If Avance = True
; On augmente donc la vitesse de l'objet
Vitesse=vitesse+0.5
; On bloc l'augmentation de la vitesse sinon
; l'objet se déplace trop vite
If vitesse>6 Then vitesse=6
Else
; Décélération de l'objet lorsque l'on relache
; la touche "vers le haut"
If vitesse>0 Then vitesse=vitesse-0.3
EndIf
; Bloc IF identique que le précédent mais c'est une marche
; arrière
If Recule = True
Vitesse=vitesse-1
If vitesse<-3 Then vitesse=-3
Else
If vitesse<0 Then vitesse=vitesse+0.2
EndIf
; Si on appuie sur la touche flêche "Doite"
; on modifie l'angle de rotation de la brosse
If Droite = True Then Angle=Angle-2
; idem que la droite, mais la c'est pour la gauche
If Gauche = True Then Angle=Angle+2
; au cas ou, prévoir un bug de calcule, il arrive
; parfois qu'en jouant très vite avec le clavier
; que l'objet se déplace seul, se test
; élimine cette erreur
If vitesse>0 And vitesse<0.1 Then vitesse=0
; Pour un calcule plus simple, il faut transformer
; votre angle noter à la base en degré, en radian
; la multiplication par 0.01745 est bien plus
; rapide que la commande Rad()
Radians=Angle*0.01745
; Ici, on additionne donc l'ancienne valeur de X
; avec le cosinus (abcisse) multiplier par la vitesse
X=X+Cos(Radians)*vitesse
; Ici, on additionne donc l'ancienne valeur de Y
; avec le sinus (ordonnée) multiplier par la vitesse
Y=Y-Sin(Radians)*vitesse
;Blocage de l'objet au limite de l'écran 640x480 pixel
If x>640 Then X=640
If X<0 Then X=0
If Y<0 Then Y=0
If Y>480 Then Y=480
; On affiche la Brosse, ATTENTION:
; Il faut impérativement redéfinir la position de la rotation
; en fait c'est la prise en mais de l'objet ou le pixel Chaud
; pour une belle rotation, il vaut mieux prendre le contrôle
; de l'objet en son centre.
; AnchorX et AnchorY sont la pour sa, valeur entre 0 et 1, utilisé
; la moitié soit 0.5 pour prendre le contrôle de la Brosse à
; partir de son centre
DisplayBrush(1,X,Y,{AnchorX = 0.5, AnchorY = 0.5,rotate=Angle})
; Affichage de la vitesse de déplacement de l'objet
TextOut(0,0,"vitesse : ")
TextOut(80,0,Round(Abs(vitesse*10)))
TextOut(110,0,"Km/h")
; On récupère le temps du chrono (en milliseconde) démarrer
; au départ du code
Local Temps=GetTimer(1)
; Affichage du nombre d'image par seconde
TextOut (350,1,"Nombre d'image par seconde",#BLUE)
;
TextOut (586,1,Round((1/Temps)*1000))
; Fin de la fonction
EndFunction
; Définition de l'interval de temp, ici 20 c'est 50 image par seconde
SetInterval (1,Deplacement,20)
; on démarre la technique d'animation pour le double buffer
BeginDoubleBuffer
Repeat
WaitEvent
Forever