Autor Wątek: [OpenGL] Przycinająca się animacja  (Przeczytany 983 razy)

Offline Jam_Pawian

  • Użytkownik

# Czerwiec 24, 2009, 00:37:42
Witam

Robię grę FPP i już od pewnego czasu użeram się z tym problemem. Gdy poruszam myszką i naciskam przycisk z klawiatury animacja traci płynność(Kamera zaczyna przeskakiwać i wolniej się obraca). Animacja modeli nie zwalnia. Zmieniłem sterowanie z komunikatów Windowsowych na Direct Input. Nie pomogło.

Tak wygląda u mnie pętla komunikatów:

// main message loop


while (!done)
{

PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

if (msg.message == WM_QUIT) // do we receive a WM_QUIT message?
{
done = true; // if so, time to quit the application
}



TranslateMessage(&msg); // translate and dispatch to event queue
DispatchMessage(&msg);

/*****************STEROWANIE************************************/

hr= g_lpDIKeyboard->GetDeviceState(sizeof(buffer), (LPVOID)& buffer); //Sprawdzanie stanu klawiatury

if(KEYDOWN(buffer, DIK_RIGHT))
{
  swiat->dresu->direction+= 2;
}
if(KEYDOWN(buffer, DIK_LEFT))
{
  myModel->Ustaw_stan_animacji(Bieg);
  swiat->dresu->direction-= 2;
}
if(KEYDOWN(buffer, DIK_UP))
{
  if(swiat->dresu->kolizja == false)
  if(swiat->dresu->Zwroc_predkosc() == 0)
  swiat->dresu->Ustaw_predkosc(1);
}


g_lpDIMouse->GetDeviceState(sizeof(mouse_state), (LPVOID)&mouse_state); //Pobieranie stanu myszy

mysz_y += mouse_state.lY;
                mysz_x += mouse_state.lX;
for (int i = 0; i < 4; i++)
{
if(mouse_state.rgbButtons[i] & 0x80) MouseButton[i] = true;
else MouseButton[i] = false;
}
                //Obsługa zdarzeń powodowanych przez mysz
if(MouseButton[1] == true)   //Na kliknięcie prawym przyciskiem wyjdź z pętli komunikatów
PostQuitMessage(0);


if ((mysz_x - stara_mysz_x) > 0) // mouse moved to the right
swiat->dresu->direction += 5.0f;
else if ((mysz_x - stara_mysz_x) < 0) // mouse moved to the left
swiat->dresu->direction -= 5.0f;

/********************************************************************/
/////////////////////////////////////////////
Render();
////////////////////////////////////////////
stara_mysz_x= mysz_x;
stara_mysz_y= mysz_y;

}




A tak funkcja Render():

void Render()
{

cameraX= swiat->dresu->position.x - (float)cos(DEG2RAD(swiat->dresu->direction))*20;
cameraY= swiat->dresu->position.y + 5;
cameraZ= swiat->dresu->position.z - (float)sin(DEG2RAD(swiat->dresu->direction))*20;

lookX = swiat->dresu->position.x + (float)cos(DEG2RAD(swiat->dresu->direction));
lookY = 5.0f;
lookZ = swiat->dresu->position.z + (float)sin(DEG2RAD(swiat->dresu->direction));

/************************************************************************************* TIMER*****/
//Ustala okres czasu, który upłynął od renderowania ostatniej ramki                                         
float elapsedSec= swiat->timer->GetElapsedSeconds(1);
/***********************************************************************************************/
// clear screen and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();



// set the camera position
gluLookAt(cameraX, cameraY, cameraZ, lookX, lookY, lookZ, 0.0, 1.0, 0.0);




    /******************************RYSOWANIE I ANIMACJA OBIEKTÓW*************************************/
//Przed funkcją render sprawdzany jest stan klawiatury
swiat->Wykrywaj_kolizje();
swiat->Poruszaj_obiekty();
swiat->Rysuj_obiekty(elapsedSec);
   /*************************************************************************************/
glFlush();


SwapBuffers(g_HDC); // bring backbuffer to foreground
}


Z góry dzięki za wszelką pomoc.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Oti

  • Użytkownik

# Czerwiec 24, 2009, 01:29:45
Złote lekarstwo na problemy z animacją
Polecam, mi i wielu innym już pomogło. :)



« Ostatnia zmiana: Czerwiec 24, 2009, 16:17:26 wysłana przez Oti »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 24, 2009, 11:38:48
Nie wiem, czy to akurat jest powodem, ale masz źle zrobioną pętlę komunikatów. :)

Offline Jam_Pawian

  • Użytkownik

# Czerwiec 24, 2009, 14:49:24
Ok, a co dokładnie Ci się w niej nie podoba?

Offline Liosan

  • Redaktor

# Czerwiec 24, 2009, 14:58:50
Cytując powszechnie linkowany tekst Xiona:
while (msg.message != WM_QUIT)
{
   if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
   {
      TranslateMessage (&msg);
      DispatchMessage (&msg);
   }
   else
   {  /* Licz i rysuj */ }
}

Liosan

Offline Jam_Pawian

  • Użytkownik

# Czerwiec 30, 2009, 12:50:51
Dzięki za sugestie. Jedyne, co pomogło to całkowite zrezygnowanie z tłumaczenia i przekazywania wiadomości. Może kiedyś wymyślę coś lepszego. Dzięki jeszcze raz.