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

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

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

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ восСмь Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ OnKeyDown(), ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ повСрхности Π²ΠΎ врСмя ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ:

β€’ Up()

β€’ Down()

β€’ Left()

β€’ Right()

β€’ Home()

β€’ End()

β€’ PageUp()

β€’ PageDown()

КаТдая ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ опрСдСляСт ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ повСрхности ΠΏΠΎ значСниям ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… x, y, xlimit, ylimit, xscroll ΠΈ yscroll. Код всСх восьми Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 5.9.


Листинг 5.9. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ смСщСния повСрхности

void BmpViewWin::Up(int inc) {

 if (!yscroll) return;

 if (y+inc<0) {

  y+=inc;

  update_screen=TRUE;

 } else {

  y=0;

  update_screen=TRUE;

 }

}


void BmpViewWin::Down(int inc) {

 if (!yscroll) return;

 if (y-inc>=ylimit) {

  y-=inc;

  update_screen=TRUE;

 } else {

  y=ylimit;

  update_screen=TRUE;

 }

}


void BmpViewWin::Left(int inc) {

 if (!xscroll)  return;

 if (x+inc<0) {

  x+=inc;

  update_screen=TRUE;

 } else {

  x=0;

  update_screen=TRUE;

 }

}


void BmpViewWin::Right(int inc) {

 if (!xscroll) return;

 if (x-inc>=xlimit) {

  x-=inc;

  update_screen=TRUE;

 } else {

  x=xlimit;

  update_screen=TRUE;

 }

}


void BmpViewWin::Home() {

 if (xscroll && x!=0) {

  x=0;

  update_screen=TRUE;

 }

 if (yscroll && y!=0) {

  y=0;

  update_screen=TRUE;

 }

}


void BmpViewWin::End() {

 if (yscroll) {

  y=-(bmprect.Height()-displayrect.Height());

  update_screen=TRUE;

 }

 if (xscroll) {

  x=-(bmprect.Width()-displayrect.Width());

  update_screen=TRUE;

 }

}


void BmpViewWin::PageUp() {

 if (yscroll) {

  if (y-displayrect.Height()>0)   {

   y-=displayrect.Height();

   update_screen=TRUE;

  } else {

   y=0;

   update_screen=TRUE;

  }

 }

}


void BmpViewWin::PageDown() {

 if (yscroll) {

  if (y+displayrect.Height()<=ylimit) {

   y+=displayrect.Height();

   update_screen=TRUE;

  } else {

   y=ylimit;

   update_screen=TRUE;

  }

 }

}

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ клавиш со стрСлками (Up(), Down(), Left(), Right()) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт шаг ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· опрСдСлСния класса BmpViewWin (см. листинг 5.5), ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ шаг ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Ρ€Π°Π²Π΅Π½ 4. 

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ 

Π’ этой Π³Π»Π°Π²Π΅ я ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Π±ΠΎΠ»Π΅Π΅ простым способом. ВспомнитС β€” Π² интСрфСйс DirectDrawSurface Π²Ρ…ΠΎΠ΄ΠΈΡ‚ функция GetDC(), которая позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с повСрхностями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Win32. Π Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

BOOL CopyBmp(LPDIRECTDRAWSURFACE surface, HBITMAP bmp, int x, int y) {

 if (bmp==0) {

  TRACE("no bmp specified\n");

  return FALSE;

 }

 if (surface==0) {

  TRACE("no surface specified\n");

  return FALSE;

 }

 HDC imageDC = CreateCompatibleDC(0);

 SelectObject(imageDC, bmp);

 BITMAP bitmap;

 GetObject(bmp, sizeof(bitmap), &bitmap);

 int w=bitmap.bmWidth;

 int h=bitmap.bnHeight;

 DDSURFACEDESC desc;

 desc.dwSize = sizeof(desc);

 desc.dwFlags = DDSD+HEIGHT |DDSC_WIDTH;

 surface->GetSurfaceDesc(&desc);

 HDC dc;

 HRESULT result;

 if ((result=surface->GetDC(&dc))==DD_OK)) {

  Stretchblt(dc, 0, 0, desc.dwWidth, desc.dwHeight, imageDC, x, y, w, h, SRCCOPY);

  surface->ReleaseDC(dc);

 }

 DeleteDC(imageDC);

 return result==DD_OK;

}

Π­Ρ‚Π° функция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ этой Π³Π»Π°Π²Ρ‹, Π΅Π΅ Π΄Π°ΠΆΠ΅ Π½Π΅Ρ‚ Π½Π° CD-ROM. Она ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° с СдинствСнной Ρ†Π΅Π»ΡŒΡŽ β€” ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetDC() интСрфСйса DirectDrawSurface ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Win32 Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ StretchBlt() ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Windows Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. РазумССтся, Π² этом случаС приходится ΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ GDI Π½Π΅ отличаСтся особым быстродСйствиСм, Π° Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

НС Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ основной Ρ‚Π΅ΠΌΡ‹ этой Π³Π»Π°Π²Ρ‹ β€” прямого доступа ΠΊ повСрхностям. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° растров Π½Π° повСрхности Π±Ρ‹Π»Π° всСго лишь ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ всС Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ повСрхностСй ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… пиксСлСй, Π²Ρ‹ смоТСтС ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ рисования Π»ΠΈΠ½ΠΈΠΉ, эффСкты растрирования (dithering) ΠΈ Π΄Π°ΠΆΠ΅ спрайты. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ².

