HELP pour gerer la definition & affichage

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
drfloyd
Messages : 226
Inscription : mar. 21/août/2007 13:30
Contact :

HELP pour gerer la definition & affichage

Message par drfloyd »

Hello

je programme depuis un bout de temps un jeu de role "retro" sur PC et sa definition est de... 816*464... oui ca peut sembler bizzare LOL

Et comme la plupart des PC je suis en 1980 x 1080 pixels... donc il faut zoomer

Mais en mode fenetre (cachée) plein ecran il y a déformation des pixels à certins endroits, ce qui est normal mais esthétiquement moche.

Voici la struture du code. Je ne sais pas faire autrement pour zoomer :

Code : Tout sélectionner

; fenetre windows fullscreen 
OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "",#PB_Window_BorderLess|#PB_Window_ScreenCentered)    
OpenWindowedScreen(WindowID(0), 0, 0, 816, 464, 1, 0, 0) 

Repeat

  WaitWindowEvent(0)
   ClearScreen(RGB(0,0,0))

  ; affichage des sprites...
  	DisplayTransparentSprite........
  ; affichafe des dessins
	StartDrawing(ScreenOutput())
	StopDrawing()
 ; affichage
 FlipBuffers()

until fin

Comment je peux améliorer ca ?
Il faut que ca tourne sur tous les PC, quelque soit l'ecran et la def des utilisateurs, et en plein ecran

Toutes les idées sont bienvenues... scaling ? changer la definition de mon jeu (pas trop please), mode open GL ?
je suis pret à avoir de petits bandes noires si il le faut
Dernière modification par drfloyd le sam. 06/déc./2025 18:30, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9553
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HELP pour gerer la definition & affichage

Message par Ar-S »

Il te faut faire comme dans hearthstone.
Un plateau de jeu. Et le reste (les coté, le haut le bas selon ton UI) peut être croppé/agrandi.

fenetré

Image
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
drfloyd
Messages : 226
Inscription : mar. 21/août/2007 13:30
Contact :

Re: HELP pour gerer la definition & affichage

Message par drfloyd »

pas compris :)Je reste un novice.

UI ? tu veux dire créer des zones d'infos hors du jeu ? Si oui, je ne veux pas ca, c'est un jeu 100% sans fenetres, ni interfaces sur les cotés.

Sinon j'aurai besoin d'un bout de code correctif
Avatar de l’utilisateur
case
Messages : 1554
Inscription : lun. 10/sept./2007 11:13

Re: HELP pour gerer la definition & affichage

Message par case »

bonjour, voici une approche possible qui demandera un peu de modifications a tes routines d'affichage.
l'approche est de définir un facteur de zoom
qui en le multipliant avec les tailles et coordonées de tes tuiles modifiera l'affichage en fonction de la resolution de l'ecran.
a voir si cela peux fonctionner pour ton jeu et si les performances ne souffrent pas trop des calculs.
:mrgreen:
a noter que dans tout les cas agrandir une image a une taille non multiple d'un entier rendra l'image floue/deformée sur certain aspect lignes plus etroites que d'autres etc. les pixels etant de tailles fixes.

Code : Tout sélectionner

; fenetre windows fullscreen 
ExamineDesktops()
InitSprite()
;dimensions d'origine de la fenetre 
origin_width.f=816   
origin_height=464
;dimensions du bureau
dw=DesktopWidth(0)
dh=DesktopHeight(0)
; calcul du multiplicateur d'affichage
; on divise la taille du bureau par la taille de l'affichage d'origine
; on prend le plus petit des deux comme valeur de multiplicateur
; pour eviter que les coordones agrandies depassent des coordonées du bureau
;
If Dw/origin_width > Dh/origin_height 
  zoomfactor.f=Dh/origin_height
Else
  zoomfactor.f=Dw/Dw/origin_width 
EndIf

; ouverture de la fenetre et de l'ecran ( taille d'origine  * zoomfactor )

