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
http://perso.wanadoo.fr/marcus.zone/images/poker.bmp
merci de commenter vos tests
