Burada hareketle ilgili iki konu daha okudum: Zamana dayalı hareket Vs Kare hızına dayalı hareket? ve Ne zaman sabit veya değişken bir zaman adımı kullanmalıyım?
fakat bence çerçeve bağımsız hareketinin temel bir anlayışından yoksunum çünkü o konuların ne hakkında konuştuğunu anlamıyorum.
Ben lazyfoo SDL öğreticiler ile birlikte takip ve çerçeve bağımsız ders geldi. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Kodun hareket kısmının ne söylemeye çalıştığından emin değilim ama bence bu (yanlışsam lütfen beni düzelt): Çerçeve bağımsız hareketine sahip olmak için, bir nesnenin ne kadar uzak olduğunu bulmamız gerekir ( örn. hareketli grafik) belirli bir zaman dilimi içinde hareket eder, örneğin 1 saniye. Nokta saniyede 200 piksel hareket ederse, o zaman 200 pps saniyenin 1 / 1000'i ile çarparak o saniye içinde ne kadar hareket ettiğini hesaplamam gerekir.
Bu doğru mu? Ders diyor ki:
"saniye başına piksel cinsinden hız * saniye olarak son kareden bu yana geçen süre. Program saniyede 200 kare hızında çalışıyorsa: 200 pps * 1/200 saniye = 1 piksel"
Ama ... Sanırım 200 pps saniyenin 1 / 1000'i ile çarpıyoruz. Saniyede kare olan bu iş nedir?
Birinin bana çerçeve bağımsız hareketin nasıl çalıştığı hakkında biraz daha ayrıntılı bir açıklama yapıp yapamayacağını takdir ediyorum.
Teşekkür ederim.
İLAVE:
SDL_Rect posRect;
posRect.x = 0;
posRect.y = 0;
float y, yVel;
y = 0;
yVel = 0;
Uint32 startTicks = SDL_GetTicks();
bool quit = false;
SDL_Event gEvent;
while ( quit == false )
{
while ( SDL_PollEvent( &gEvent ) )
{
if ( gEvent.type == SDL_QUIT )
quit = true;
}
if ( y <= 580 )
{
yVel += DOT_VEL;
y += (yVel * (SDL_GetTicks() - startTicks)/1000.f);
posRect.y = (int)y;
}
startTicks = SDL_GetTicks();
SDL_BlitSurface( bg, NULL, screen, NULL );
SDL_BlitSurface( dot, NULL, screen, &posRect );
SDL_Flip( screen );
}
Ekranda bir noktayı hareket ettiren kod budur. Sanırım şimdiye kadar her şeyim doğru. Ekranda aşağı doğru hareket eder, ancak açıklayamadığım biraz garip bir şey var. Nokta, o y değerinden daha büyük bir değere ulaştığında y = 580'de kalmalıdır. Ancak, programı her çalıştırdığımda, nokta farklı bir konuma gelecek, yani 580'den biraz daha fazla, yani nokta ekranın yarısında veya yarısından daha fazla olacak (nokta 20 piksel, ekran boyutlar 800x600). Programın başlık çubuğunu tıklayıp basılı tutup serbest bırakma gibi bir şey yaparsam, nokta ekrandan kaybolur. Her seferinde nasıl değişken oluyor? Başlık çubuğu sorununa gelince, bunun nedeni başlık çubuğuna tuttuğumda, zamanlayıcı hala çalışıyor ve geçen süre büyüyor, daha büyük bir mesafeyle sonuçlanır ve nokta bir sonraki çerçevede hareket eder. Bu doğru mu?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
sonra yapın:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }