Mini intro

Programmation avancée de jeux en PureBasic
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci beaucoup les amis
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

merci bernard!
c' est une demo open source
ajoutes un truc , :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ajout du 16/9 em et de la couleur !! :lol:

on capte les extra terrestre maintenant !! 8O

Code : Tout sélectionner




InitSprite()                                    ; Initialise les sprites
InitKeyboard()                                  ; Initialise le clavier

#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
    
    
    
    
    Repeat                                      ; Boucle
      ClearScreen(0)                            ; Efface l'écran
      ExamineKeyboard()                         ; Scanne l'état du clavier
      
      StartDrawing(ScreenOutput())              ; Démarre le dessin dans le buffer
      
      
      
      
      
      
      ;--------------- 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
      
      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
      Beep_(son,5)
      
      FlipBuffers()                             ; Inverse les buffers
    Until KeyboardPushed(#PB_Key_Escape)        ; On s'en va!!!
  EndIf
EndIf



End                                             ; Adios!





 
 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

hum !! un petit titre ça fais pas de mal :D

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


 

 
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci dobro
tu code vite toi
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bernard13 a écrit :merci dobro
tu code vite toi
pas vraiment .. j'ai un gros Stock de code, j'ai plus qu'a copier-coller pour en faire d'autre vite fait :D
le tout c'est d'avoir un bon stock :lol:
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Je viens de comprendre pour BitBlt_ le _ à la fin pour utiliser les API windows. Décidement PureBasic est une mine d'or!

bernard13: j'ai ajouté du code commenté sur le premier post




Pour le (vrai) scrolling il y a la fonction "ScrollWindowEx", je vais essayé d'implanter ça avec l'exemple donner plus haut.
The ScrollWindowEx function scrolls the content of the specified window's client area. This function is similar to the ScrollWindow function, but it has additional features.

int ScrollWindowEx(

HWND hWnd, // handle of window to scroll
int dx, // amount of horizontal scrolling
int dy, // amount of vertical scrolling
CONST RECT *prcScroll, // address of structure with scroll rectangle
CONST RECT *prcClip, // address of structure with clip rectangle
HRGN hrgnUpdate, // handle of update region
LPRECT prcUpdate, // address of structure for update rectangle
UINT flags // scrolling flags
);


Parameters

hWnd

Identifies the window where the client area is to be scrolled.

dx

Specifies the amount, in device units, of horizontal scrolling. This parameter must be a negative value to scroll to the left.

dy

Specifies the amount, in device units, of vertical scrolling. This parameter must be a negative value to scroll up.

prcScroll

Points to the RECT structure specifying the portion of the client area to be scrolled. If this parameter is NULL, the entire client area is scrolled.

prcClip

Points to the RECT structure containing the coordinates of the clipping rectangle. Only device bits within the clipping rectangle are affected. Bits scrolled from the outside of the rectangle to the inside are painted; bits scrolled from the inside of the rectangle to the outside are not painted.

hrgnUpdate

Identifies the region that is modified to hold the region invalidated by scrolling. This parameter may be NULL.

prcUpdate

Points to the RECT structure receiving the boundaries of the rectangle invalidated by scrolling. This parameter may be NULL.

flags

Specifies flags that control scrolling. This parameter can be one of the following values:

Value Meaning
SW_ERASE Erases the newly invalidated region by sending a WM_ERASEBKGND message to the window when specified with the SW_INVALIDATE flag.
SW_INVALIDATE Invalidates the region identified by the hrgnUpdate parameter after scrolling.
SW_SCROLLCHILDREN Scrolls all child windows that intersect the rectangle pointed to by the prcScroll parameter. The child windows are scrolled by the number of pixels specified by the dx and dy parameters. Windows sends a WM_MOVE message to all child windows that intersect the prcScroll rectangle, even if they do not move.


Return Values

If the function succeeds, the return value is SIMPLEREGION (rectangular invalidated region), COMPLEXREGION (nonrectangular invalidated region; overlapping rectangles), or NULLREGION (no invalidated region).
If the function fails, the return value is ERROR.

Remarks

If the SW_INVALIDATE and SW_ERASE flags are not specified, ScrollWindowEx does not invalidate the area that is scrolled from. If either of these flags is set, ScrollWindowEx invalidates this area. The area is not updated until the application calls the UpdateWindow function, calls the RedrawWindow function (specifying the RDW_UPDATENOW or RDW_ERASENOW flag), or retrieves the WM_PAINT message from the application queue.
If the window has the WS_CLIPCHILDREN style, the returned areas specified by hrgnUpdate and prcUpdate represent the total area of the scrolled window that must be updated, including any areas in child windows that need updating.

If the SW_SCROLLCHILDREN flag is specified, Windows does not properly update the screen if part of a child window is scrolled. The part of the scrolled child window that lies outside the source rectangle is not erased and is not properly redrawn in its new destination. To move child windows that do not lie completely within the rectangle specified by prcScroll, use the DeferWindowPos function. The cursor is repositioned if the SW_SCROLLCHILDREN flag is set and the caret rectangle intersects the scroll rectangle.

All input and output coordinates (for prcScroll, prcClip, prcUpdate, and hrgnUpdate) are determined as client coordinates, regardless of whether the window has the CS_OWNDC or CS_CLASSDC class style. Use the LPtoDP and DPtoLP functions to convert to and from logical coordinates, if necessary.
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Presque , enfin ca reste assez compliqué pour moi.
De plus je ne réussi qu'à scroller l'écran entier.
Ensuite, ce n'est pas tout à fait ce que je voulais faire. Je comptais voir le texte se répèter sur l'écran, comme une boucle avec un drawtext,
For i = 1 To 640 Step 25
DrawText(0,i,"mon texte",255)
Next i

Code : Tout sélectionner

InitSprite () 
LoadFont (1,"impact",20)

hwnd=OpenWindow (1,0,0,640,480,"scroll",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) 
OpenWindowedScreen (hwnd,0,0,640,480,0,0,0)

   

Repeat 

t=t-10
    
   StartDrawing (WindowOutput(1)) 
DrawingMode(#PB_2DDrawing_Transparent) 
 DrawingFont(FontID(1))
     DrawText(0,440,"SCROLLTEXT QUI PART DU BAS ET VA SE REPETER VERS LE HAUT AVEC UN SCROLL VERTICAL DE 10 PIXELS",255)


  prcClip = DrawingBuffer() 
          ScrollWindowEx_ (hwnd,0,t,0,prcClip,0,0,0)
  
 
    StopDrawing ()
    
   
        FlipBuffers() 
    Event= WindowEvent () 
       Until Event= #PB_Event_CloseWindow
A la fin, l'idée serait d'avoir une nouvelle fonction du style:
drawscroll(hwnd,Xscroll,Yscroll,Xorigine,Yorigine,Largeur,Hauteur)
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

j' ajoute quelque boulles en rotation :wink:
alore bernard13!!!!!!!! on t' attend!!!!!!!. :?

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

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Buckethead a écrit :Presque , enfin ca reste assez compliqué pour moi.
De plus je ne réussi qu'à scroller l'écran entier
normal cette fonction est faite pour cela
Identifies the window where the client area is to be scrolled.
c'est toute la surface qui est Scrollé avec ton API :)


pourquoi ceci ne te conviens pas ?? 8O

Code : Tout sélectionner

InitSprite ()
LoadFont (1,"impact",20)
hwnd=OpenWindow (1,0,0,640,480,"scroll",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
OpenWindowedScreen (hwnd,0,0,640,480,0,0,0)
Repeat 
  t=t-10 
  If t=-480:t=480:EndIf 
  StartDrawing (WindowOutput(1))  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(1))
  DrawText(0,t,"SCROLLTEXT QUI PART DU BAS ET VA SE REPETER VERS LE HAUT AVEC UN SCROLL VERTICAL DE 10 PIXELS",255)
  StopDrawing () 
  
  FlipBuffers()
  Event= WindowEvent ()
Until Event= #PB_Event_CloseWindow 
Perso pour faire ça , je prefere utiliser un sprite :D

comme ça :

Code : Tout sélectionner

#Sprite=1
InitSprite ()
LoadFont (1,"impact",20)
hwnd=OpenWindow (1,0,0,640,480,"scroll",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
OpenWindowedScreen (hwnd,0,0,640,480,0,0,0)


txt$="SCROLLTEXT QUI PART DU BAS ET VA SE REPETER VERS LE HAUT AVEC UN SCROLL VERTICAL DE 10 PIXELS"
CreateSprite(#Sprite,640,50)
StartDrawing (SpriteOutput(#Sprite))  
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(1))
DrawText(0,t,txt$,255)
StopDrawing () 


Repeat 
  Y=Y-10 
  If Y=-480:Y=480:EndIf 
  DisplaySprite(#Sprite,1,Y)
  
  FlipBuffers()
  Event= WindowEvent ()
Until Event= #PB_Event_CloseWindow 
Dernière modification par Backup le sam. 06/oct./2007 22:22, modifié 1 fois.
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Nice :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

tonton a écrit :alore bernard13!!!!!!!! on t' attend!!!!!!!. :?
Bernard 13, il attend que ce soit fini pour mettre la touche finale, celle qui tue: "Codé par Bernard13" :mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

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

la Grosse différence par rapport aux autre Basic, est que en Purebasic, les Sprites ne sont pas des Entité ,(des Objets), il ne sont qu'une cellule Vide
(comme un ecran) dans lequel on va dessiner :D (start Drawing() )

du coup une image"Sprite" peut être assignée a un numero ( #Sprite)

mais ce numero ne represente que l'image du Sprite, son Graphisme...

ce qui fait que l'on peut utiliser ce même Numero pour des emplacement différent !! (lorsqu'on viens d'un Basic Standard, c'est assez Déroutant faut dire :lol: )
comme ça :D



Code : Tout sélectionner

#Sprite=1
InitSprite ()
LoadFont (1,"impact",20)
hwnd=OpenWindow (1,0,0,640,480,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
OpenWindowedScreen (hwnd,0,0,640,480,0,0,0)

CreateSprite(#Sprite,32,32)
StartDrawing (SpriteOutput(#Sprite)) 
Box(1,1,32,32,RGB(0,0,255))
StopDrawing () 

Repeat 
  x=Random(640)+32
  Y=Random(480)+32 
  DisplaySprite(#Sprite,1+x,1+Y) ; toujour la meme image, mais pas le meme sprite !!
  
  FlipBuffers()
  Event= WindowEvent ()
Until Event= #PB_Event_CloseWindow 
Dernière modification par Backup le sam. 06/oct./2007 22:40, modifié 1 fois.
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Dobro:
prcScroll:

Points to the RECT structure specifying the portion of the client area to be scrolled. If this parameter is NULL, the entire client area is scrolled.
On doit pouvoir spécifier un rectangle.

Pour être plus explicite j'aurais besoin de cette fonction et l'expérimenter un peu. (néanmoins si c'est plus lent que le sprite ... :D)
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

tonton a écrit : alore bernard13!!!!!!!! on t' attend!!!!!!!. :?
:lol: :lol: :lol:
Répondre