full screen avec la fonction examinedesktops et les sprites

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

full screen avec la fonction examinedesktops et les sprites

Message par raven »

bonjour à tous,

j'ai besoin d'un peu d'aide,pour le multi résolution et l'affichage des sprites.
en effet,à part imposer une résolution d'écran,j'ai pas réuissi à afficher mes sprites dans divers résolutions.
sans pour autant,que tout soit visible à l'écran quand je place mes sprites.

Si je place mes sprites pour une résolution de 1920 x 1080,forcément on ne verra pas tout avec du 1024x768 ou alors la moité.

si j'impose une résolution d'écran donc:

Code : Tout sélectionner

  If OpenScreen(1024,768,32,"test intro") = 0
     MessageBox_ (0,"Impossible d'ouvrir un écran 1024x768x32@75hz", "ERREUR", #MB_ICONINFORMATION|#MB_OK)  :End 
    EndIf
je base tout mes sprites pour du 1024x768 .
je suis sur que tout sera afficher correctement,sur n'importe quel pc qui peut afficher du 1024x768 ou plus.

par contre pour ceci :

Code : Tout sélectionner

ExamineDesktops()
Sx = DesktopWidth(0)
Sy = DesktopHeight(0)
; ouvre l'écran
OpenScreen(Sx,Sy,32,"intro_raven" ) 
comment afficher mes sprites,pour qu'il soit visible correctement chez tout le monde?
la c'est un test,avec 2ddrawing pour l'exemple,car j'utilise des images png.

je me doute qu'ils faut redimentioné mes sprites.
c'est la que je galére :?

crée un gros sprite pour l'écran? et placé le reste dedans avec ResizeImage() ?

merci d'avance

voici le code ou la valeur des sprites est placer pour du 1920x1080

Code : Tout sélectionner

;------------------------
; test intro affichage
;     par raven 
; Purebasic 5.22 lts
;-------------------------
initsprite()
InitKeyboard()
initmouse()
;-------  resolution d'ecran de l'utilisateur  ------
ExamineDesktops()
Sx = DesktopWidth(0)
Sy = DesktopHeight(0)
; ouvre l'écran
OpenScreen(Sx,Sy,32,"intro_raven" ) 

enumeration
   #sprite= 950   ; affiche le sprite au milieu d'écran,avec la résolution 1920x1080 mon affichage actuel.
   #ligne  
endenumeration

enumeration 
   #font 
endenumeration
; charge la fonte
LoadFont(#font,"impact",25 )

createsprite(#sprite,500,500)
createsprite(#ligne,1080,10)
;-------------------------
; -- boucle principale
;-------------------------
repeat
   
   ExamineKeyboard()
   examinemouse()
   ClearScreen(rgb(0,0,0))
   StartDrawing(ScreenOutput())
      DrawingMode((#PB_2DDrawing_AlphaBlend ))
      
      ; colore le sprite de façon aleatoire 
      FrontColor(RGB(Random(255),Random(255),Random(255)))
      
      ; affiche les sprites,donc tout est ok pour du 1920x1080    
      box(#ligne,10,1080,10)         ; ligne du haut d'ecran partie droite
      box(#ligne,10,-1080,10)        ; ligne du haut d'écran parti gauche
      box(#ligne,1070,1080,10)    ;ligne du bas d'ecran partie droite
      box(#ligne,1070,-1080,10)    ; ligne du bas d'ecran partie gauche
   StopDrawing()
   
   ;  affiche le cercle
   StartDrawing(ScreenOutput())
      Circle(#sprite,550,zoomx,rgb(15,150,10))
   StopDrawing()
   
   ; zoom pour le cercle
   If zoom = 0
      zoomx + 1.6
      If zoomx=>200:zoom=1:EndIf
      Else
      zoomx - 1.6
      If zoomx<=150:zoom=0:EndIf
      
   EndIf
   ;--- fps ----
   
   If FPST < ElapsedMilliseconds()
      FPST = ElapsedMilliseconds()+1000
      fps = FPSC
      FPSC=0
   EndIf
   FPSC+1
   
   If StartDrawing(ScreenOutput())
      
      If KeyboardReleased( #PB_Key_Space)
         If affiche_menu = #True
            affiche_menu = #False
            Else
            affiche_menu = #True
         EndIf
      EndIf
      DrawingMode(#PB_2DDrawing_Transparent)
      
      If affiche_menu = #False
         
         DrawingFont(FontID(#font))
         DrawText(20,20,"FPS: "+Str(fps),RGB(50,255,150))
         drawtext(20,60,"Test intro par Raven",rgb(255,255,255))
         drawtext(20,100,"Purebasic 5.22 lts",rgb(255,255,255))
         Else
      EndIf
      StopDrawing()
      EndIf 
   
   FlipBuffers()
   
Until   KeyboardPushed(#PB_Key_Escape)  or mousebutton(2)

CloseScreen()

End
freesprite(#sprite)
freesprite(#ligne)
freefont(#font)
; Epb
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: full screen avec la fonction examinedesktops et les spri

Message par djes »

Si tu tiens vraiment à adapter ton affichage aux multiples résolutions d'écrans des utilisateurs (au lieu d'avoir quelques résolutions fixes), il faut que tu passes d'un travail en coordonnées absolues à un travail en coordonnées relatives. Il est quand même important que tu soies sûr du ratio hauteur/largeur de l'affichage que tu veux, parce qu'un jeu par exemple ne s'imagine pas de la même façon en 16/9ème ou en 4/3.

Au départ, tu vas créer tes sprites pour une résolution maximale (attention à ne pas exagérer non plus, ça prend de la place ces p'tites bêtes là), par exemple tu fais tes planches en 1920x1024.

Au début de ton programme, tu vas créer (ou recréer si changement de résolution) dynamiquement tous tes sprites pour la résolution choisie, à partir des fichiers originaux, et tu les redimensionnes à ce moment-là. Ca permet d'avoir toujours la meilleure qualité possible, l'affichage futur sera plus rapide et moins consommateur en mémoire.

Ensuite dans le programme, au lieu d'utiliser des valeurs fixes, tu utilises la largeur et la hauteur de l'écran ouvert pour calculer, pour toutes les coordonnées, et à l'aide d'une simple règle de trois, la taille des sprites et leur position. Tu ne dois plus penser en termes de pixels, mais en terme de taille écran/x. Par exemple, placer le sprite au milieu, c'est placer le sprite à largeur écran/2 - largeur sprite / 2, hauteur écran/2 - hauteur sprite / 2.

C'est là que les structures montrent leur intérêt. Pour chaque sprite, tu peux avoir une structure qui contient la taille d'origine, la taille calculée, la position, le hotspot, le nombre d'images, etc.
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

Re: full screen avec la fonction examinedesktops et les spri

Message par raven »

merci de ta réponse djes,je t'ai envoyé un mp :wink:
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Re: full screen avec la fonction examinedesktops et les spri

Message par Jenova »

Pourquoi ne pas faire un simple truc comme ça ?

Code : Tout sélectionner

Procedure InitScreen(SizeX.l, SizeY.l)
  ExamineDesktops()
  Largeur.f = ( (DesktopWidth(0) - (DesktopHeight(0)/SizeY) * SizeX) /2)
      If OpenWindow(1,0,0,Round(Largeur,#PB_Round_Nearest)*2+SizeX,SizeY,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
        SetWindowColor(1,RGB(0,0,0))
        If OpenWindowedScreen(WindowID(1),Round(Largeur,#PB_Round_Nearest),0,SizeX,SizeY,1,Round(Largeur,#PB_Round_Nearest),0,#PB_Screen_WaitSynchronization)
          SetWindowState(1,#PB_Window_Maximize)
          SpriteQuality(#PB_Sprite_BilinearFiltering)
        Else
          MessageRequester("Erreur :","Ouverture de l'écran impossible")
        EndIf
      Else
        MessageRequester("Erreur :","Ouverture de la fenêtre impossible")
      EndIf
      Delay(2000)
EndProcedure
Répondre