Mini intro

Programmation avancée de jeux en PureBasic
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Mini intro

Message par Buckethead »

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.

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)

Dernière modification par Buckethead le sam. 06/oct./2007 18:59, modifié 3 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Magnifique! Tu sors d'où? :D On sent la patte d'un vieux coder qui a longtemps joué avec les sinus! Tu m'as bien fait rire avec tes .c et tes .w partout ;) Sans parler de la res!
Tu as fait le bon choix avec purebasic, tu vas bien t'amuser :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mini intro

Message par Backup »

Buckethead a écrit :En utilisant plot je ne perd que 3 frames. J'imaginais beaucoup plus.
je le répète une fois de plus, c'est plot() qui est spécialement lent
c'est surtout POINT() !!

joli code ! :D

[Edit]

il existe une lib qui reprend le principe des fonctions GET PUT de GFA basic !! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

......
Dernière modification par Backup le mar. 19/août/2014 13:15, modifié 1 fois.
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

@Buckethead

Marche pas chez moi! :(

Dual core T5500 a 1.66Ghz avec 1024Mo de RAM
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

RV a écrit :@Buckethead

Marche pas chez moi! :(

Dual core T5500 a 1.66Ghz avec 1024Mo de RAM
c'est un peu court comme explication !! 8O

t'as un message d'erreur ? 8O

qu'est-ce qui ne marche pas ? 8O
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

@Dobro

Justement, aucun message d'erreur!
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Chez moi cela fonctionne nickel.

RV, c'est bête comme question, mais as-tu mis un chemin valide pour l'image ?
Dernière modification par tmyke le ven. 05/oct./2007 17:21, modifié 1 fois.
Force et sagesse...
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Dobro a écrit :
RV a écrit :qu'est-ce qui ne marche pas ? 8O
ça doit être çà:
ResizeImage (1,WIMG,HIMG)
j'avais pas bien vu que c'était un jpg qu'il fallait, faut faire gaffe au format d'image...
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

C'était juste l'affichage en 320x200, mon ecran ne fait pas!
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

bel intro, en si peut de ligne, chapeau bas! :D

fidele conversion Dobro, mais tu ne respectes pas les couleurs d origine :?
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

mathématique

Message par beauregard »

Buckethead a écrit :Un code pour le fun
un bien joli ptit code :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tonton a écrit :bel intro, en si peut de ligne, chapeau bas! :D

fidele conversion Dobro, mais tu ne respectes pas les couleurs d origine :?
ha bon ? 8O

je re-regarde ... :?

ben si c'est bon !!
; 15 combination modes:
;#BLACKNESS, #DSTINVERT, #MERGECOPY, #MERGEPAINT, #NOTSRCCOPY, #NOTSRCERASE ;#PATCOPY
; #PATINVERT, #PATPAINT, #SRCAND, #SRCCOPY, #SRCERASE, #SRCINVERT, #SRCPAINT, #WHITENESS
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

@Buckethead
Super ton Code :)
Tu devrais changer ton pseudo en >Sinusoman< :wink:
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

djes: Je vois maintenant ce qu'il faut faire pour les variables, je men doutais mais j'ai répèté quand même l'extension.
Autrement j'avais vaguement aperçu le sujet en C. (en mode console) Ca reste quelque chose d'inhabituel pour moi.
Purebasic est en tout cas plus interressant que Coolbasic, rien que la taille de l'exécutable. En plus il peut être packé
avec kkrunchy.

Dobro: "Bit-block transfer of color Data from source DC into a destination DC". Ca doit être le truc que j'ai tenté de décrire.
Je n'ai pas encore bien analysé ces routines. Cette fonction BitBlt_ ne m'a pas l'air d'être dans le help.
J'ai peu de souvenir du GFA basic, mais je suis sur d'avoir touché à GET PUT. Les GFA punchs!!
(sinon les "deuxlignes" encore plus oldsk00l :D)
Merci beaucoup pour ce code.

RV: Le 320*200*32 ne passe pas sur tous les PC's, il faudrait un code supplémentaire. Par exemple un dialog avec la possibilité
de lancer l'intro en 800*600 (avec un strech 320*200->800*600. Le plasma prend beaucoup de ressources)

Merci pour le feedback, tonton, beauregard, tmyke, Mytic aka >Cosinusman< ;P
Répondre