2Débutant

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

2Débutant

Message par beauregard »

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 :

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 
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Débutant en PB, mais pas en prog :)

Tu as essayé avec des sprite3D ? tu devrais obtenir le même effet en plus rapide je pense. Enfin je ne suis pas le mieux placé pour parler des sprite3D je ne les utilise que très rarement. Mais je crois que c'est avec ça que tu obtiendras les meilleures performances.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

comtois a écrit :Débutant en PB, mais pas en prog :)

Tu as essayé avec des sprite3D ? tu devrais obtenir le même effet en plus rapide je pense. Enfin je ne suis pas le mieux placé pour parler des sprite3D je ne les utilise que très rarement. Mais je crois que c'est avec ça que tu obtiendras les meilleures performances.

bonjour comtois, j'ai déjà commencé le développement d'un jeu en 2D (10.000 lignes environs), et je vais le continuer tout en faisant la conversion sur pb. Et n'utilisant ni fonction 3D( le style de jeu n'en a pas besoin), ni fonction de collision ( trop gourmand sur les autres basic, alors je teste les coordonnées X et Y. C'est un peu fastidieux, mais cela a l'avantage de n'utiliser aucune resource machine (comme dise les pro)).

Non, le petit soucis du moment, c'est comment affecter plusieurs images (LoadAnimImage sur les autres basic) à un sprite ? un sprite 2D biensûr.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

beauregard a écrit :Non, le petit soucis du moment, c'est comment affecter plusieurs images (LoadAnimImage sur les autres basic) à un sprite ? un sprite 2D biensûr.
Tu parles d'animer un sprite 2D ?
Il y a petit tuto ici

ou plus simplement regarde la commande ClipSprite()
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

ah!

Message par beauregard »

Oui, je suis passé à côté sans le voir, merci beaucoup !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

beauregard a écrit :ni fonction de collision ( trop gourmand sur les autres basic,
pourtant en purebasic elle sont tres rapide les collisions !! :)
(rien a voir avec le Dark basic par exemple :lol: )

les "sprite3D", ont ce nom, car ils utilisent la carte video 3d pour le calcul de certain effets (transparence rotation,ect..),en lieu et place du processeur..
rien a voir avec la 3D proprement dit (Dreamotion3D)

mais c'est vrais que pour la rapidité, il est ecris dans la doc que les sprites 2D sont plus veloce ! alors.. ?!!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

en fait voici la version utilisant les sprite 3D , c'est beaucoups plus rapide !! :D
j'avais un fps de 29 avant et de 59 maintenant !! :D


; ------------------------------------------------------------
;
; 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 Or InitSprite3D ()=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).
    
     #eaus3d ;eau surface.
     #eaup3D ;eau profonde.
     #tile1p23D ; tile plan2 ( test provisoire).
     #tile1p33D ; 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 (1024, 768, 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_Texture )
StartDrawing ( SpriteOutput ( #eaup ))
BackColor ( RGB (0,0,0))
Box (0,0,384,192, RGB (16,96,168 ))
StopDrawing ()

CreateSprite3D ( #eaup3D , #eaup )

CreateSprite ( #tile1p2 ,64,64, #PB_Sprite_Texture ) ; disque intéractif
StartDrawing ( SpriteOutput ( #tile1p2 ))
BackColor ( RGB (0,0,0))
Circle (32,32,32, RGB (255,0,0))
StopDrawing ()
CreateSprite3D ( #tile1p23D , #tile1p2 )


CreateSprite ( #tile1p3 ,256,256, #PB_Sprite_Texture ) ; 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 ()
CreateSprite3D ( #tile1p33D , #tile1p3 )

Repeat ; boucle principale
    
    
     ; **************************************************************************************************
     FlipBuffers (): ClearScreen ( RGB (0,0,0)) ;StartSpecialFX() 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 !...
     Start3D ()
     ; DisplaySprite(#tile1p3, 512-64, 360+Y); de par la fabrication particulière de cet objet, à base de FillArea,
     DisplaySprite3D ( #tile1p33D , 512-64, 360+Y)
     ; 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
     DisplaySprite3D ( #tile1p23D , MouseX (), MouseY ()+40,125)
    
     ; 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)
     DisplaySprite3D ( #eaup3D , 0, 576,170)
     ;DisplayTranslucentSprite(#eaup, 384, 576,170)
     DisplaySprite3D ( #eaup3D , 384, 576,170)
     ;DisplayTranslucentSprite(#eaup, 768, 576,170)
     DisplaySprite3D ( #eaup3D , 768, 576,170)
    
    
    
    
     ; libre à vous de pousser plus loin le test:
    
     ;DisplayTranslucentSprite(#eaup, 0, 576-192,170)
     DisplaySprite3D ( #eaup3D , 0, 576-192,170)
    
     ;DisplayTranslucentSprite(#eaup, 384, 576-192,170)
     ;DisplayTranslucentSprite(#eaup, 768, 576-192,170)
     DisplaySprite3D ( #eaup3D , 768, 576-192,170)
    
    
     ;DisplayTranslucentSprite(#eaup, 0, 576-384,170)
     DisplaySprite3D ( #eaup3D , 0, 576-384,170)
     ;DisplayTranslucentSprite(#eaup, 384, 576-384,170)
     ;DisplayTranslucentSprite(#eaup, 768, 576-384,170)
    
     ;DisplayTranslucentSprite(#eaup, 0, 0,170)
     DisplaySprite3D ( #eaup3D , 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 : ) ).
    
     Stop3D ()
     ; 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
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Message par Eric »

Salut à tous,

Sans les sprite3D; je suis à 59 FPS
Avec les Sprite3D; je suis à 603 FPS

attention j'ai un Core 2 Dual 6600 et 6800 XT, mais cela démontre la puissance des sprite3D
Anonyme

Message par Anonyme »

Pour les animations, j'ai pondu cela y a quelques temps :

http://www.purebasicgames.fr/e107_plugi ... ic.php?222
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

les yeux grand ouvert

Message par beauregard »

Vos réponses sont aussi rapides que percutantes ! 8O

Simple et rapide, ce DisplaySprite3D devrait être mis en avant, et il est évident que le manuel de pb dessert ce langage que je trouve désormais génial. Je saisi mieux maintenant l'engouement qui entoure ce logiciel... je vais me déchainer ! ;)

merci à tous ! :D
Répondre