Rotation de brosse et déplacement selon un angle

Discussion forum for the French Hollywood community

Rotation de brosse et déplacement selon un angle

Postby ArtBlink » Sun Mar 13, 2011 11:11 am

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
ArtBlink
 
Posts: 427
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France

Re: Rotation de brosse et déplacement selon un angle

Postby Tarzin » Tue Mar 15, 2011 8:27 pm

Merci Artblink!
Ca me rappelle un peu Supercars tout ça! ;)
A500 / A600 / A1200 / SAM440
WinUAE OS3.9 (AmiKit) / OS4.1FE (FlowerPot)
---
https://twitter.com/TarzinCDK
User avatar
Tarzin
 
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE

Re: Rotation de brosse et déplacement selon un angle

Postby ArtBlink » Tue Mar 15, 2011 10:33 pm

Oui, c'est exactement sa, mais se code comme tu le vois, est en faite très simple, et encore, j'ai pas poster le scroll multidirectionnel, ou la, tu va te dire, mais c'est aussi simple que sa??!!! et oui, on cherche parfois compliqué alors que sa peut être si simple.

Se moteur que tu vois, tu peux l'utiliser pour un jeux genre asteroids, mais d'ici peux, je vais poster le code pour faire déplacer l'objet en fonction du clic de souris, genre par exemple le jeux cannon fodder, mais aussi genre bubble shooter on l'on choisi un angle pour projeter une brush ou un sprite vers une direction en fonction de l'angle de rotation de ton lanceur, le truc qu'il faut retenir et qui est important, pour la 2D (voir aussi pour la 3D) il faut impérativement utilisé des angles en Radians et non en degré, c'est beaucoup plus facile à exploiter, par contre, ne demande jamais à holly de convertir la donnée degré en radian, trop long, fais la simple multiplication que j'ai noté dans le programme
ArtBlink
 
Posts: 427
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France


Return to French forum

Who is online

Users browsing this forum: No registered users and 2 guests