Π’ Π³Π»Π°Π²Π΅ 6 ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ DirectInput. ΠžΠ±Ρ…ΠΎΠ΄Ρ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π²Π²ΠΎΠ΄Π° Windows, DirectInput позволяСт с максимальной ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… устройств, ΠΊΠ°ΠΊ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΈΠ»ΠΈ ΠΌΡ‹ΡˆΡŒ.

Π“Π»Π°Π²Π° 6. DirectInput

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π΄ΠΎΡ…Π½Π΅ΠΌ ΠΎΡ‚ DirectDraw ΠΈ познакомимся с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ DirectInput. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, эта ΠΊΠ½ΠΈΠ³Π° посвящСна ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅, Π½ΠΎ Π²Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ β€” нСобходимая Ρ‡Π°ΡΡ‚ΡŒ любого графичСского прилоТСния. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ DirectInput ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Π²ΠΎΠ΄ обнаруТиваСтся ΠΈ обрабатываСтся с максимальной ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. ПослС ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ знакомства с DirectInput API ΠΌΡ‹ обсудим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ схСмы получСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ DirectInput. Знакомство закончится созданиСм Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ: Qwerty ΠΈ Smear. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Qwerty ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ DirectInput для Π²Π²ΠΎΠ΄Π° с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π° Smear Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΌΡ‹ΡˆΡŒΡŽ.

Для компиляции ΠΈ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ этой Π³Π»Π°Π²Ρ‹ Π²Π°ΠΌ понадобится DirectX 3 SDK. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Windows NT 4.0 Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Service Pack 3 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ позднюю Π²Π΅Ρ€ΡΠΈΡŽ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DirectInput?


DirectInput прСдставляСт собой DirectX API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с устройствами Π²Π²ΠΎΠ΄Π° β€” ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ, ΠΌΡ‹ΡˆΡŒΡŽ, дТойстиками, рулями, Π°Π²ΠΈΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ рукоятками, шлСмами Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π΄Π°ΠΆΠ΅ устройствами с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связью. Π’ ΠΏΠΎΠ»Π½ΠΎΠΌ соотвСтствии с ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ DirectX Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DirectInput ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ высокого быстродСйствия ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ нСзависимости.

Основная Π·Π°Π΄Π°Ρ‡Π° DirectInput β€” ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ ΠΈ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ устройства с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связью; для Π½ΠΈΡ… Π² DirectInput прСдусмотрСны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π²Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ устройства

DirectInput ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ практичСски всС устройства Π²Π²ΠΎΠ΄Π°, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΊ PC. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ лишь ΠΎ Ρ‚Π΅Ρ… устройствах, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ DirectInput. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° обСспСчиваСт Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π»ΡŽΠ±Ρ‹Ρ… устройств Π²Π²ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° (скорСС всСго) смоТСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Π΅ устройства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Ρ‹.

Π― Π½Π΅ ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ всС устройства, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ DirectInput, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ для этого ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ Π±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΈΠ³Π°. Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ DirectInput рассматриваСтся ΠΊΠ°ΠΊ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ Windows для получСния Π΄Π°Π½Π½Ρ‹Ρ….

ВозмоТностСй DirectInput Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Π½Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ нСсколько ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ ΠΈ/ΠΈΠ»ΠΈ ΠΌΡ‹ΡˆΠ΅ΠΉ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, данная Ρ‚Π΅ΠΌΠ° Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой Π³Π»Π°Π²Ρ‹; ΠΌΡ‹ Π²ΠΏΠΎΠ»Π½Π΅ обойдСмся основными ΠΌΡ‹ΡˆΡŒΡŽ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ.

БыстродСйствиС

НавСрноС, вас интСрСсуСт, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ DirectInput обгоняСт Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Windows. DirectInput ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ приходится Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ для устройств, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Win32 API, Π½ΠΎ Π·Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡ‹ΡˆΡŒΡŽ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ?

DirectInput, ΠΊΠ°ΠΊ ΠΈ DirectDraw, ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Windows ΠΈ обСспСчиваСт прямой доступ ΠΊ устройствам, Π½Π΅ утрачивая Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ нСзависимости. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Windows Π² этой схСмС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, установлСнныС Π² систСмС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ устройств Π²Π²ΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, частота ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π° символов для ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈΠ»ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΡ‹ΡˆΠΈ) Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° DirectInput.

Π‘Ρ…Π΅ΠΌΡ‹ получСния Π΄Π°Π½Π½Ρ‹Ρ…

Π’ зависимости ΠΎΡ‚ потрСбностСй вашСго прилоТСния DirectInput ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для получСния Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ²: нСпосрСдствСнных (immediate) ΠΈ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… (buffered). НСпосрСдствСнныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ состояниС устройства Π²Π²ΠΎΠ΄Π° Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ запроса Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для описания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² состоянии устройства (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ клавиш ΠΈΠ»ΠΈ осСвых смСщСний).

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСпосрСдствСнных Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π°ΠΆΠ°Ρ‚Π° Π»ΠΈ нСкоторая клавиша Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Для ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ нСпосрСдствСнных Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Win32 GetAsyncKeyState(). НСпосрСдствСнныС Π΄Π°Π½Π½Ρ‹Π΅ Π»ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€ΠΈ частом опросС устройства Π²Π²ΠΎΠ΄Π° (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ Ρ€Π΅ΠΆΠ΅ 30 Ρ€Π°Π· Π² сСкунду). Π Π΅Π΄ΠΊΠΈΠΉ опрос ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ…; Ссли Π·Π° врСмя нахоТдСния клавиши Π² Π½Π°ΠΆΠ°Ρ‚ΠΎΠΌ состоянии ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° Π½Π΅ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»Π°ΡΡŒ, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π²Π²ΠΎΠ΄Π°.