Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° для Windows срСдствами DirectDrawΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 58

Автор Бтэн Π’Ρ€ΡƒΡ…ΠΈΠ»ΡŒΠΎ

  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 Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ.