a mettre dans le meme dossier que la ou se trouve la demo (compillé ou pas .. )
et testez ce code (que vous aurez préalablement sauvé dans le meme dossier que le petit fichier a récuperer
Code : Tout sélectionner
Declare Ondulation(x,Y,Texte.s,r,v,b)
; ***** variables a OLIV *********
; Variables
#HauteurSin = 25 ; Coef qui joue sur la hauteur de la sinusoide
#LargeurSin = 50 ; Coef qui joue sur la largeur de la sinusoide
#VitesseAngle = 1 * #PI / 50 ; vitesse de modification de l'angle de départ du texte
#Vitesse = 50 ; Temps du Delay() qui ralentit/augmente l'animation.
#font =1
#font2=2
Global angle.f, long_text_bas
; ****************************************
Global angle1,amplitude
Global amplitude1=2
Texte.s="PUREBASIC 4.10"
;************************** raster palette ****************************
Global Dim palette.l(500)
For i = 0 To 500
angle.f = angle + ((2 * #PI) / 500)
palette(i) = RGB (Abs (Cos (angle + (4*#PI/6))* 255),Abs (Cos (angle + #PI/3)* 255), Abs (Cos (angle)* 255))
Next
Vitesse.f = 8.2 ;donne scroling vert ou hori suivant
amplitude3.f =120 ; profondeur des dents
pas.f = 0.3 ; nombre de dent de scie
ss=2
; ******************************************************
Buffer$=Space(128)
MCISendString_("open 5.MID type sequencer alias mid",Buffer$,128,0)
MCISendString_("play mid",0,0,0)
InitSprite() ; Initialise les sprites
InitKeyboard() ; Initialise le clavier
LoadFont ( #font , "Arial" ,40)
LoadFont(#font2, "arial", 20 ,#PB_Font_Italic )
#sprite=1 ; on donne un numero au sprite
depx=4 ; deplacement horizontal
depy=4 ; deplacement vertical
etx=0
ety=0
If ExamineDesktops() ; Liste les bureaux
Width = DesktopWidth(0) ; Largeur actuelle
Height = DesktopHeight(0) ; Hauteur actuelle
Depth = DesktopDepth(0) ; Profondeur de couleurs actuelle
CentreX=Width/2
EcranY3=Width
Rien$ = "BERNARD 13" ; Titre de l'application à B13
If OpenScreen(Width, Height, Depth, "Intro") ; Ouvre l'écran
CreateSprite(#sprite,32,32) ; on cree un sprite de 32 par 32
StartDrawing(SpriteOutput(#sprite)) ; on va dessiner dedans !!
Circle(16,16,16,RGB(0,0,255)) ; un rond bleu
StopDrawing() ; voila notre sprite est pret !! :D
; on va pouvoir l'apeler par son nom !! (#sprite)
xsprite_pas=10 ; ceci va determiner le sens du sprite pour les X et sa vitesse de deplacement
ysprite_pas=10; ceci va determiner le sens du sprite pour les Y et sa vitesse de deplacement
CreateImage(100, Width, Height) ; on cree un image de la taille de l'ecran (on exagere un peu :D)
StartDrawing( ImageOutput(100)) ; on va dessiner dans une image reperé "100"
FrontColor(RGB($0,$FF,$FF)) ; couleur d'ecriture
BackColor(RGB(0, 0, 0)) ; couleur de fons
DrawingFont(FontID(#font2))
DrawingMode(1)
DrawText(0,0,Texte.s) ; on ecrit "PUREBASIC 4.10" dedans notre image
StopDrawing()
; ceci va lire l'image ligne par ligne et recreer autant d'image qu'il y a de ligne !!
For t=0 To 100
GrabImage(100, t, 0, t, 250,1) ; voila on prend un ligne et on en fait une image d'une ligne de large 1 pixel de haut
Next t ; on a un bon stock de ligne la :D 101 pour etre exact :)
Repeat ; Boucle
ExamineKeyboard() ; Scanne l'état du clavier
StartDrawing(ScreenOutput()) ; Démarre le dessin dans le buffer
; ************************ Raster arriere plan :D ***********************************
artichaut = artichaut+Cos( 36)/10
artison =artison+Sin( 36)
a = Sin ((x3 + artichaut)/(500 + Sin (x3/100)*100)) * 75 + 75
For Y3=1 To EcranY3-1
artichaut = Cos ((Y3 + artison)/(300 + Cos (Y3/100)*100)) * 75 + 75
coul = a + artichaut
If coul > 500
coul = coul-500
EndIf
coul = palette (coul)
i=Y3
amplitude3= amplitude3+ss
If amplitude3>120:ss=-ss:EndIf
If amplitude3<-120:ss=-0.001:ss=-ss:EndIf
x3=(CentreX)+ Sin((angle3 + i* pas*10 ) * 0.0174533) * amplitude3
LineXY(x3+Sin((angle3 + i* pas*3 ) * 0.0174533) * amplitude3 ,Y3,x+500+Sin((angle3 + i* pas*5 ) * 0.0174533) * amplitude3 ,Y3,coul)
Next Y3
angle3=angle3 + Vitesse
; ********************************************************************************
For y1= 0 To 100 ; on va ré afficher nos 101 lignes mais en les positionant par rapport a une sinuzoide :=
DrawingFont(FontID(#font2))
angle1=angle1+1 :If angle1=360*10: angle1=0 :EndIf
x1+(Sin(angle1*2*#PI/50)*amplitude1) ; le X varie en fonction de Sin()
DrawImage( ImageID(y1), x1+y1, y1,Width,1)
Next y1 ; voila voila !! :D
;--------------- simulateur d'antenne cassée --------------------
recep +20 ;pas de la figne de synchro
If recep>Height-4 ;il elle est en bas
recep =2 ;on la remet en haut
EndIf
LineXY(0,recep,Width,recep,RGB(110,110,110)) ;lignes synchro
LineXY(0,recep-1,Width,recep-1,RGB(90,90,90))
LineXY(0,recep+1,Width,recep+1,RGB(90,90,90))
LineXY(0,recep-2,Width,recep-2,RGB(70,70,70))
LineXY(0,recep+2,Width,recep+3,RGB(70,70,70))
hh=Height-200 ; determine la bande du 16/9 eme
vv=Width
For etoile =0 To 30000 ;nombre de fourmis
etx=Random(vv) ;position aleatoire des fourmis en coordonné x
ety=Random(hh)+100 ;position aleatoire des fourmis en coordonné y
cr=Random(255)+100
cv=Random(255)+100
cb=Random(255)+100
Plot (etx,ety,RGB(r,v,b)) ;plusieur "plot" pour donner du relief a la foumis
Plot (etx+1,ety,RGB(cr-20,cv-20,cb-20))
Plot (etx-1,ety,RGB(cr-20,cv-20,cb-20))
Plot (etx,ety+1,RGB(cr-20,cv-20,cb-20))
Plot (etx,ety-1,RGB(cr-20,cv-20,cb-20))
Plot (etx+1,ety+1,RGB(cr-100,cv-100,cb-100))
Plot (etx-1,ety-1,RGB(cr-100,cv-100,cb-100))
Plot (etx-1,ety+1,RGB(cr-100,cv-100,cb-100))
Plot (etx+1,ety-1,RGB(cr-100,cv-100,cb-100))
Next
LineXY(0,ety,Width,ety,RGB(150,150,150)) ;ligne horizontal parasite
LineXY(0,ety-1,Width,ety-1,RGB(120,120,120))
LineXY(0,ety+1,Width,ety+1,RGB(120,120,120))
;--------- fin du simulateur d antenne cassée ------------------
DrawText((Width/2 - TextWidth(Rien$)/2)+a, (Height/2 - TextHeight(Rien$)/2)+b, "BERNARD 13", $FFFFFF, $000000) ; Dessine
a+depx ;on deplace la position du texte sur l horizontal
b+depy ;on deplace la position du texte sur la vertical
If (Width/2 - TextWidth(Rien$)/2)+a>Width-TextWidth(Rien$) ;si le texte depasse la largeure de l' écran
depx=-depx ;on inverse le pas horizontal en négatif
EndIf
If (Width/2 - TextWidth(Rien$)/2)+a<0 ;si le texte depasse a gauche de l' écran
depx=-depx ;on inverse le pas horizontal en positif
EndIf
If (Height/2 - TextHeight(Rien$)/2)+b>Height-TextHeight(Rien$);si le texte depasse la hauteur de l' écran
depy=-depy ;on inverse le pas vertical en negatif
EndIf
If (Height/2 - TextHeight(Rien$)/2)+b<0 ;si le texte depasse en base de l' écran
depy=-depy ;on inverse le pas vertical en positif
EndIf
;------------- routine boulles en rotation ---------
rot.f+0.1
For colon= 0 To 8 ;nombre de ligne de boulles en rotation!! ou collone pitain je sais plus
For ligne =0 To 8 ;nombre de collone de boulles en rotation!! ou ligne repitain je sais pas
posx=(colon*50)-200 ; pfff ca me gonffle les comment...
posy=(ligne*50)-300
ix=Cos(rot) * posx - Sin(rot) * posy
iy=Sin(rot) * posx + Cos(rot) * posy
iz1=Sin(rot) * iy + Cos(rot) * 100
cix=1000*ix/(1000-iz1)
ciy=1000*(Cos(rot) * iy - Sin(rot) * 100)/(1000-iz1)
Circle(cix+100+Width/2,ciy+ 100+Height/2, 20 ,RGB(150,50,50))
Circle(cix+102+Width/2,ciy+ 98+Height/2, 16 ,RGB(170,70,70))
Circle(cix+104+Width/2,ciy+ 96+Height/2, 12 ,RGB(190,90,90))
Circle(cix+107+Width/2,ciy+ 92+Height/2, 4 ,RGB(250,250,250))
Next ligne
Next colon
;-------------- fin boulles en rotation --------
StopDrawing() ; C'est fini
; on va tester si le sprite va sortir de l'ecran
; et fabriquer un rebond par inversion de la coordonée au cas ou ...
x_sprite=x_sprite + xsprite_pas ; on lance l'animation de la coordonées X
y_sprite=y_sprite + ysprite_pas ; on lance l'animation de la coordonées Y
; on test les sorties d'ecran
If x_sprite>Width-32 Or x_sprite<0 ; si la coordonée X du sprite est superieur a la largeur de l'ecran (sortie a droite) ou plus petit que zero (sortie a gauche)
; le "-32" sert a ce que la detection de la sortie se fasse a droite du Sprite
xsprite_pas=-xsprite_pas ; on inverse le sens des x , ce qui aura pour consequence de faire aller le Sprite dans l'autre sens des X
EndIf
If y_sprite>Height-32 Or y_sprite<0 ; si la coordonée Y du sprite est superieur a la lhauteur de l'ecran (sortie en bas) ou plus petit que zero (sortie en haut)
; le "-32" sert a ce que la detection de la sortie se fasse au dessous du Sprite
ysprite_pas=-ysprite_pas ; on inverse le sens des Y , ce qui aura pour consequence de faire aller le Sprite dans l'autre sens des Y
EndIf
DisplayTransparentSprite(#sprite,x_sprite,y_sprite) ; on affiche le Sprite aux coordonées
son=Random(1000)+500
text.s="petite demo pour Bernard 13"
xt=xt+2 :If xt>Width:xt=-500:EndIf ; le text arrive a droite ? on le remet a gauche !!
yt=Height-125 ; emplacement verticale de la sinuzoide
Ondulation(xt,yt,text.s,cr,cv,cb) ; appel de la procedure a OLIV on donne les coordonées que l'on veux, le text, et la couleur
;Moi RV et mon pixel blanc
StartDrawing(ScreenOutput()) ;je demande a dessiner sur l'écran
Plot(o,o,RGB(255,255,255)) ; un point aux coordonnées 0,0 (coin en haut a gauche) de couleur rgb(255,255,255) blanc donc
StopDrawing() ;la je veux pu dessiner sur l'écran
FlipBuffers() ; Inverse les buffers
ClearScreen(0) ; Efface l'écran
Until KeyboardPushed(#PB_Key_Escape) ; On s'en va!!!
MCISendString_("CLOSE MIDI",0,0,0)
EndIf
EndIf
End ; Adios!
Procedure Ondulation(x,Y,Texte.s,r,v,b)
; procedure realisé par OLIV
StartDrawing ( ScreenOutput ()) ; Pour pouvoir utiliser les commandes des dessin 2D.
DrawingFont ( FontID ( #font )) ; On change la police
DrawingMode (1) ; On selectionne le mode pour ne pas avoir de fond derrière les lettres.
FrontColor ( RGB (r,v,b) ) ; On change la couleur.
angle + #VitesseAngle ; Angle de départ de la sinusoide en radian
If angle >= 2 * #PI
angle = 0
EndIf
; On affiche toute les lettres
posx = 10 ; Position du caractère
For n = 1 To Len (Texte) ; Pour chaque lettre du texte
Lettre.s = Mid (Texte, n, 1) ; on récupère la lettre à la position n
posy = 50 + #HauteurSin * Sin (angle + posx / #LargeurSin ) ; on calcul la position en Y de la lettre
; On part du centre de l'image (50) puis on ajoute un sin
; #HauteurSin fait varier l'amplitude du mouvement
; l'angle mis dans le sinus est d'abord composé de l'angle de départ d'affichage du texte (Angle)
; puis on augmente l'angle au fur et à mesure que l'on affiche des lettres avec le coefficient #LargeurSin qui permet de faire varier la largeur de la sinusoide
DrawText (x+posx, Y+posy,Lettre)
posx + TextWidth (Lettre)
Next
StopDrawing () ; On signife que l'on arrête les fonctions dessin 2D.
EndProcedure