Mini intro
ajout du 16/9 em et de la couleur !! 
on capte les extra terrestre maintenant !!

on capte les extra terrestre maintenant !!

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!
hum !! un petit titre ça fais pas de mal 

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
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
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.
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.
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
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
A la fin, l'idée serait d'avoir une nouvelle fonction du style:
drawscroll(hwnd,Xscroll,Yscroll,Xorigine,Yorigine,Largeur,Hauteur)
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
drawscroll(hwnd,Xscroll,Yscroll,Xorigine,Yorigine,Largeur,Hauteur)
j' ajoute quelque boulles en rotation
alore bernard13!!!!!!!! on t' attend!!!!!!!.

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
normal cette fonction est faite pour celaBuckethead a écrit :Presque , enfin ca reste assez compliqué pour moi.
De plus je ne réussi qu'à scroller l'écran entier
c'est toute la surface qui est Scrollé avec ton APIIdentifies the window where the client area is to be scrolled.

pourquoi ceci ne te conviens pas ??

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

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.
j'ai ré-édité mon message en montrant avec l'utilisation d'un sprite !!Buckethead a écrit :Nice

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

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

comme ça

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.
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
Dobro:
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 ...
)
On doit pouvoir spécifier un rectangle.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.
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 ...
