ฉันได้อ่านการเคลื่อนไหวอีกสองเธรดที่นี่: การเคลื่อนไหวตามเวลา Vs การเคลื่อนไหวตามอัตราเฟรมหรือไม่ และ เมื่อใดที่ฉันควรใช้ขั้นตอนเวลาที่แน่นอนหรือแปรผัน
แต่ฉันคิดว่าฉันขาดความเข้าใจพื้นฐานของการเคลื่อนไหวแบบอิสระของเฟรมเพราะฉันไม่เข้าใจว่าหัวข้อเหล่านี้กำลังพูดถึงอะไร
ฉันติดตามบทเรียน SDL ของ lazyfoo และเข้าสู่บทเรียนอิสระของเฟรม http://lazyfoo.net/SDL_tutorials/lesson32/index.php
ฉันไม่แน่ใจว่าส่วนการเคลื่อนไหวของรหัสพยายามที่จะพูดอะไร แต่ฉันคิดว่ามันเป็นแบบนี้ (โปรดแก้ไขให้ฉันถ้าฉันผิด): เพื่อให้มีการเคลื่อนไหวแบบอิสระเฟรมเราต้องค้นหาว่าวัตถุอยู่ไกลแค่ไหน ( เช่นสไปรต์) เคลื่อนไหวภายในกรอบเวลาที่กำหนดเช่น 1 วินาที หากจุดเคลื่อนที่ที่ 200 พิกเซลต่อวินาทีฉันต้องคำนวณว่ามันเคลื่อนที่ภายในวินาทีนั้นด้วยการคูณ 200 pps โดย 1/1000 ของวินาที
นั่นถูกต้องใช่ไหม? บทเรียนบอกว่า:
"ความเร็วเป็นพิกเซลต่อวินาที * เวลานับตั้งแต่เฟรมสุดท้ายเป็นวินาทีดังนั้นหากโปรแกรมทำงานที่ 200 เฟรมต่อวินาที: 200 pps * 1/200 วินาที = 1 พิกเซล"
แต่ ... ฉันคิดว่าเราคูณ 200 pps ด้วย 1/1000 ของวินาที ธุรกิจนี้มีเฟรมต่อวินาทีอะไร
ฉันขอขอบคุณถ้ามีคนให้คำอธิบายรายละเอียดเพิ่มเติมเล็กน้อยกับฉันเกี่ยวกับการเคลื่อนไหวของเฟรมอิสระ
ขอขอบคุณ.
ส่วนที่เพิ่มเข้าไป:
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 );
}
นั่นคือรหัสที่ย้ายจุดลงบนหน้าจอ ฉันคิดว่าฉันมีทุกอย่างถูกต้องแล้ว มันเคลื่อนลงมาที่หน้าจอ แต่มีเรื่องแปลก ๆ เกิดขึ้นที่ฉันไม่สามารถอธิบายได้ จุดควรจะอยู่ที่ y = 580 เมื่อมันมาถึงมากกว่าค่า y อย่างไรก็ตามทุกครั้งที่ฉันเรียกใช้โปรแกรมจุดจะจบลงในตำแหน่งที่แตกต่างกันซึ่งหมายถึงนิดหน่อยถึงมากกว่า 580 ดังนั้นจุดนั้นจึงอยู่ครึ่งทางหรือมากกว่าครึ่งทางจากหน้าจอ (จุดคือ 20 พิกเซลหน้าจอ ขนาด 800x600) หากฉันทำอะไรเช่นคลิกค้างที่แถบชื่อเรื่องของโปรแกรมแล้วปล่อยจุดจะหายไปจากหน้าจอ ทำไมมันถึงแตกต่างกันในแต่ละครั้ง? สำหรับปัญหาของแถบชื่อเรื่องฉันคิดว่าเป็นเพราะเมื่อฉันยึดแถบหัวเรื่องไว้ตัวจับเวลายังคงทำงานอยู่และเวลาที่ผ่านไปจะใหญ่ขึ้น ทำให้เกิดการเคลื่อนที่ของจุดในเฟรมถัดไป นั่นถูกต้องใช่ไหม?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
จากนั้นทำ:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }