Saya telah membaca dua utas lainnya di sini tentang gerakan: Gerakan berbasis waktu Vs Gerakan berbasis frame rate? , dan Kapan saya harus menggunakan langkah waktu tetap atau variabel?
tapi saya pikir saya kurang memiliki pemahaman dasar tentang gerakan frame independent karena saya tidak mengerti apa yang dibicarakan oleh salah satu dari kedua thread tersebut.
Saya mengikuti bersama dengan tutorial SDL lazyfoo dan sampai pada pelajaran frame independen. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Saya tidak yakin apa yang ingin dikatakan oleh bagian gerakan dari kode ini, tetapi saya pikir ini adalah ini (tolong perbaiki saya jika saya salah): Untuk memiliki frame independent, kita perlu mengetahui seberapa jauh suatu objek ( mis. sprite) bergerak dalam jangka waktu tertentu, misalnya 1 detik. Jika titik bergerak pada 200 piksel per detik, maka saya perlu menghitung berapa banyak bergerak dalam detik itu dengan mengalikan 200 pps dengan 1/1000 detik.
Apakah itu benar? Pelajaran mengatakan:
"kecepatan dalam piksel per detik * waktu sejak frame terakhir dalam detik. Jadi jika program ini berjalan pada 200 frame per detik: 200 pps * 1/200 detik = 1 piksel"
Tapi ... saya pikir kita mengalikan 200 pps dengan 1/1000 detik. Apa bisnis ini dengan frame per detik?
Saya akan menghargai jika seseorang bisa memberi saya sedikit penjelasan lebih rinci tentang bagaimana bingkai gerakan independen bekerja.
Terima kasih.
TAMBAHAN:
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 );
}
Kode itu yang memindahkan satu titik ke bawah layar. Saya pikir saya sudah melakukan semuanya dengan benar sejauh ini. Itu bergerak ke bawah layar tetapi ada sedikit hal aneh yang terjadi yang tidak bisa saya jelaskan. Titik seharusnya tetap pada y = 580 ketika sampai lebih dari nilai-y. Namun, setiap kali saya menjalankan program, titik tersebut akan berakhir di lokasi yang berbeda, yang berarti sedikit lebih banyak dari 580, sehingga titik tersebut setengah atau lebih dari setengah layar (titik adalah 20 piksel, layar dimensi 800x600). Jika saya melakukan sesuatu seperti klik dan tahan bilah judul program, dan kemudian lepaskan, titik menghilang dari layar. Kenapa variabel setiap kali? Adapun masalah bilah judul saya pikir itu karena ketika saya memegang bilah judul, penghitung waktu masih berjalan, dan waktu yang berlalu semakin besar, menghasilkan jarak yang lebih besar titik bergerak di bingkai berikutnya. Apakah itu benar?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
lalu lakukan:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }