Page 4 sur 7

Publié : sam. 06/oct./2007 22:37
par Buckethead
Dobro a écrit :
Buckethead a écrit :Nice :D
j'ai ré-édité mon message en montrant avec l'utilisation d'un sprite !! :D

les Sprites offres l'avantage de pouvoir être mis ou l'on veux, et être Transparent ect ....


lorsqu'on veut faire un effet ou un Jeu, il ne faut pas Résonner Screen()
avec le Pure, mais Sprite() , chaque Sprite est un Ecran Potentiel , qui peut etre Mis en dehors du Screen() ou être affiché dans le Screen

les Sprites peuvent être Superposé , Mixé , Retourné, ect...
se sont autant de petit écrans possible !:D
oups je disais nice pour la demo ;)

Oui, biensur les sprites sont mieux, je voulais une fonction "drawscroll" pour quelquechose de précis. A vrai dire ce n'était pas pour seulement "scroller" l'écran mais bien dupliquer du bitmap sans devoir copier quelquechose au préalable.

Publié : sam. 06/oct./2007 22:42
par Backup
Buckethead a écrit :(néanmoins si c'est plus lent que le sprite ... :D)
je pense que oui !! :D
les Sprites sont quand meme tres tres tres rapides !! :D

Publié : sam. 06/oct./2007 22:43
par tonton
RV a écrit :
tonton a écrit : alore bernard13!!!!!!!! on t' attend!!!!!!!. :?
:lol: :lol: :lol:

oui! bon , je suis naïf parfois :?
j éspèrais au moins un pixel blanc en plus,
ou meme un ";" ajouté dans le code :lol: .
bon! je vais me pieuter, je vais rever , dans les reves , tout est realisable....

Publié : sam. 06/oct./2007 22:47
par Buckethead
Merci Dobro ;)
... c'est assez Déroutant faut dire
Je crois que c'est surtout ça ;p je vais poursuivre avec les sprites 3D

Publié : sam. 06/oct./2007 22:52
par RV
tonton a écrit : j éspèrais au moins un pixel blanc en plus,
ou meme un ";" ajouté dans le code :lol: .

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" 


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 
  
  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, Width,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 
      
      
      For y1= 0 To 100 ; on va ré afficher nos 101 lignes mais en les positionant par rapport a une sinuzoide := 
        DrawingFont(FontID(#font2)) 
        DrawingMode(1) 
        FrontColor(RGB($95,$25,$BA)) 
        BackColor(RGB(0, 0, 0)) 
        DrawText(40,0,Texte.s) 
        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+25,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 
      
      For etoile =0 To 30000             ;nombre de fourmis 
        etx=Random(Width-3)+1                   ;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 
      
      DisplaySprite(#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!!! 
  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 

Moi j'ai fait le pixel blanc!!! :wink:

Publié : sam. 06/oct./2007 23:28
par Backup
vu que l'on a bien fumé la moquette :lol:

j'ajoute la fumée ...... heu .......... violette :lol:

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
; ******************************************************



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-100
      For etoile =0 To 30000             ;nombre de fourmis
        etx=Random(vv)+50                   ;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!!!
  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 
 

Publié : dim. 07/oct./2007 0:06
par RV
@Dobro
Cool!
Année 70...
Année...psychadelisme...
psychadelistme...
psychadeliqsme...
70 quoi!!!

Publié : dim. 07/oct./2007 0:09
par Frenchy Pilou
Dans une démo qui se respecte faut du son! :wink:
Avec les rebonds de la boule bleue?

Publié : dim. 07/oct./2007 0:31
par RV
Frenchy Pilou a écrit :Dans une démo qui se respecte faut du son! :wink:
Avec les rebonds de la boule bleue?
Genre?

Publié : dim. 07/oct./2007 0:46
par Backup
telecharger ce petit fichier "5.zip" qui une fois décompresse donnera "5.mid"
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 :) )


le fichier :
http://michel.dobro.free.fr/Forum_PB/5.zip



le code : ; Montez le Son !! :D et patientez quelques Secondes ...

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
 
 
 

Publié : dim. 07/oct./2007 0:59
par RV
Tu parlais de moquette...ya le papier peint avec!!! :lol:

Publié : dim. 07/oct./2007 1:03
par Backup
:D

je viens de mettre un fichier musique different !! :)
RV a écrit :Tu parlais de moquette...ya le papier peint avec!!! :lol:
pourquoi tu parle de papier peint ? 8O :)





[re-edit]

je viens de remodifier le code, j'avais temporairement désactivé le 16/9 em Sorry !! :oops: :)

Publié : dim. 07/oct./2007 1:11
par RV
Bah...vu l'avatar...! 8O

Publié : dim. 07/oct./2007 1:20
par Frenchy Pilou
Marche parfaitement, çà guinche 8)
Faudrait peut-être modifier la boule bleu, la faire changer de couleur, car là elle n'est pas dans le même style flashy que le reste :wink:

Publié : dim. 07/oct./2007 1:23
par Backup
Frenchy Pilou a écrit :Marche parfaitement, çà guinche 8)
Faudrait peut-être modifier la boule bleu, la faire changer de couleur, car là elle nest pas dans le même style flashy que le reste :wink:
oui! tu as raison , :D

bon je vais Dormir la :lol:

Bye :)