collide=FALSE;
}
x+=xinc;
y+=yinc;
if (x>640-w/2) {
xinc=-xinc;
x=640-w/2;
}
if (x<-(w/2)) {
xinc=-xinc;
x=-(w/2);
}
if (y>480-h/2) {
yinc=-yinc;
y=480-h/2;
}
if (y<-(h/2)) {
yinc=-yinc;
y=-(h/2);
}
}
Π‘Π½Π°ΡΠ°Π»Π° Update() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ collide. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°Π²Π½Π° TRUE, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄Π²ΡΡ ΡΠΏΡΠ°ΠΉΡΠΎΠ² (ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ²ΡΠ΅Π³ΠΎΡΡ Ρ Π½ΠΈΠΌ) ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΡ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ°Π΅ΠΊΡΠΎΡΠΈΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΏΡΠ°ΠΉΡΠ°. ΠΡΠΈ ΡΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡ Π΅ΠΌΠ°, ΠΎΡΠ΅Π½Ρ Π΄Π°Π»Π΅ΠΊΠ°Ρ ΠΎΡ Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ β ΠΏΡΠΈ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΏΡΠ°ΠΉΡ ΠΎΡΠ»Π΅ΡΠ°Π΅Ρ Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΄Π°ΡΠ°.
ΠΠ°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ x ΠΈ y ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ Ρ ΡΡΠ΅ΡΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ xinc ΠΈ yinc. ΠΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠ°ΠΉΡΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠ΅ΡΡΡ. ΠΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΏΡΠ°ΠΉΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π°ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ ΡΡ ΠΎΠ΄ΠΈΡ Π·Π° ΠΊΡΠ°ΠΉ ΡΠΊΡΠ°Π½Π°.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΡΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° Sprite: ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΏΡΠ°ΠΉΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΈΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅. ΠΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΏΡΠ°ΠΉΡΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΡΠ΅Π°ΠΊΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ . Π§ΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΡΠΊΡΡΡ CollideInfo ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠΏΡΠ°ΠΉΡΠ΅, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Hit(). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ°Π΅ΠΊΡΠΎΡΠΈΠΈ ΠΊΡΡΡΠ° Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΏΡΠ°ΠΉΡΠ°, ΡΡΠ°ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π² ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΉ ΡΡΠ°ΡΡΠ²ΡΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π° ΡΠΏΡΠ°ΠΉΡΠ°.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Bumper
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΌΡ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Bumper Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ Π²ΠΎΡΡΠΌΠΈ ΡΠΏΡΠ°ΠΉΡΠΎΠ². ΠΠ°ΠΊ Ρ ΡΠΏΠΎΠΌΠΈΠ½Π°Π», ΠΏΡΠΈ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΠΏΡΠ°ΠΉΡΡ ΡΠ°Π·Π»Π΅ΡΠ°ΡΡΡΡ Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ . ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Bumper ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° ΡΠΈΡ. 9.4.
Π ΠΈΡ. 9.4. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Bumper
ΠΠΎΡΠ΅ΠΌΡ ΡΠΏΡΠ°ΠΉΡΠΎΠ², ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π½Π° ΡΠΈΡΡΠ½ΠΊΠ΅, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΠ΅ΡΡΡΡΠΌΡ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡΠΌΠΈ β ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π²Π° ΡΠΏΡΠ°ΠΉΡΠ°. ΠΡΡ ΠΎΠ΄Π½ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ ΡΠΏΡΠ°ΠΉΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. Π Π½Π°ΡΠ°Π»Π΅ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Β«ΡΠ°ΡΠΊΡΡΡΠΈΠ²Π°Π΅ΡΒ» Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π», ΡΡΠΎΠ±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΅Π΅ ΡΠ°Π±ΠΎΡΡ Π½Π΅ Π±ΡΠ»ΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ. ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΠΏΡΠΎΠ±Π΅Π»Π° Π²Π΅ΠΊΡΠΎΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ. ΠΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Bumper ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π·Π΄Π΅Π»Π°Ρ .
ΠΠ»Π°ΡΡ BumperWinΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Bumper, ΠΊΠ°ΠΊ ΠΈ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΡΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅, ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° DirectDrawWin. ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΎΡ Π½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡ BumperWin ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊ:
class BumperWin : public DirectDrawWin {
public:
BumperWin();
protected:
//{{AFX_MSG(BumperWin)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnDestroy();
//}}
AFX_MSG DECLARE_MESSAGE_MAP()
private:
int SelectDriver();
int SelectInitialDisplayMode();
BOOL CreateCustomSurfaces();
void DrawScene();
void RestoreSurfaces();
BOOL SpritesCollide(Sprite* s1, Sprite* s2);
BOOL SpritesCollideRect(Sprite* s1, Sprite* s2);
BOOL SpritesCollidePixel(Sprite* s1, Sprite* s2);
private:
Sprite* sprite[MAX_SPRITES];
int nsprites;
LPDIRECTDRAWSURFACE text;
};
Π Π½Π΅ΠΌ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ Π΄Π²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π€ΡΠ½ΠΊΡΠΈΡ OnKeyDown() ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ, Π° ΡΡΠ½ΠΊΡΠΈΡ OnDestroy() ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΡΠΏΡΠ°ΠΉΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
Π€ΡΠ½ΠΊΡΠΈΠΈ SelectDriver(), SelectInitialDisplayMode(), CreateCustomSurfaces(), DrawScene() ΠΈ RestoreSurfaces() Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° DirectDrawWin. ΠΡΠΊΠΎΡΠ΅ ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π€ΡΠ½ΠΊΡΠΈΠΈ SpritesCollide(), SpritesCollideRect() ΠΈ SpritesCollidePixel() ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ Π²ΡΡΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π° ΡΡΠΎΡ ΡΠ°Π· ΠΎΠ½ΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΊΠ»Π°ΡΡΡ BumperWin. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΆΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈΡΡ, ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ ΠΈΡ ΡΠ½ΠΎΠ²Π°.
Π ΠΊΠ»Π°ΡΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ ΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅: ΠΌΠ°ΡΡΠΈΠ² ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ Sprite, ΡΠ΅Π»Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΏΡΠ°ΠΉΡΠΎΠ² ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ text Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ DirectDrawSurface. ΠΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΏΡΠ°ΠΉΡΠΎΠ² ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ Π½ΠΈΠΌ. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ text ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠ΅Π½Ρ, Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎΡΡ Π² Π»Π΅Π²ΠΎΠΌ Π½ΠΈΠΆΠ½Π΅ΠΌ ΡΠ³Π»Ρ ΡΠΊΡΠ°Π½Π°.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Bumper ΠΏΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ SelectDriver(). Π§ΡΠΎΠ±Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ, ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² DirectDraw ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Bumper Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ. Π€ΡΠ½ΠΊΡΠΈΡ SelectDriver() Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
int BumperWin::SelectDriver() {
int numdrivers=GetNumDrivers();
if (numdrivers==1) return 0;
CArray<CString, CString> drivers;
for (int i=0;i<numdrivers;i++) {
LPSTR desc, name;
GetDriverInfo(i, 0, &desc, &name);
drivers.Add(desc);
}
DriverDialog dialog;
dialog.SetContents(&drivers);
if (dialog.DoModal()!=IDOK) return -1;
return dialog.GetSelection();
}
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»Π°ΡΡΠ° DriverDialog ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, Π²ΡΠ±ΡΠ°Π½Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. ΠΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΉ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ 8-Π±ΠΈΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠ΅ 8-Π±ΠΈΡΠ½ΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ² (ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ 3Dfx), Π² ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° Π²ΡΠ±ΠΎΡ ΡΠ°ΠΊΠΎΠ³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ SelectDriver(), Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ. Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
int BumperWin::SelectInitialDisplayMode() {
DWORD curdepth=GetDisplayDepth();
int i, nummodes=GetNumDisplayModes();
DWORD w,h,d;
if (curdepth!=desireddepth) ddraw2->SetDisplayMode(640, 480, curdepth, 0, 0);
for (i=0;i<nummodes;i++) {
GetDisplayModeDimensions(i, w, h, d);
if (w==desiredwidth && h==desiredheight && d==desireddepth) return i;
}
ddraw2->RestoreDisplayMode();
ddraw2->Release(), ddraw2=0;
AfxMessageBox("Can't find 8-bit mode on this device");
return -1;
}
Π€ΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() ΠΈΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ 640x480x8. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΠ΅ΠΆΠΈΠΌ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, ΠΎΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ β1, Π³ΠΎΠ²ΠΎΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΊΠ»Π°ΡΡΡ DirectDrawWin ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡ. ΠΡΠ»ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½, ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΅Π³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ. ΠΠΎ ΡΡΠΎΠΌΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΊΠ»Π°ΡΡ DirectDrawWin ΡΠ·Π½Π°Π΅Ρ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π½ΡΠΆΠ½ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ, ΠΊΠ»Π°ΡΡ DirectDrawWin Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces(). ΠΠ½Π° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π½Π°ΡΠΈΡ Π²ΠΎΡΡΠΌΠΈ ΡΠΏΡΠ°ΠΉΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΠΌΠ΅Π½Ρ. Π€ΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces() ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 9.3.
ΠΠΈΡΡΠΈΠ½Π³ 9.3. Π€ΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces()
BOOL BumperWin::CreateCustomSurfaces() {
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = 0;
ddck.dwColorSpaceHighValue = 0;
LPDIRECTDRAWSURFACE surf;
srand(time(0));
CString msg="Can't find ";
surf=CreateSurface("diamond.bmp", TRUE);
if (surf==0) {
msg+="diamond.bmp";
Fatal(msg);
}
surf->SetColorKey(DDCKEY_SRCBLT, &ddck);
sprite[nsprites++]=new Sprite(surf, 0, 0);
sprite[nsprites++]=new Sprite(surf, 150, 0);
surf=CreateSurface("triangle.bmp");
if (surf==0) {
msg+="triangle.bmp";
Fatal(msg);
}
surf->SetColorKey(DDCKEY_SRCBLT, &ddck);
sprite[nsprites++]=new Sprite(surf, 0, 150);
sprite[nsprites++]=new Sprite(surf, 150, 150);
surf=CreateSurface("rect.bmp");
if (surf==0) {
msg+="rect.bmp";
Fatal(msg);
}
surf->SetColorKey(DDCKEY_SRCBLT, &ddck);
sprite[nsprites++]=new Sprite(surf, 0, 300);
sprite[nsprites++]=new Sprite(surf, 150, 300);
surf=CreateSurface("oval.bmp");
if (surf==0) {
msg+="oval.bmp";
Fatal(msg);
}
surf->SetColorKey(DDCKEY_SRCBLT, &ddck);
sprite[nsprites++]=new Sprite(surf, 300, 0);
sprite[nsprites++]=new Sprite(surf, 300, 150);
text=CreateSurface("text.bmp");
if (text==0) {
msg+="text.bmp";
Fatal(msg);
}
text->SetColorKey(DDCKEY_SRCBLT, &ddck);
return TRUE;
}
Π€ΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces() Β«ΡΠ°ΡΠΊΡΡΡΠΈΠ²Π°Π΅ΡΒ» Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ time(), Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ . ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΡΠ΄ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠΈΡΠ»Π°.
ΠΠ°ΡΠ΅ΠΌ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π³ΠΎΡΠΎΠ²ΠΈΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° DDCOLORKEY. ΠΠ»Ρ Π²ΡΠ΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ½ΡΠΉ ΡΠ²Π΅Ρ (ΡΠΎ Π΅ΡΡΡ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅).
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ΅ΡΡΡΠ΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ β Π΄Π²Π° ΡΠΏΡΠ°ΠΉΡΠ°. ΠΡΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· BMP-ΡΠ°ΠΉΠ»ΠΎΠ², ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, Π½Π΅ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½, ΡΡΠ½ΠΊΡΠΈΡ Fatal() Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ SetColorKey() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectDrawSurface Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΡΡΡΡ ΡΠ²Π΅ΡΠΎΠ²ΡΠ΅ ΠΊΠ»ΡΡΠΈ.