Mini intro
Publié : ven. 05/oct./2007 15:55
Edit: ajout d'un code commenté pour faire un scroller.
Un code pour le fun après quelque tests sur les sprites et tout ce qui est buffer. J'ai aussi testé les sprite3D. J'ai cherché une fonction qui permet de déplacer une zone bitmap sans devoir copier celle-ci au préalable. (plus rapide) Cette méthode permet aussi des effets spéciaux si on éfface pas le background. J'imagine que ca doit être possible ? Sur d'autre langage j'ai relevé environ 5 fois la vitesse entre un "drawcopy" et un "drawscroll".
Mon pc a moins de deux mois, la routine monte à 115 FPS sans sync et débogueur off. En utilisant plot je ne perd que 3 frames. J'imaginais beaucoup plus. Est-ce du à ma carte graphique? (8800 GTS)
Je testerais les pointeurs, mais je dois aborder des choses plus basiques. Ne serait-ce que l'interface. J'ai principalement fait ceci pour voir si j'allais m'investir sur ce nouveau langage. (adopté
) Désolé code pas lisible en plus quelquechose a foiré avec le parser. Je fournirai un code commenté pour la partie sinuscroll.
Un code pour le fun après quelque tests sur les sprites et tout ce qui est buffer. J'ai aussi testé les sprite3D. J'ai cherché une fonction qui permet de déplacer une zone bitmap sans devoir copier celle-ci au préalable. (plus rapide) Cette méthode permet aussi des effets spéciaux si on éfface pas le background. J'imagine que ca doit être possible ? Sur d'autre langage j'ai relevé environ 5 fois la vitesse entre un "drawcopy" et un "drawscroll".
Mon pc a moins de deux mois, la routine monte à 115 FPS sans sync et débogueur off. En utilisant plot je ne perd que 3 frames. J'imaginais beaucoup plus. Est-ce du à ma carte graphique? (8800 GTS)
Je testerais les pointeurs, mais je dois aborder des choses plus basiques. Ne serait-ce que l'interface. J'ai principalement fait ceci pour voir si j'allais m'investir sur ce nouveau langage. (adopté

Code : Tout sélectionner
;Buckethead first intro oct 2007
InitSprite()
InitKeyboard()
OpenScreen(320,200,32,"i")
LoadFont(2,"terminal",5)
LoadFont(3,"impact",50)
CreateSprite(1,320,200)
CreateSprite(0,4100,64)
CreateSprite(2,320,200)
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(3))
t$="VOICI UN BON VIEUX SINUSCROLL 1 PIXEL EN 320*200 QUI NE SERA PAS TRES LONG! 1,2,3,4 .. WRAP'N'WRAP ..... VOICI UN BON V"
For uu=1 To 100
DrawText(2*Sin(uu),-12+2*Cos(uu/50),t$,RGB(155+100*Sin(uu/40),100+80*Cos(uu/40),40))
Next uu
DrawText(0,-12,t$,16777215)
StopDrawing()
ti.w=2450
Repeat
ClearScreen(0)
ti.w=ti.w+2
ri.w=ri.w+3
If ti.w>2788
ti.w=0
EndIf
For ho.c=1 To 64 Step 3
ClipSprite(0,ti.w,ho.c,320+64,2)
DisplaySprite(0,-32+32*Sin(ri.w/64+ho.c/32),ho.c)
Next ho.c
GrabSprite(2,0,0,320,200)
StartDrawing(SpriteOutput(1))
t.w=t.w+1
e.f=90*Sin(t.w/100)
u.f=t.w/20
j.f=t.w/5
dp.w=DrawingBufferPitch()
LineXY(0,22,320,22,11000)
LineXY(0,176,320,176,11000)
For y.c=24 To 174 Step 2
z.l=dp.w*y.c
v.f=y.c/32
o.f=y.c/16
For x.w=0 To 319
s.f=x.w/32
p.f=256*Sin(j.f+(e.f*Sin(u.f+s.f)*Cos(v.f+u.f))/16+o.f)
p.f=Abs(p.f*Sin(p.f/128+x.w*16*Cos(x.w/256))*Sin(u.f+s.f))
PokeL(DrawingBuffer()+x*4+z.l,RGB(p.f/4,x.w/8+p.f/8,p.f/32+y.c/4))
Next x.w
Next y.c
StopDrawing()
DisplaySprite(1,0,0)
DisplayTransparentSprite(1,0,1)
For ve.w=0 To 320 Step 3
ClipSprite(2,ve.w,0,2,64)
DisplayTransparentSprite(2,ve.w,70-64*Cos(ri.w/32+ve.w/64))
Next ve.w
StartDrawing(ScreenOutput())
For a.c=0 To 128 Step 8
rr.f=2048*Sin(a.c/64+t.w/32)/16
Circle(157+rr.f,123+60*Sin(a.c/16+u.f+64*Cos(a.c/512+rr.f/1024)),6,1510912)
Next a.c
For a.c=0 To 128 Step 8
rr.f=2048*Sin(a.c/64+t.w/32)/16
s.f=60*Sin(a.c/16+u.f+64*Cos(a.c/512+rr.f/1024))
Circle(160+rr.f,120+s.f,6,RGB(255,a.c%256,20))
Circle(161+rr.f,119+s.f,4,RGB(255,50+a.c%256,80))
Circle(162+rr.f,118+s.f,1,16119290)
Next a.c
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Code : Tout sélectionner
; Petit tuto sur les scrollers.
;
; Je connais encore mal PureBasic, alors je ne donne pas forcement les meilleurs
; éléments pour débuter. Je vous laisse soin de rendre ce code plus flexible
; et plus simple à manier, car ici tout est écrit en "dur".
; ____________________________________________
; 1/
; Scroller avec les sprites "2D"
; (appelé aussi scrolltext)
; ____________________________________________
; Le principe est le même que le scrolling d'une caméra.
; Nous copions une zone du tampon (ou buffer) qui contient tout le
; texte pré-dessinné. Nous avancons de gauche à droite.
; Initialise tout ce qu'on aura besoin.
InitSprite()
InitKeyboard()
OpenScreen(320,200,32,"a") ; Il se peut qu'il y est un problème avec cette résolution. Modifiez au besoin
LoadFont(1,"impact", 50)
CreateSprite(0,1739+320,60) ; buffer "sprite" sur lequel on va afficher tout le texte
; ### préparer le texte dans le buffer ###
; Affiche le texte dans le buffer, le sprite 0
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_Transparent) ; Le texte en blanc avec un background transparent.
DrawingFont(FontID(1)) ; Selectionne la font "impact"
; L'astuce c'est de répeter le début du texte à la fin du scroll sur le buffer (*** SIMPLE SCROLLER) suffisament long pour contenir
; la largeur de l'écran (320 pixel)
DrawText(0,-14,"SIMPLE SCROLLER EN PUREBASIC VIA LA TECHNIQUE DES SPRITES *** SIMPLE SCROLLER ",RGB(255,255,255))
StopDrawing()
; ### La routine ###
Repeat
ClearScreen(0)
t = t + 2 ; Incrémente la variable pour avancer dans le texte pour réaliser le scroller
If t > 1739 ; Une fois arrivé au bout du scroll on revient à 0.
t = 0 ; De préfèrence faite un code pour définir en auto les pixels nécessaire à la boucle (1739 pixels)
EndIf ; Perso, j'ai affiché deux fois le scroller et aligné le début et la fin de celui ci en dur.
ClipSprite(0, t, 0, 320, 60) ; Le gros de la routine: on copie la zone qui nous interresse dans le buffer
DisplaySprite(0,0,70) ; On affiche la partie du texte dans l'écran principal.
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
; Bientôt le Sinuscroll via la technique des slices (tranches)