Basit cevap hayır, glutIdleFunc geri çağrıyı bir tür simülasyonu olan bir oyunda kullanmak istemezsiniz. Bunun nedeni, bu işlevin animasyonu boşa çıkarması ve Windows olayı işlemeden kodu eşzamanlı olarak çizmemesidir. Başka bir deyişle, pencere olaylarını almak ve teslim etmek, stant kodunu (ya da bu geri aramaya ne koyduysanız), bu etkileşimli bir uygulama için mükemmeldir (etkileşim, sonra yanıt), ancak fizik veya oyun durumunun ilerlemesi gereken bir oyun için mükemmel etkileşimden veya oluşturma süresinden bağımsız.
Girdi işlemeyi, oyun durumunu ve kodunu tamamen ayırmak istiyorsunuz. Doğrudan grafik kütüphanesini içermeyen, bunun için kolay ve temiz bir çözüm vardır (örn. Taşınabilir ve görselleştirmesi kolaydır); Tüm oyun döngüsünün zaman üretmesini ve simülasyonun üretilen zamanı (parçalarla) tüketmesini istiyorsunuz. Ancak anahtar, simülasyonunuzun harcadığı süreyi animasyonunuza entegre etmektir.
Bu konuda bulduğum en iyi açıklama ve öğretici, Glenn Fiedler'in Zaman Aşımını Düzelt
Bu eğitimde tam bir tedavi vardır, ancak gerçek bir fizik simülasyonuna sahip değilseniz, gerçek entegrasyonu atlayabilirsiniz ancak temel döngü hala (aşağılık sözde kodda) değerine kadar kaymaktadır:
// The amount of time we want to simulate each step, in milliseconds
// (written as implicit frame-rate)
timeDelta = 1000/30
timeAccumulator = 0
while ( game should run )
{
timeSimulatedThisIteration = 0
startTime = currentTime()
while ( timeAccumulator >= timeDelta )
{
stepGameState( timeDelta )
timeAccumulator -= timeDelta
timeSimulatedThisIteration += timeDelta
}
stepAnimation( timeSimulatedThisIteration )
renderFrame() // OpenGL frame drawing code goes here
handleUserInput()
timeAccumulator += currentTime() - startTime
}
Bu şekilde yaparak, render kodunuzdaki, giriş işleminizdeki veya işletim sisteminizdeki duraklamalar oyun durumunuzun gerisinde kalmasına neden olmaz. Bu yöntem aynı zamanda taşınabilir ve grafik kütüphanesinden bağımsızdır.
GLUT iyi bir kütüphanedir, ancak kesinlikle olaya dayalıdır. Geri aramaları kaydedersiniz ve ana döngüden çıkarsınız. GLUT kullanarak ana döngünüzün kontrolünü her zaman devredersiniz. Etrafında dolaşmak için kesmek vardır, ayrıca zamanlayıcıları ve benzeri şeyleri kullanarak harici bir döngü taklit edebilirsiniz, ancak başka bir kütüphane muhtemelen daha iyi (daha kolay) bir yoldur. Pek çok alternatif var, işte birkaçı (iyi belgeler ve hızlı öğreticiler ile):
- Girdi olaylarını satır içi (kendi ana döngünüzde) alabilmenizi sağlayan GLFW .
- Ancak SDL , vurgulanması özellikle OpenGL değil.