2Débutant
Publié : dim. 08/juil./2007 19:05
Après quelques jours de recherche et de travail (n'est pas éric chahi qui veut), j'ai enfin pu cerner le comment ça marche de pb, hum. Mon objectif étant de réaliser un jeu en 2D, capable d'offrir de la transparence digne de ce nom.
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 :
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