Xử lí thời gian trong SFML - Ep2
C++
38
game
11
sfml
6
game_programming
6
White

Harding Adonis viết ngày 03/03/2019

OK, xin chào mọi người. Trong các bài viết trước, mình đã hướng dẫn các bạn cách cài SFML vào project rồi. Bạn nào chưa xem thì xem tại đây nhé!

Trước khi bắt đầu bài viết thì mình lưu ý các bạn là tất cả các class, function của SFML đều năm trong 1 namespace có tên là sf. Vì thế mà khi sử dụng SFML, bạn có thể thực hiện theo 2 cách sau:

  • Cách 1: các bạn gõ sf:: tên class hoặc function. Vd: sf::Time, sf::Clock,....
  • Cách 2: các bạn sử dụng using namespace sf; sau khi include SFML. Sau đó các bạn có thể ghi bình thường mà không cần sf:: ở trước. Vd: sf::Time ---> Time, sf::Clock ---> Clock,... alt text Và mình thì khuyến khích sử dụng cách 1 hơn bởi vì trong project của các bạn có thể sẽ có những class/function trùng tên nhau nên phải cần có namespace để phân biệt.

1. Thời gian trong SFML

Trong SFML, để có thể lưu thời gian, bạn dùng class sf::Time. Class này thuộc System module. Có một điều rất hay ở class này là nó có thể chuyển đổi thời gian cho chúng ta. Vd như bạn lưu thời gian là 1 giây, bạn có thể chuyển ra 1000 mili giây hay 1000000 micro giây.
Bạn hãy chạy đoạn code sau:

#include <SFML/System.hpp>
#include <iostream>

int main()
{
    sf::Time time = sf::seconds(1);

    std::cout << "Time is " << time.asSeconds() << " seconds\n";
    std::cout << "Time is " << time.asMilliseconds() << " miliseconds\n";
    std::cout << "Time is " << time.asMicroseconds() << " microseconds\n";

    std::cin.get();

    return 0;
}

Và kết quả có được là:

Time is 1 seconds
Time is 1000 miliseconds
Time is 1000000 microseconds

Lúc đầu mình khai báo một biến sf::Time tên là time. Mình gán cho nó lưu 1 giây bằng hàm sf::seconds(float). Mình dùng hàm đó là vì nó trả về kiểu sf::Time, tức là nếu bạn truyền tham số cho nó là 1 (giây) thì nó sẽ chuyển về kiểu sf::Time cho chúng ta. Ngoài ra, còn có thể dùng các hàm sau:

sf::Time time1 = sf::milliseconds(1000);     // 1000 mili giây đổi ra là 1 giây
sf::Time time2 = sf::milliseconds(1000000);  // 1000000 micro giây đổi ra là 1 giây
//  ==> 1 giây       = 1000 mili giây
//      1 mili giây  = 1000 micro giây

Sau đó, từ biến time mình sử dùng hàm asSeconds() để chuyển kiểu sf::Time về giây (chuyển về kiểu float). Vì mình gán ban đầu là 1 giây nên khi chuyển lại giây thì nó sẽ in ra là 1 giây. Tương tự như thế, hàm asMilliseconds() là chuyển về mili giây và asMicroseconds() là chuyển về micro giây.

Tiếp theo các bạn hãy chạy đoạn code sau:

#include <SFML/System.hpp>
#include <iostream>

int main()
{
    sf::Time time = sf::seconds(2);

    sf::sleep(time);

    return 0;
}

Và kết quả là, chương trình của các bạn sẽ chờ trong 2 giây sau đó mới tắt đi. Tại sao vậy? Đó là nhờ hàm sf::sleep(sf::Time duration). Hàm này sẽ có tác dụng làm chậm chương trình của bạn trong một khoản thời gian (khoản thời gian này lưu bằng sf::Time).

2. Đo thời gian trong SFML

Nói một cách ngắn gọn thì tức là một cái đồng hồ đo thời gian xem. Bạn có thể dùng đồng hồ để đo thời gian bạn chạy chương trình hay một chức năng gì đó. Và trong SFML, cái đồng hồ đó được viết thành class sf::Clock. Class này cũng nằm trong System module.
Để sử dụng được thì bạn cứ khai báo bình thường:

sf::Clock clock;

Khi bạn khai báo như thế thì biến clock đã bắt đầu tính thời gian rồi. Và để lấy được thời gian đã tính, bạn chỉ cần gọi hàm getElapsedTime(), hàm này trả về kiểu sf::Time.
Các bạn hãy chạy đoạn code sau:

#include <SFML/System.hpp>
#include <iostream>

int main()
{
    sf::Clock clock;

    sf::sleep(sf::seconds(1));

    std::cout << clock.getElapsedTime().asSeconds();

    std::cin.get();

    return 0;
}

Và output sẽ là chương trình sẽ dừng lại trong 1 giây và in ra số gần bằng 1. Ở máy mình thì nó hiện 1.0008. Điều này có nghĩa là từ lúc mình khai báo biến clock đến lúc mình gọi hàm getElapsedTime() thì đã trôi qua 1.0008 giây. Còn tại sao trôi qua 1.0008 giây thì do cái hàm sf::sleep.

Ngoài hàm getElapsedTime() ra thì sf::Clock còn có một hàm nữa là restart(). Khi gọi hàm restart() thì tất nhiên như bao cái đồng hồ khác thì nó sẽ nhảy về 0 và tính lại từ đầu. Và hàm restart() này cũng trả về kiểu sf::Time là thời gian tính được cho đến khi nó gọi restart(). Vd: clock1 tính được 10 giây, bạn gọi hàm restart() thì nó sẽ trả về 10 giây và tính lại từ đầu.
Chạy đoạn code sau sẽ rõ:

#include <SFML/System.hpp>
#include <iostream>

int main()
{
    sf::Clock clock;

    sf::sleep(sf::seconds(1));

    std::cout << clock.restart().asSeconds();

    std::cin.get();

    return 0;
}

Và output thì như trên thôi. Chương trình sẽ dừng lại trong 1 giây và in ra số gần bằng 1.

OK, bài viết đến đây là hết rồi. Nếu có ý kiến gì thì các bạn cứ để lại bình luận nhé!!!

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Harding Adonis

6 bài viết.
16 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
2 0
Bài viết này mình chỉ nói sơ lược về SFML và vài project mình đã làm với nó thôi nhé. Các bài viết sau mình sẽ chỉ rõ cách cài đặt cũng như dùng SF...
Harding Adonis viết 6 tháng trước
2 0
White
2 0
OK xin chào mọi người, ở bài viết trước mình đã giới thiệu sơ lược về SFML rồi. Và bây giờ mình sẽ hướng dẫn các bạn cài đặt SFML vào project. Lin...
Harding Adonis viết 6 tháng trước
2 0
White
1 2
OK, xin chào mọi người, ở bài viết trước mình đã hướng dẫn các bạn cài SFML cho project Visual Studio. Và bây giờ, mình sẽ hướng dẫn các bạn cài đặ...
Harding Adonis viết 6 tháng trước
1 2
Bài viết liên quan
White
2 0
OK xin chào mọi người, ở bài viết trước mình đã giới thiệu sơ lược về SFML rồi. Và bây giờ mình sẽ hướng dẫn các bạn cài đặt SFML vào project. Lin...
Harding Adonis viết 6 tháng trước
2 0
White
1 0
OK, xin chào mọi người. Trong các bài viết trước, mình đã hướng dẫn các bạn về xử lí thời gian trong SFML rồi. Bạn nào chưa xem thì xem tại đây nhé...
Harding Adonis viết 5 tháng trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
16 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!