HRESULT EnumDisplayModes(DWORD flags, LPDDSURFACEDESC desc, LPVOID callbackdata, LPDDENUMMODESCALLBACK callback);
ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ EnumDisplayModes() ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΠ»Π°Π³ΠΎΠ² Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ. ΠΡΠΎΡΠΎΠΉ β ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Π½Π° ΡΡΡΡΠΊΡΡΡΡ DDSURFACEDESC Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ². Π’ΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ Π½Π΅ΠΉ, Π° ΡΠ΅ΡΠ²Π΅ΡΡΡΠΉ β ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Π½Π° ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ. Π Π³Π»Π°Π²Π΅ 3 Π²ΡΠ·ΠΎΠ² EnumDisplayModes() Π²ΡΠ³Π»ΡΠ΄Π΅Π» ΡΠ°ΠΊ:
ddraw->EnumDisplayModes(0, 0, this, DisplayModeAvailable);
ΠΠ΅ΡΠ²ΡΠΉ ΠΈ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ°Π²Π½Ρ Π½ΡΠ»Ρ; ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΡ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ΠΈ ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ². ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ»Π°Π³ΠΈ (ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ) Π½Π΅ ΡΠΊΠ°Π·Π°Π½Ρ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·. ΠΡΠ»ΠΈ Π±Ρ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅ Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½ ΡΠ»Π°Π³ DDEDM_REFRESHRATES, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ Π²ΠΎΡΠ΅Π» Π±Ρ Π² ΡΠΏΠΈΡΠΎΠΊ ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ°ΡΡΠΎΡ ΡΠΌΠ΅Π½Ρ ΠΊΠ°Π΄ΡΠΎΠ² Π² Π½Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ. Π’Π°ΠΊΠ°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π½ΠΈΠΆΠ΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΡΡΠΎΡΠ°ΠΌΠΈ ΡΠΌΠ΅Π½Ρ ΠΊΠ°Π΄ΡΠΎΠ² Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ SuperSwitch.
Π€ΡΠ½ΠΊΡΠΈΡ ActivateDisplayMode()ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² Π½Π°ΡΠ°Π»Π΅ Π³Π»Π°Π²Ρ, ΡΠΌΠ΅Π½Π° Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ° Π½Π΅ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ SetDisplayMode(). Π€ΡΠ½ΠΊΡΠΈΡ SetDisplayMode() Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅Ρ Π½ΡΠΆΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ½ΠΈΡΡΠΎΠΆΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΡ Π·Π°Π½ΠΎΠ²ΠΎ. ΠΠ»Π°ΡΡ DirectDrawWin ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ Π·Π°Π΄Π°ΡΡ Π·Π° Π²Π°Ρ. Π Π½Π΅Π³ΠΎ Π²Ρ ΠΎΠ΄ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ ActivateDisplayMode(), Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ°Ρ Π²ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ° ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ½ΠΎΠ²Π° ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ ActivateDisplayMode() (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 4.1).
ΠΠΈΡΡΠΈΠ½Π³ 4.1. Π€ΡΠ½ΠΊΡΠΈΡ DirectDrawWin::ActivateDisplayMode()
BOOL DirectDrawWin::ActivateDisplayMode(int mode) {
if (mode<0 || mode>=totaldisplaymodes) return FALSE;
DWORD width = displaymode[mode].width;
DWORD height = displaymode[mode].height;
DWORD depth = displaymode[mode].depth;
displayrect.left=0;
displayrect.top=0;
displayrect.right=width;
displayrect.bottom=height;
displaydepth=depth;
ddraw2->SetDisplayMode(width, height, depth, rate, 0);
curdisplaymode = mode;
TRACE("------------------- %dx%dx%d (%dhz) ---------------\n", width, height, depth, rate);
if (CreateFlippingSurfaces()==FALSE) {
FatalError("CreateFlippingSurfaces() failed");
return FALSE;
}
StorePixelFormatData();
if (CreateCustomSurfaces()==FALSE) {
FatalError("CreateCustomSurfaces() failed");
return FALSE;
}
return TRUE;
}
Π€ΡΠ½ΠΊΡΠΈΡ ActivateDisplayMode() ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ². Π‘Π½Π°ΡΠ°Π»Π° ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ. ΠΡΠ»ΠΈ ΠΎΠ½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° displaymode, Π²ΡΡΠΎΡΠ°, ΡΠΈΡΠΈΠ½Π° ΠΈ Π³Π»ΡΠ±ΠΈΠ½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡΡΡ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ displayrect ΠΈ displaydepth. ΠΠ°ΡΠ΅ΠΌ Π°ΡΡΠΈΠ±ΡΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ SetDisplayMode(), Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΡΡΠ΅ΠΉ Π½ΠΎΠ²ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ.
ΠΠ°Π»Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΡ CreateFlipingSurfaces() ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΡΠΎ Π²ΡΠΎΡΠΈΡΠ½ΡΠΌ Π±ΡΡΠ΅ΡΠΎΠΌ, Π° ΡΡΠ½ΠΊΡΠΈΡ StorePixelFormatData() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π½Π΅ ΡΡΡΠ°ΡΠ΅Π» Π»ΠΈ ΡΠΎΡΠΌΠ°Ρ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ DirectDrawWin (ΡΠΎΡΠΌΠ°ΡΡ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π² Π³Π»Π°Π²Π΅ 5). ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces(), ΠΎΡΠ²Π΅ΡΠ°ΡΡΡΡ Π·Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ°ΠΊ, ΡΡΠ½ΠΊΡΠΈΡ ActivateDisplayMode() Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ². Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π±ΡΠ΄ΡΡ Π»ΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ SetDisplayMode() ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π΅Π΅ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° SwitchΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Switch β ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ DirectDraw, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ Π²ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ . ΠΠ° ΡΠΈΡ. 4.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ.
Π ΠΈΡ. 4.1. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Switch
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ DirectDraw AppWizard. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΡΠ»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΌΠ΅Π½Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π²ΡΠ±ΡΠ°ΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»Π°Π²ΠΈΡ ΡΠΎ ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ) ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ (ΠΊΠ»Π°Π²ΠΈΡΠ΅ΠΉ Enter). ΠΠ»Π°Π²ΠΈΡΠ° Escape Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Switch ΡΠ°ΠΊΠΆΠ΅ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ FPS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°Π΄ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ).
Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Switch ΠΌΡ Π½Π°ΡΡΠΈΠΌΡΡ:
β’ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΡ;
β’ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ΅ΠΊΡΡ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡΡ DirectDraw;
β’ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ FPS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
β’ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ²Π΅ΡΠΎΠ²ΡΠΌΠΈ ΠΊΠ»ΡΡΠ°ΠΌΠΈ.
Π‘ΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Switch, ΠΊΠ°ΠΊ ΠΈ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΡΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅, Π±ΡΠ»Π° ΡΠΎΠ·Π΄Π°Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ DirectDraw AppWizard, ΡΠ°ΠΊ ΡΡΠΎ Π΅Π΅ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π²Π°ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΡΠΎΡΠΈΡΠ°Π»ΠΈ Π³Π»Π°Π²Ρ 3. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° Π΄Π²ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ , SwitchWin ΠΈ SwitchApp, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠΎΠ² DirectDrawWin ΠΈ DirectDrawApp ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΠ»Π°ΡΡ SwitchApp ΠΎΡΡΠ°Π»ΡΡ Π² ΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ Π±ΡΠ» ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ AppWizard, ΠΈ ΠΏΠΎΡΠΎΠΌΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ.
ΠΠ»Π°ΡΡ SwitchWin ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠΈ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ: ΠΎΠ΄Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΡΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½Π΅, Π²ΡΠΎΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ², Π° ΡΡΠ΅ΡΡΡ β Π²ΡΠ²ΠΎΠ΄ FPS. ΠΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²ΡΠ²Π΅ΡΡΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΡΠ΅ΠΊΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡΠΈΡΠ°ΡΡ FPS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ²ΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ°Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π²ΡΠ²Π΅ΡΡΠΈ ΡΠ΅ΠΊΡΡ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ β ΠΏΠΎΠ»ΡΡΠΈΡΡ Ρ Windows DC (ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ GetDC() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectDrawSurface. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ²Π΅ΡΡΠΈ ΡΠ΅ΠΊΡΡ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ TextOut() ΠΈ TextOutExt() ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ DC ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ DirectDrawSurface::ReleaseDC(). ΠΡΡΠΈΠ±ΡΡΡ ΡΠ΅ΠΊΡΡΠ° (ΡΠ²Π΅Ρ, ΡΠΎΠ½ ΠΈ ΡΠΏΠΎΡΠΎΠ± Π²ΡΠ²ΠΎΠ΄Π°) Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Win32:
β’ SelectObject()
β’ SetBkMode()
β’ SetBkColor()
β’ SetTextColor()
ΠΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Switch Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ FPS.
ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ FPS
FPS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΡΠΉ ΠΈΠ· Π½ΠΈΡ β ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°Π΄ΡΠΎΠ², Π²ΡΠ²Π΅Π΄Π΅Π½Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π΅Π³ΠΎ Π½Π° Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ . ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ ΡΡΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ FPS ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ.
Π§ΡΠΎΠ±Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ FPS Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π° ΠΈ ΠΎΠ±ΡΠ΅ΠΌΠ° Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Windows Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΠΈΠ»ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π½Π° Π΄ΠΈΡΠΊ. Π ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Windows Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΡΠΊ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Windows Β«ΡΡΠΏΠΎΠΊΠΎΠΈΡΡΡΒ» ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄ΠΈΡΠΊΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ FPS.
Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Switch ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠΈΡΠ»ΡΡΡ FPS ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°. ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Switch, Π²Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΠ΅, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ FPS ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ ΡΡΠ°Π·Ρ; ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.
ΠΠ»Ρ Ρ ΡΠΎΠ½ΠΎΠΌΠ΅ΡΡΠ°ΠΆΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Win32 timeGetTime(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄, ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΡ Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π·Π°ΠΏΡΡΠΊΠ° Windows. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Switch ΡΡΠ½ΠΊΡΠΈΡ timeGetTime() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΡΡ 100 ΠΊΠ°Π΄ΡΠΎΠ²; Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ FPS ΡΠ°Π²Π½ΠΎ 100, ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΡ ΡΠ΅ΠΊΡΠ½Π΄.
Π€ΡΠ½ΠΊΡΠΈΡ timeGetTime() Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π² Windows (Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎΠ³ΠΎ Ρ ΡΠΎΠ½ΠΎΠΌΠ΅ΡΡΠ°ΠΆΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ QueryPerformanceCounter()). ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π»ΠΈ ΠΎΡΠ΅Π½Ρ ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΠΏΠ΅ΡΠΈΠΎΠ΄Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ ΠΏΠΎ 10 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄), ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ timeGetTime() Π½Π΅ Π΄Π°Π²Π°Π»Π° Π±Ρ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅ ΡΠ°ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΈ timeGetTime().
ΠΠ»Π°ΡΡ SwitchWinΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Switch. ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° SwitchWin (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 4.2).
ΠΠΈΡΡΠΈΠ½Π³ 4.2. ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° SwitchWin
class SwitchWin : public DirectDrawWin {
public:
SwitchWin();
protected:
//{{AFX_MSG(SwitchWin)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int SelectDriver();
int SelectInitialDisplayMode();
BOOL CreateCustomSurfaces();
void DrawScene();
void RestoreSurfaces();
BOOL CreateMenuSurface();
BOOL UpdateMenuSurface();
BOOL CreateFPSSurface();
BOOL UpdateFPSSurface();
private:
LPDIRECTDRAWSURFACE bmpsurf;
int x, y;
int xinc, yinc;
LPDIRECTDRAWSURFACE menusurf;
int selectmode;
LPDIRECTDRAWSURFACE fpssurf;