Si l'un d'entre vous possède un PC de l'espace, il serait intéressant de savoir combien de grand carré vous pouvez afficher en 60i/s, merci d'avance.
Et voici le code source, joyeusement commenté, afin que les débutants comme moi, prennent directement le bon chemin :
Code : Tout sélectionner
; ------------------------------------------------------------
;
; 2Debutant - 2007 - source purebasic 4. et des poussières
;
; objectif: développer un jeu uniquement en 2D haute résolution. Le tout à base de sprites, et pour la
; transparence il faut utiliser le délicat SpecialFX.
;
; Le source qui suit a pour but de tester le PC, afin que le tout s'affiche à environs
; 60 images/seconde (garantis sans peek, ni poke).
;
; ------------------------------------------------------------
UsePNGImageDecoder(); oui, toi t'es obligatoire.
If InitMouse()=0 Or InitSprite()=0 Or InitKeyboard()=0 ; oui, il faut tout lui dire...
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
End
EndIf
Enumeration ; ici, on donne un petit nom à nos sprites( non, chuis pas un numéro !):
#eaus ;eau surface.
#eaup ;eau profonde.
#tile1p2 ; tile plan2 ( test provisoire).
#tile1p3 ; tile plan3 ( test provisoire).
EndEnumeration
; et déjà un premier choix, un peu difficile à faire:
If OpenScreen(1024, 768, 16, "SpecialFX -> no problemo")=0 ; haute résolution, mais en 16 bit.
;If OpenScreen(640, 480, 32, "SpecialFX -> no problemo")=0 ; basse résolution, mais en 32bit.
MessageRequester("Error", "Can't open a 1024*768 - 16 bit screen !", 0)
;MessageRequester("Error", "Can't open a 640*480 - 32 bit screen !", 0)
End
EndIf
;LoadSprite(#eaup, "Data\eaup1.png", #PB_Sprite_Memory);0) ->pour les images transparentes, remplacer 0 par
; #PB_Sprite_Memory
; I
; ou
; I
CreateSprite(#eaup,384,192,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(#eaup))
BackColor(RGB(0,0,0))
Box(0,0,384,192,RGB(16,96,168))
StopDrawing()
CreateSprite(#tile1p2,64,64) ; disque intéractif
StartDrawing(SpriteOutput(#tile1p2))
BackColor(RGB(0,0,0))
Circle(32,32,32,RGB(255,0,0))
StopDrawing()
CreateSprite(#tile1p3,256,256) ; petit bateau, qui vogue sur l'eau, lala, lalala, la...
StartDrawing(SpriteOutput(#tile1p3))
BackColor(RGB(0,0,0))
;Circle(32,32,32,RGB(255,0,0));Box(0,0,384,192,RGB(16,96,168)) ; ooh et puis non, essayons autre chose:
; ici, je me complique bien la vie. Mais faut bien explorer les environs de ce language:
LineXY(63, 255, 0,127,RGB(29,186,12))
LineXY( 0,127,127*2,127,RGB(29,186,12))
LineXY(127*2,127,127+63, 255,RGB(29,186,12))
LineXY(127+63,255,63, 255,RGB(29,186,12))
FillArea(70,250,RGB(29,186,12),RGB(29,186,12)) ; fortiche quand même.
Box(127,0,10,127,RGB(235,145,55))
LineXY(137, 0, 197,95,RGB(245,245,245))
LineXY(197, 95, 137,95,RGB(245,245,245))
LineXY(137, 95, 137,0,RGB(245,245,245))
FillArea(138,90,RGB(245,245,245),RGB(245,245,245))
StopDrawing()
Repeat; boucle principale
; **************************************************************************************************
FlipBuffers():StartSpecialFX():ClearScreen(RGB(0,0,0)) ; la fine équipe.
If ya=0
y+1 ; c'est pareil que y=y+1. Mais en plus classe.
Else
y-1
EndIf
If ya=0 And y>75 ; mais où vas-tu ? remonte ! ( où est donc passé le Then ?)
ya=1
EndIf
If ya=1 And y<0 ; redescend s'il te plait.
ya=0
EndIf
;DisplayTransparentSprite(#tile1p3, 512-64, 475+y) ; image fond/plan ; plan 3 ( représenté par un bateau).. ouch !
; chute, chute dans le pelotons. aaah, on vous l'avais bien dis !...
DisplaySprite(#tile1p3, 512-64, 360+y); de par la fabrication particulière de cet objet, à base de FillArea,
; supprimer le mot Transparent. ça va mieux maintenant ?
ExamineMouse() ; faut tout lui macher
DisplayTransparentSprite(#tile1p2, MouseX(), MouseY()+40) ; plan 2 ( représenté par un disque que l'on déplace
; fébrilement à la souris)
; image transparente( eau ) ; plan 1( représenté par 3 grands carrés, afin d'être sûr que pb tienne ses promesses)
DisplayTranslucentSprite(#eaup, 0, 576,170)
DisplayTranslucentSprite(#eaup, 384, 576,170)
DisplayTranslucentSprite(#eaup, 768, 576,170)
; libre à vous de pousser plus loin le test:
DisplayTranslucentSprite(#eaup, 0, 576-192,170)
;DisplayTranslucentSprite(#eaup, 384, 576-192,170)
DisplayTranslucentSprite(#eaup, 768, 576-192,170)
DisplayTranslucentSprite(#eaup, 0, 576-384,170)
;DisplayTranslucentSprite(#eaup, 384, 576-384,170)
;DisplayTranslucentSprite(#eaup, 768, 576-384,170)
DisplayTranslucentSprite(#eaup, 0, 0,170)
;DisplayTranslucentSprite(#eaup, 384, 0,170)
;DisplayTranslucentSprite(#eaup, 768, 0,170)
; 7 à 58 images/s. Au delà de 7 grands carrés, mon PC(Athlon64 3500+ ; 1go ram ; geforce 7600 GS 256MB) chute.
; Mais 7, c'est déjà très bien, content je suis.
; Conclusion pour les jeux 2D: prévoir dans les options 3 possibilitées:
; 1) pas de transparence ( afficher grand carré avec l'ancienne technique (1 pixel sur 2)).
; 2) transparence de proximité ( seuls les grands carrés proches de l'objet intéractif seront véritablement
; transparent, pour les autres 1 pixel sur 2).
; 3) totale transparence ( Avec les PC du futur, on pourra s'exprimer pleinement, et en 32 bit s'il vous plait !
; Alors transparence pour tout le monde :) ).
StopSpecialFX()
; **************************************************************************************************
Gosub FPS; nombre d'image par seconde ( à placer dans tout vos jolis programmes, jeune étourdis !)
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape):End ; fin de la boucle principale (appuyez sur la touche Esc)
FPS:
If Val(FormatDate("%ss", Date()))=sek ; regardez pas là, c'est trop compliqué. Arrêtez j'vous dis! Bon ben, je
; vous aurez prévenu...
FPS+1
Else
FPS$=Str(FPS)
FPS=0
EndIf
sek=Val(FormatDate("%ss", Date()))
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(RGB(255,255,255))
DrawText(1,1,"FPS: "+FPS$)
StopDrawing()
Return