[Direct3D] pętla komunikatów i procedura obsługi okna

0

Witam!

Pisze w DirectX.
W 3D zaczełem się niedawno bawić ale mam pomysł na fajna gre w DirectX ale jest problem otóż procedura zdarzeniowa...

Przechwytuje mi wszystkie zdarzenia klawiatura myszka i inne i nie mogę ich obsłużyć DirectInput.
Jak ktoś nie wie to pętla wygląda tak:

 
MSG msg;
while(msg.message!=WM_QUIT)
{
  if(PeekMessage(&message, 0, 0, 0, PM_NOREMOVE))
  {
    if(!GetMessage(&message, 0, 0, 0)) return message.wParam;
    TranslateMessage(&message);
    DispatchMessage(&message);
  }
  else
  {
    Render();
  }
} 

Kombinowałem robić bez procedury albo coś takiego ale wtedy windows siadł i musiałem zrobić restart kompa:

 
MSG msg;
while(msg.message!=WM_QUIT)
{
    
    Render();
} 

Jak by ktoś mógł to prosilbym o napisanie mniej więcej jak pozbyć się procedury zdarzeniowej albo aby nie reagowała na klawiaturę,myszkę!

0

W #1 ten return jest źle, przecież to ci zakończy pętlę główną (odebranie jakiegoś komunikatu).
#2 jest w ogóle bez sensu bo nie ma przetwarzania...

Zrób normalnie i nie kombinuj...

while(msg.message!=WM_QUIT)
{
  if(PeekMessage(&message, 0, 0, 0, PM_REMOVE))
  {
    TranslateMessage(&message);
    DispatchMessage(&message);
  }
  else
  {
    //wykonaj klatkę
    Render();
  }
}

A jeśli chodzi o zdarzenia wejścia to DirectInput jest obecnie niezalecany.
Już lepiej czytaj WM_KEYUP/DOWN i monitoruj na bieżąco stan klawiatury.

czyli jak masz procedurę okna, monitorujesz to tak:

obecny stan klawiatury:
bool keyboard[256]; //stany wirtualnych klawiszy: true - wciśnięty

LRESULT __stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_KEYDOWN: //naciśnięcie przycisku
    keyboard[wParam] = true;
    break;

  case WM_KEYUP: //puszczenie przycisku
    keyboard[wParam] = false;
    break;

//...

  }
  return 0;
}

//i potem w klatce możesz odczytywać stany przycisków:
if(keyboard[VK_LBUTTON] == true) MessageBox(0, "Lewy u myszki wciśnięty",0 ,0);
if(keyboard['A'] == true) MessageBox(0, "Przycisk A wciśnięty",0 ,0);
//mniej więcej to samo oferuje DirectInput

A jeśli chcesz do tego mieć system zdarzeń, to musisz w WM_KEYDOWN sprawdzać czy interesujący się przycisk nie został naciśnięty

1 użytkowników online, w tym zalogowanych: 0, gości: 1