Tôi đã đọc hai chủ đề khác ở đây về chuyển động: Chuyển động dựa trên thời gian Vs Chuyển động dựa trên tốc độ khung hình? và khi nào tôi nên sử dụng bước thời gian cố định hoặc thay đổi?
nhưng tôi nghĩ rằng tôi đang thiếu một sự hiểu biết cơ bản về chuyển động độc lập khung bởi vì tôi không hiểu một trong những chủ đề đó đang nói về cái gì.
Tôi đang theo dõi cùng với các hướng dẫn SDL của lazyfoo và bắt gặp bài học độc lập về khung. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Tôi không chắc phần chuyển động của mã đang cố nói gì nhưng tôi nghĩ đó là phần này (vui lòng sửa lại cho tôi nếu tôi sai): Để có chuyển động độc lập khung, chúng ta cần tìm hiểu một vật thể cách xa ( ví dụ sprite) di chuyển trong một khung thời gian nhất định, ví dụ 1 giây. Nếu dấu chấm di chuyển với tốc độ 200 pixel mỗi giây, thì tôi cần tính toán nó di chuyển bao nhiêu trong giây đó bằng cách nhân 200 pps với 1/1000 của một giây.
Có đúng không? Bài học nói:
"vận tốc tính bằng pixel trên giây * thời gian kể từ khung hình cuối cùng tính bằng giây. Vì vậy, nếu chương trình chạy ở tốc độ 200 khung hình / giây: 200 pps * 1/200 giây = 1 pixel"
Nhưng ... tôi nghĩ rằng chúng tôi đã nhân 200 pps với 1/1000 giây. Doanh nghiệp này với khung hình mỗi giây là gì?
Tôi đánh giá cao nếu ai đó có thể cho tôi một lời giải thích chi tiết hơn một chút về cách hoạt động của chuyển động độc lập khung.
Cảm ơn bạn.
THÊM VÀO:
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 );
}
Đó là mã di chuyển một chấm xuống màn hình. Tôi nghĩ rằng tôi có mọi thứ chính xác cho đến nay. Nó di chuyển xuống màn hình nhưng có một điều kỳ lạ xảy ra mà tôi không thể giải thích. Dấu chấm được cho là ở mức y = 580 khi nó lớn hơn giá trị y đó. Tuy nhiên, mỗi khi tôi chạy chương trình, dấu chấm sẽ kết thúc ở một vị trí khác, nghĩa là từ một chút đến nhiều hơn 580, vì vậy dấu chấm nằm ở nửa màn hình hoặc hơn một nửa màn hình (dấu chấm là 20 pixel, màn hình kích thước 800x600). Nếu tôi làm một cái gì đó như nhấp và giữ thanh tiêu đề của chương trình, sau đó phát hành, dấu chấm sẽ biến mất khỏi màn hình. Làm thế nào mà nó biến mỗi lần? Đối với vấn đề về thanh tiêu đề tôi nghĩ đó là vì khi tôi giữ thanh tiêu đề, bộ hẹn giờ vẫn chạy và thời gian trôi qua ngày càng lớn hơn, dẫn đến một khoảng cách lớn hơn, dấu chấm di chuyển trong khung tiếp theo. Có đúng không?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
sau đó làm:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }