Definir Syncro plien ecran sans SetRefreshRate() +multitache

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Marcus
Messages : 187
Inscription : jeu. 22/janv./2004 19:08
Contact :

Definir Syncro plien ecran sans SetRefreshRate() +multitache

Message par Marcus »

Vous avez surement remarqué que SetRefreshRate() ne fonctionne pas avec certaine carte graphique .
Voici commen définir la syncronisation d'un plien ecran sans utiliser Setrefreshrate() et Multitache ; avec retours sous windows sans modifier les parametres écran du bureau (tailles,syncro).

Ce code Utilise la lib SpriteEx :
http://www.purearea.net/pb/download/use ... riteEx.zip

Code : Tout sélectionner

; -- Substitut au SetRefreshRate() avec Multitache plien ceran --- 
; -- Marcus.Zone 26.08.2004 
; -- lib spriteEx obligatoire 

InitSprite()
Declare sync_jeu()
Declare rsync_jeu() 
Declare sync_bureau()
sync_jeu()
; --------------------Code du jeu sans SetRefreshRate() ----------------------------- 
; -------------------ne pas reutiliser InitSprite() déja lancé ---------------------- 

InitSprite3D(): InitKeyboard() : InitMouse()  
Global yy.f ,p.f ,relire.b,multitache.b,rrelire.b 
yy=0 :p = 2: relire=1:multitache=1 :rrelire=0
#X_jeu=640:#Y_jeu=480:#Sync_jeu=60 ; Choix resolution du jeu
Declare Charger_sprites()
OpenScreen(#X_jeu, #Y_jeu, 16, "Test") 
Charger_sprites()
; boucle du jeu
While Quit = 0  
  ExamineKeyboard() 
  FlipBuffers() 
  multitache = IsScreenActive() 
  If multitache = 1 And ScreenDeActivated = #False  ; on est dans le boucle du jeu  
    If relire =0 :rsync_jeu():FlipBuffers():Charger_sprites(): relire =1 : EndIf ; si retour du bureau , remet la syncro du jeu et recharges les graphs 
    ClearScreen(0, 80, 0) 
    If Start3D() 
      yy + p 
      If yy > 359 : p=-2 : EndIf 
      If yy < 0 : p=2 : EndIf
      RotateSprite3D(1, yy, 0) 
      DisplaySprite3D (1, 80, 75, 255) 
      Stop3D() 
    EndIf  
    DisplaySprite(1,400,yy) 
    StartDrawing(ScreenOutput()) 
    DrawingMode(1) 
    FrontColor(0,255,0) 
    Locate(110,240) 
    DrawText("Sprite3D") 
    Locate(430,240) 
    DrawText("Sprite2D") 
    FrontColor(0,0,255) 
    Locate(10,10) 
    DrawText("Test multitache plien écran ")
    Locate(10,30) 
    DrawText("Choix de la Syncronisation du plien ecran sans SetRefreshRate()") 
    Locate(10,400) 
    FrontColor(255,255,0) 
    DrawText("ALT+TAB pour retour windows ") 
    Locate (10,440) 
    DrawText("puis Click sur 'Test' dans la barre des tache pour revenir ici !") 
    Locate(10,300) 
    FrontColor(255,0,0) 
    DrawText("Ecran bureau en : "+ Str(xxx)+" X " +Str(yyy)+ " @ " + Str(MonitorFreq) + " Hz" ) 
    Locate(10,350)
    DrawText("Ecran Jeu en : "+Str(#X_jeu)+" X " +Str(#Y_jeu)+" @ "+Str(GetMonitorFreq())+" Hz")
    FrontColor(0,255,255) 
    Locate(500,450) 
    DrawText("Marcus.Zone 2004") 
    StopDrawing() 
    
  ElseIf multitache = 1  And ScreenDeActivated = #True ; on revient au jeu depuis le bureau 
    ScreenDeActivated = #False 
    relire =0 
    rrelire=1
  Else 
    If MonitorFreq <> GetMonitorFreq() ; on est passé au bureau
      sync_bureau()  
    EndIf
    rrelire=1
    ScreenDeActivated = #True 
    Delay(10 ) 
  EndIf    
  
  If KeyboardPushed(#PB_Key_Escape) : Quit = 1 : EndIf 
Wend 

sync_bureau()
End
; --------------------------------------------------------------------------------
Procedure Charger_sprites() 
  LoadSprite(1,"poker.bmp", #PB_Sprite_Texture) 
  CreateSprite3D(1, 1) 
  Sprite3DQuality(1) 
EndProcedure

Procedure sync_jeu() ; Analyse l'ecran du bureau et applique la syncro du jeu
  Global MonitorFreq,xxx,yyy
  xxx=GetSystemMetrics_(0) 
  yyy=GetSystemMetrics_(1) 
  OpenWindow(1,0,0,0,0,#PB_Window_ScreenCentered,"") 
  MonitorFreq=GetMonitorFreq() 
  CloseWindow(1) 
  ss.DEVMODE 
  ss\dmPelsWidth   = xxx 
  ss\dmPelsHeight   = yyy 
  ss\dmSize = SizeOf(DEVMODE) 
  ss\dmDisplayFrequency = #Sync_jeu ; la frequence choisie 
  ss\DmFields = $400000 
  ChangeDisplaySettings_(ss, 1)
EndProcedure

Procedure sync_bureau() ; Reapplique la taille et synco de l'ecran du bureau
ss.DEVMODE 
ss\dmPelsWidth   = xxx 
ss\dmPelsHeight   = yyy 
ss\dmSize = SizeOf(DEVMODE) 
ss\dmDisplayFrequency = MonitorFreq 
ss\DmFields = $400000 
ChangeDisplaySettings_(ss, 1) 
EndProcedure

Procedure rsync_jeu() ; Reapplique la Syncro d'ecran du jeu
#DM_DISPLAYFREQUENCY = $400000
frequence =#Sync_jeu ; la frequence choisie 
ss.DEVMODE
ss\dmSize = SizeOf(DEVMODE)
ss\dmDisplayFrequency = frequence
ss\DmFields = #DM_DISPLAYFREQUENCY
ChangeDisplaySettings_(ss, 1)
EndProcedure
Sprite a utiliser avec le code:
http://perso.wanadoo.fr/marcus.zone/images/poker.bmp

merci de commenter vos tests :wink:
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

win 2000 sp4 + geforce4 ti 4200

compilé en exe

alt+tab ok
clic sur icone dans barre des tâches = retour au "jeu"
alt + tab + alt enfoncé = jeu fenêtré / écran noir + plus de souris , retour au jeu impossible... fin par gestionnaire de tâche

si 2 instance du jeu en m^me temps, perte de la texture dans une des 2 instance...

patrick88
Marcus
Messages : 187
Inscription : jeu. 22/janv./2004 19:08
Contact :

Message par Marcus »

merci Patrick88 ,
j'ai aussi 2K+ti4200 et j'ai les m^m resultat que toi .
on peut apeller la barre des tache avec ctrl+echap au lieu que quitter avec le gestionnaire de tâche .
ce probleme de alt enfoncé n'est pas sur xp .

lancer le jeu plusieur fois en m^m temps buge les graphs effectivement !
mais bon avec un seul mon procedé marche :wink:

vivement que Fred s'occupe des ces 2bugs majeurs du Pure
Répondre