Rotation de brosse et déplacement selon un angle

Discussion forum for the French Hollywood community
Post Reply
ArtBlink
Posts: 437
Joined: Mon Nov 01, 2010 10:37 am
Location: Albert - France
Contact:

Rotation de brosse et déplacement selon un angle

Post by ArtBlink » Sun Mar 13, 2011 10: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

User avatar
Tarzin
Posts: 68
Joined: Mon Feb 15, 2010 11:46 am
Location: Dunkerque / FRANCE
Contact:

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

Post by Tarzin » Tue Mar 15, 2011 7: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

ArtBlink
Posts: 437
Joined: Mon Nov 01, 2010 10:37 am
Location: Albert - France
Contact:

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

Post by ArtBlink » Tue Mar 15, 2011 9: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

Post Reply