main=OpenWindow(0, 0, 0, dw,dh, "",#PB_Window_BorderLess|#PB_Window_ScreenCentered)    
OpenWindowedScreen(WindowID(0), 0, 0, origin_width*zoomfactor, origin_height*zoomfactor)

;-----------------creations de tuiles pour l'exemmple -------------------------
; tu peux utiliser des tuiles de ton rpg pour voir le resultat 
Dim tiles(11)
StartDrawing(ScreenOutput())
For z=1 To 10
  Box(0,0,16,16,z*$110000)
  tiles(z)=GrabDrawingImage(#PB_Any,0,0,16,16)
Next
StopDrawing()
;calcul la taille des tiles zoomée pour reduire le nombre de calculs dans l'affichage
tilezoomedx=Round(16*zoomfactor,#PB_Round_Up)
tilezoomedy=Round(16*zoomfactor,#PB_Round_Up)
; demo 
Repeat
  
  ev=WaitWindowEvent(0)
  ClearScreen(RGB(0,0,0))
  
  StartDrawing(ScreenOutput())
  
  RandomSeed(0) ; pour avoir toujours les memes tuiles affichées dans le meme ordre
  
  ; on affiche les tuiles aux coordonées multipliées par le zoomfactor & taille agrandies par ce meme facteur
  ; coordones arondies au superieur pour eviter les defaut d'affichage
  
  For x=0 To 51
    For y = 0 To 29
      DrawImage(ImageID(tiles(Random(10,1))),Round(x*zoomfactor*16,#PB_Round_Up),Round(y*zoomfactor*16,#PB_Round_Up),tilezoomedx,tilezoomedy)
    Next
  Next
  RandomSeed(0) ; pour avoir toujours les memes tuiles affichées dans le meme ordre  
  
  ;on affiche les tuiles a leur taille d'origine é coordonés d'origine pour bien montrer les tuiles d'origine
  For x=0 To 51
    For y = 0 To 29
      If til>10:til=1:EndIf
      DrawImage(ImageID(tiles(Random(10,1))),x*16,y*16,16,16)
    Next
  Next
  
  StopDrawing()
  ; affichage
  FlipBuffers()
  
Until ev=#PB_Event_CloseWindow


Dernière modification par case le dim. 07/déc./2025 0:19, modifié 2 fois.
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9553
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HELP pour gerer la definition & affichage

Message par Ar-S »

J'allais parler de prorata mais la réponse de case est surement plus aboutie que la mienne :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
drfloyd
Messages : 226
Inscription : mar. 21/août/2007 13:30
Contact :

Re: HELP pour gerer la definition & affichage

Message par drfloyd »

Bordel, la galère, je me demande si le jeu en vaut la chandelle....
drfloyd
Messages : 226
Inscription : mar. 21/août/2007 13:30
Contact :

Re: HELP pour gerer la definition & affichage

Message par drfloyd »

il n'a pas moyen de passer en mode reel full screen 190x1080 :

Code : Tout sélectionner

OpenScreen(1920,1080,32,"COSMOS",#PB_Screen_SmartSynchronization)
Deja pour un jeu OPENSCREEN c'est mieux non ???

Et transformer mon jeu en 960*540 (divisé par 2 en largeur et hauteur)

et ensuite avant chaque FlipBuffers() prendre l'image 960*540 et la doubler à Hx2 et Lx2 à l'affichage ? Pour une illusion de basse definition, sans pixel deformés.

Ou alors c'est peut etre aussi possible en mode windows avec
OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 960, 540, 1, 0, 0)

si c'est une bonne idée, comment je fais pour doubler la taille de l'image juste avant le flipbuffer ?
Avatar de l’utilisateur
case
Messages : 1554
Inscription : lun. 10/sept./2007 11:13

Re: HELP pour gerer la definition & affichage

Message par case »

pour la chandelle seul toi a la réponse ^^
ImageImage
Avatar de l’utilisateur
case
Messages : 1554
Inscription : lun. 10/sept./2007 11:13

Re: HELP pour gerer la definition & affichage

Message par case »

et ensuite avant chaque FlipBuffers() prendre l'image 960*540 et la doubler à Hx2 et Lx2 à l'affichage ? Pour une illusion de basse definition, sans pixel deformés.
tu as deja la réponse dans ta question, j'ai modifié mon exemple pour ca , cela fonctionne même pour d’autres résolutions, cela prendra le multiplicateur entier le plus proche par exmeple pour les ecrans 4K ou autres. a noter que tu ne peux recuperer l'ecran qu'avec un grabdrawingimage() qui doit obligatoirement etre entre un startdrawing() stopdrawing() ce qui veux dire que si tu affiche des sprites apres des images tu vas devoir repasser en startdrawing() stop drawing() ce n'est pas optimal d'apres la doc.

Code : Tout sélectionner

; fenetre windows fullscreen 
ExamineDesktops()
InitSprite()
;dimensions d'origine de la fenetre 
origin_width.f=816   
origin_height=464
;dimensions du bureau
dw=DesktopWidth(0)
dh=DesktopHeight(0)
; calcul du multiplicateur d'affichage
; on divise la taille du bureau par la taille de l'affichage d'origine
; on prend le plus petit des deux comme valeur de multiplicateur
; pour eviter que les coordones agrandies depassent des coordonées du bureau
;
; utilise un nombre entier le plus proche de la resolution de l'ecran 
If Dw/origin_width > Dh/origin_height
  zoomfactor=Int(Dh/origin_height)
Else
  zoomfactor=Int(Dw/origin_width)
EndIf

; ouverture de la fenetre et de l'ecran ( taille d'origine  * zoomfactor )

main=OpenWindow(0, 0, 0, dw,dh, "",#PB_Window_BorderLess|#PB_Window_ScreenCentered)    
OpenWindowedScreen(WindowID(0), 0, 0, dw,dh)

;-----------------creations de tuiles pour l'exemmple -------------------------
; tu peux utiliser des tuiles de ton rpg pour voir le resultat 
Dim tiles(11)
StartDrawing(ScreenOutput())
For z=1 To 10
  Box(0,0,16,16,z*$110000)
  tiles(z)=GrabDrawingImage(#PB_Any,0,0,16,16)
Next
StopDrawing()
; demo 
Repeat
  
  ev=WaitWindowEvent(0)
  
  ClearScreen(RGB(0,0,0))
  
  StartDrawing(ScreenOutput())
  ;on affiche les tuiles a leur taille d'origine é coordonés d'origine pour bien montrer les tuiles d'origine
  For x=0 To 51
    For y = 0 To 29
      If til>10:til=1:EndIf
      DrawImage(ImageID(tiles(Random(10,1))),x*16,y*16,16,16)
    Next
  Next
   If IsImage(display): FreeImage(display) : EndIf
   display=GrabDrawingImage(#PB_Any,0,0,origin_width,origin_height); copie l'ecran dans une image
   DrawImage(ImageID(display),0,0,origin_width*zoomfactor,origin_height*zoomfactor) ;affiche l'image en l'agrandissant de zoomfactor
  StopDrawing()
  ; affichage
  FlipBuffers()
  
Until ev=#PB_Event_CloseWindow


ImageImage
Avatar de l’utilisateur
case
Messages : 1554
Inscription : lun. 10/sept./2007 11:13

Re: HELP pour gerer la definition & affichage

Message par case »

meme chose en utilisant un sprite. en dehors d'un startdrawing() / stopdrawing() du coup

Code : Tout sélectionner

; fenetre windows fullscreen 
ExamineDesktops()
InitSprite()
;dimensions d'origine de la fenetre 
origin_width.f=816   
origin_height=464
;dimensions du bureau
dw=DesktopWidth(0)
dh=DesktopHeight(0)
; calcul du multiplicateur d'affichage
; on divise la taille du bureau par la taille de l'affichage d'origine
; on prend le plus petit des deux comme valeur de multiplicateur
; pour eviter que les coordones agrandies depassent des coordonées du bureau
;
; utilise un nombre entier le plus proche de la resolution de l'ecran 
If Dw/origin_width > Dh/origin_height
  zoomfactor=Int(Dh/origin_height)
Else
  zoomfactor=Int(Dw/origin_width)
EndIf

; ouverture de la fenetre et de l'ecran ( taille d'origine  * zoomfactor )

main=OpenWindow(0, 0, 0, dw,dh, "",#PB_Window_BorderLess|#PB_Window_ScreenCentered)    
OpenWindowedScreen(WindowID(0), 0, 0, dw,dh)

;-----------------creations de tuiles pour l'exemmple -------------------------
; tu peux utiliser des tuiles de ton rpg pour voir le resultat 
Dim tiles(11)
StartDrawing(ScreenOutput())
For z=1 To 10
  Box(0,0,16,16,z*$110000)
  tiles(z)=GrabDrawingImage(#PB_Any,0,0,16,16)
Next
StopDrawing()
; demo 
Repeat
  
  ev=WaitWindowEvent(0)
  
  ClearScreen(RGB(0,0,0))
  
  StartDrawing(ScreenOutput())
  ;on affiche les tuiles a leur taille d'origine é coordonés d'origine pour bien montrer les tuiles d'origine
  For x=0 To 51
    For y = 0 To 29
      If til>10:til=1:EndIf
      DrawImage(ImageID(tiles(Random(10,1))),x*16,y*16,16,16)
    Next
  Next
  StopDrawing()
  ; affichage
  
     If IsSprite(display): FreeSprite(display) : EndIf
     display=GrabSprite(#PB_Any,0,0,origin_width,origin_height); copie l'ecran dans une image
     ZoomSprite(display,origin_width*zoomfactor,origin_height*zoomfactor)
   DisplaySprite(display,0,0)

  
  
  
  
  FlipBuffers()
  
Until ev=#PB_Event_CloseWindow
ImageImage
drfloyd
Messages : 226
Inscription : mar. 21/août/2007 13:30
Contact :

Re: HELP pour gerer la definition & affichage

Message par drfloyd »

Bon, je vais essayer en m'inspirant de tes exemples

merci beaucoup
drfloyd
Messages : 226
Inscription : mar. 21/août/2007 13:30
Contact :

Re: HELP pour gerer la definition & affichage

Message par drfloyd »

Alors ca marche avec l'option sprite zoomé :

Code : Tout sélectionner

; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  INIT ECRAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; fenetre windows fullscreen 
;dimensions d'origine de la fenetre 
origin_width.f=816   
origin_height=464
;dimensions du bureau
dw=DesktopWidth(0)
dh=DesktopHeight(0)
; calcul du multiplicateur d'affichage
; on divise la taille du bureau par la taille de l'affichage d'origine
; on prend le plus petit des deux comme valeur de multiplicateur
; pour eviter que les coordones agrandies depassent des coordonées du bureau
;
; utilise un nombre entier le plus proche de la resolution de l'ecran 
If Dw/origin_width > Dh/origin_height
  zoomfactor=Int(Dh/origin_height)
Else
  zoomfactor=Int(Dw/origin_width)
EndIf
et dans le jeu :

Code : Tout sélectionner

 If IsSprite(99999): FreeSprite(99999) : EndIf
 GrabSprite(99999,0,0,origin_width,origin_height); copie l'ecran dans une image
 ZoomSprite(99999,origin_width*zoomfactor,origin_height*zoomfactor)
 DisplaySprite(99999,0,0)
 FlipBuffers()
Mais il se produit un drole de truc :
le programme met genre 20 sec a se lancer, au lieu de 5 sec avant.... Je ne comprends pas pourquoi, y a rien de special en rab...
je pense que c'est le decoupage des tiles qui suit l'init (je decoupe genre 10 000 tiles !)

Code : Tout sélectionner

ClearScreen(RGB(0,0,0))
CatchSprite(20000,?sprite20000,#PB_Sprite_PixelCollision) ; le charge le fichier PNG
DisplayTransparentSprite (20000,0,0,255)
; /////////// DECOUPE ECRAN 1 (je decoupe des tas d'ecrans qui font 800 pixels de large
xx=-16:yy=0
sp=0
For j=1 To 22
  For i=1 To 50
    xx+16
    sp+1
    GrabSprite(sp,xx,yy,16,16)
  Next
  xx=-16:yy+16
Next
Du coup la decoupe est plus lent j'imagine ????? C'est la seule explication que j'ai ????

-----

Ensuite, est il possible de centrer l'image ??? car du coup elle est placée en haut à gauche

je suppose que l'ideal est de transformer mon jeu en 960*540 ???? qui est ratio standard /2 de 1920 x 1080....
Avatar de l’utilisateur
case
Messages : 1554
Inscription : lun. 10/sept./2007 11:13

Re: HELP pour gerer la definition & affichage

Message par case »

pour centrer ton image il suffit de modifier les coordones de l'affichage du sprite zoomé.

tu divise la taille de l'ecran en 2 horizontalement et verticalement ce qui donne les coordones du centre de l'ecran.
puis tu soustrait la moitié de la taille du sprite d'affichage .
voici quelques modifications que tu peux apporter
le premier code juste apres le calcul de zoomfactor

Code : Tout sélectionner

; calcul de la aille du sprite
; et des coordones d'affichage du sprite zoomecran pour centrer l'affichage.
taillesprite_w=origin_width*zoomfactor
taillesprite_h=origin_height*zoomfactor
affichagezoom_x=dw/2 -taillesprite_w/2 
affichagezoom_y=dh/2 - taillesprite_h/2

ensuite l'affichage de ton sprite ce qui enlève aussi les calculs a chaque boucle d'affichage etant donner qu'une fois que tu as toutes les infos
c'est pas une grosse optimisation, mais c'est toujours ca de pris ^^

Code : Tout sélectionner

ZoomSprite(99999,taillesprite_w,taillesprite_h)
DisplaySprite(99999,affichagezoom_x,affichagezoom_y)
ImageImage
Répondre