Hỏi về cách làm chậm thời gian thực hiện vòng for

chào mọi người, mọi người cho mình hỏi ví dụ mình có

...
for(int i=0; i<n; i++){
   ...
}
...

làm thế nào để làm chậm thời gian thực hiện của riêng vòng for mà không ảnh hưởng đến toàn bộ chương trình. Mình đang mô tả 1 chuyển động trong game

sleep(100) <windows.h> :smiley:

4 Likes

Dùng Sleep thì được đó nhưng nếu lặp nhiều lần sẽ bị not responding.
Để khắc phục thì bạn cho nó vào 1 thread riêng nhé (google tự tìm hiểu)

4 Likes

Mô tả 1 chuyển động thì phải tương tác được với nó trong lúc hình ảnh hiện từ từ, tức là phải dùng đến thread rồi.

2 Likes
for(int i=0; i<60; i++){
    bird.setRotation(0.f+35/60.f*i);
    bird.rotate(35/60.f);
    bird.getRotation();
    this_thread::sleep_for(chrono::milliseconds(1));
  }

đây là code mình viết nhưng nó vẫn làm cả chương trình chậm đi :((

1s = 1000ms, 1ms làm sao mà chậm được :smile:

2 Likes

do em để 100 nó đứng hình luôn, nên để thử 1 thì thấy nó bị chậm
không hiểu vì sao. cái vòng for ấy em để trong game loop

Hi Duc Khai Tong.
Bạn tìm tài liệu về lập trình game đọc trước đã. (SFML book). Cơ bản thì bạn có 1 vòng lặp game trong hàm update bạn cập nhật trang thái tất cả các đối tượng. Nếu một đối tượng muốn chậm hơn thì nó có hệ số thời gian riêng.

1 Like

bạn đưa ra ví dụ cách làm của bạn được không. mình chưa hiểu cái hệ số thời gian. vì cách mình làm là giới hạn tốc độ khung hình cho vòng lặp game

Hi Duc Khai Tong.
Trước mình code game dùng biến count

// Game loop
cout++;
updateInput();
updateLogic(cout); 
updateGraphic();

Tuy nhiên sau này dùng luôn thời gian hệ thống để cập nhật trạng thái. Trong đối tượng game lấy thời gian hệ thống để kiểm tra xem nó ở trạng thái hiện tại bao nhiêu lâu để đổi trạng thái. Tuy nhiên nó có nhược điểm là vì dùng thời gian chúng nên với các đối tượng khác nhau cần có biến vận tốc khác nhau để quy định chuyển động khác nhau.

1 Like

Lưu thời gian của vòng lặp trước, lấy thời gian của vòng lặp sau, tính time elapsed, nhân với vận tốc của đối tượng, update vị trí. Dùng performanceCounter để đo, độ chính xác microsecond.

3 Likes

mình xin lỗi đã đề cập nhầm là chuyển động. mình muốn xoay vật thế một góc với trục là tâm chính nó (rotate) nên định tạo ra vòng for để xoay từng đơn vị độ nhỏ hơn. và mình muốn làm chậm thời gian thực hiện vòng lặp đi để hình ảnh lúc xoay nó mượt hơn

Hi Duc Khai Tong.

  1. Khi bạn xoay vòng thì có vận tốc góc
  2. Hãy mở rộng suy nghĩ về hai khái niệm chuyển động và vận tốc. Theo mình chuyển động là sự thay đổi trạng thái (đói -> no, thức -> ngủ, hết máu -> đầy máu v.v.v…) Còn tốc độ là thời gian để nó chuyển một đơn vị trạng thái vd Máu : 0 -> 100hp mất 10s vậy là mỗi giây nạp được 10hp. Thời gian bị choáng là 10s sau khi uông thuốc thì chỉ còn 1s (Tốc độ phục hồi tăng 10 lần).
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?