Ecrasage
Publié : dim. 14/oct./2007 11:28
Voici un petit truc que j'avais fait il y a quelques temps avec un autre basic sur une autre machine dans une autre vie..
Zorg
[EDIT] J'ai supprimé un sprite qui ne sert à rien..
Zorg
[EDIT] J'ai supprimé un sprite qui ne sert à rien..
Code : Tout sélectionner
;*******************************
; ;
; Ecrasage ;
; Ecrit en PureBasic 4.02 ;
; ;
; par Zorg, le 14/10/2007 ;
; ;
;*******************************
;Initialisation
If InitSprite()=0 Or InitKeyboard()=0
MessageRequester("Erreur","Problème avec DirectX",0)
End
EndIf
;Paramètres à régler
resolution_x.w=1024
resolution_y.w=768
rayon.w=150
ecrasage.w=70
; Le nombre de points ci-dessous doit être un diviseur entier de 512
nb_points.w=16 ; Ne pas oublier de rajouter les LineXY dans la boucle principale pour relier les points definis
;Ouvre un nouvel écran
OpenScreen(resolution_x,resolution_y,32,"Ecrasage")
Structure coordonnees
x.w
y.w
EndStructure
Dim points.coordonnees(nb_points)
centre_x.w=resolution_x/2
centre_y.w=resolution_y/2
min_x.w=rayon-ecrasage
max_x.w=resolution_x-rayon+ecrasage
min_y.w=rayon-ecrasage
max_y.w=resolution_y-rayon+ecrasage
angle_x.w=0
vitesse_angle_x.w=2
vitesse_x.w=5
angle_rot.w=0
vitesse_rot.w=2
decalage_y.w=0
;Précalcul des coordonnées des sommets (512 points possibles sur le cercle)
Dim calc_points.coordonnees(512)
For compteur=0 To 511
calc_points(compteur)\x=rayon*Cos(compteur*2*#PI/512)
calc_points(compteur)\y=rayon*Sin(compteur*2*#PI/512)
Next compteur
Repeat
;Rotation
angle_x=(angle_x+vitesse_angle_x) & 511
; Deplacement latéral et limites
centre_x=centre_x+vitesse_x
If (centre_x>max_x)
centre_x=max_x
vitesse_x=-vitesse_x
vitesse_angle_x=-vitesse_angle_x
EndIf
If (centre_x<min_x)
centre_x=min_x
vitesse_x=-vitesse_x
vitesse_angle_x=-vitesse_angle_x
EndIf
;Deplacement vertical (rebond)
angle_rot=(angle_rot+vitesse_rot) & 255
decalage_y=calc_points(angle_rot)\y*3
centre_y=max_y-decalage_y
;Positiondes sommets
For compteur=0 To nb_points-1
index=(compteur*(512/nb_points)+angle_x) & 511
points(compteur)\x=calc_points(index)\x+centre_x
points(compteur)\y=calc_points(index)\y+centre_y
If points(compteur)\x>resolution_x-1
points(compteur)\x=resolution_x-1
EndIf
If points(compteur)\x<0
points(compteur)\x=0
EndIf
If points(compteur)\y>resolution_y-1
points(compteur)\y=resolution_y-1
EndIf
Next compteur
;Effacement de l'écran
ClearScreen(0)
;Dessin
StartDrawing(ScreenOutput())
LineXY(points(0)\x,points(0)\y,points(1)\x,points(1)\y,$ffffff)
LineXY(points(1)\x,points(1)\y,points(2)\x,points(2)\y,$ff00ff)
LineXY(points(2)\x,points(2)\y,points(3)\x,points(3)\y,$ffffff)
LineXY(points(3)\x,points(3)\y,points(4)\x,points(4)\y,$ff00ff)
LineXY(points(4)\x,points(4)\y,points(5)\x,points(5)\y,$ffffff)
LineXY(points(5)\x,points(5)\y,points(6)\x,points(6)\y,$ff00ff)
LineXY(points(6)\x,points(6)\y,points(7)\x,points(7)\y,$ffffff)
LineXY(points(7)\x,points(7)\y,points(8)\x,points(8)\y,$ff00ff)
LineXY(points(8)\x,points(8)\y,points(9)\x,points(9)\y,$ffffff)
LineXY(points(9)\x,points(9)\y,points(10)\x,points(10)\y,$ff00ff)
LineXY(points(10)\x,points(10)\y,points(11)\x,points(11)\y,$ffffff)
LineXY(points(11)\x,points(11)\y,points(12)\x,points(12)\y,$ff00ff)
LineXY(points(12)\x,points(12)\y,points(13)\x,points(13)\y,$ffffff)
LineXY(points(13)\x,points(13)\y,points(14)\x,points(14)\y,$ff00ff)
LineXY(points(14)\x,points(14)\y,points(15)\x,points(15)\y,$ffffff)
LineXY(points(15)\x,points(15)\y,points(0)\x,points(0)\y,$ff00ff)
StopDrawing()
;Echange des ecrans
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_All)
;Libération de la mémoire
Dim calc_points.coordonnees(0)
Dim points.coordonnees(0)
End