2010-02-04 11 views
5

Tôi hiểu tại sao nó thực hiện điều đó nhưng tôi không thực sự có bất kỳ ý tưởng nào về cách ngăn chặn điều đó. Vì vậy, kịch bản là, mỗi khung hình tôi di chuyển xe bằng một số điểm ảnh được xác định trước. Điều gì xảy ra là khi tôi đi trên máy tính chậm hoặc nhanh hơn ... tôi cũng nhận được ít hơn hoặc nhiều khung hình mỗi giây để xe di chuyển chậm hơn hoặc nhanh hơn. Tôi đã tự hỏi làm thế nào tôi có thể ngăn chặn điều đó.Trò chơi đua xe, xe di chuyển nhanh hơn trên máy tính nhanh hơn

Tôi nghi ngờ rằng tôi sẽ gặp vấn đề tương tự khi sử dụng bất kỳ thư viện nào ... Đây là lần đầu tiên tôi thực hiện các công cụ thời gian thực như vậy.

+8

Nhấn nút Turbo! –

+0

Có thể có dupe của http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

Trả lời

12

tôi nghi ngờ mã hiện tại của bạn trông như thế này bằng cách nào đó

// to be called every frame 
void OnEveryFrame() 
{ 
    MoveCar(); 
    DrawCarToScreen(); 
} 

Nhưng nó phải là như thế này:

// to be called - for example - 50 times per second: 
void OnEveryTimerEvent() 
{ 
    MoveCar(); 
} 

// to be called every frame 
void OnEveryFrame() 
{ 
    LockTimerEvents(); 
    DrawCarToScreen(); 
    UnlockAndProcessOutstandingTimerEvents(); 
} 

Bạn phải thiết lập một sự kiện timer theo, tất nhiên.

10

Di chuyển xe theo hẹn giờ và không phải tốc độ khung hình. tức là Mô hình ô tô phải độc lập với đại diện hiển thị.

+0

Bộ hẹn giờ có tính toán thời gian giữa mỗi khung nếu tôi hiểu chính xác không? – DogDog

+0

@Apoc, vâng. Bạn sẽ có một trò chơi phù hợp hơn nhiều nếu bạn đi dựa trên thời gian thay vì tốc độ khung hình – Polaris878

0

Bạn phải tiết kiệm thời gian trước khi di chuyển ô tô và bản vẽ.
Tiết kiệm thời gian sau khi tính toán tất cả.
Di chuyển xe của bạn bằng Npixels/giây

2

Chuyển động phải bị hạn chế bởi thời gian trễ "thực", tức là xe của bạn sẽ di chuyển với tốc độ x pixel mỗi lát thời gian.

2

Đọc đồng hồ thời gian thực và di chuyển xe một khoảng cách thích hợp cho thời gian đã trôi qua. Điều này có thể trông hơi "giật" nếu máy tính quá chậm, nhưng làm cho tốc độ của xe độc ​​lập với tốc độ CPU.

3

Bạn có thể giải quyết vấn đề này bằng cách sử dụng bộ tính giờ chính xác và phép toán vectơ.

Vì vậy, vì lợi ích của đối số cho phép đề xuất mã vẽ của bạn có thể được gọi tại bất kỳ thời điểm nào, ví dụ: Cách nhau 1 giây hoặc cách nhau 3 giây hoặc cách nhau 0,02 giây.

Tăng tốc độ di chuyển của xe lên 40 pixel/giây.

Do đó, số lượng pixel cần di chuyển là (TIME_NOW - LAST_FRAME_TIME) * 40px.

2

Bạn cần phải tăng tốc độ khung hình lên X khung hình/giây (60 FPS là phổ biến nhất). Đây là một tính năng phổ biến trong hầu hết các khuôn khổ đa phương tiện, bao gồm SFML. Đối với SFML, tôi sẽ xem xét phương thức Window/RenderWindow SetFramerateLimit(unsigned int Limit).

+0

Điều đó không khắc phục được sự cố khi tốc độ khung hình dưới 60. – DogDog

1

Bạn cần phải fix your timestep. Về cơ bản, mỗi khung hình bạn di chuyển xe một khoảng cách khác nhau dựa trên thời gian thực sự trôi qua kể từ lần gọi cập nhật cuối cùng. Bằng cách này, bạn sẽ có được tốc độ chính xác bất kể tốc độ khung hình.