Game C++ SDL – Bài 10: Tạo Hiệu Ứng Di Chuyển Màn Hình

Chào mừng các bạn đến với chủ đề học lập trình game c++ SDL.

Bài số 10 chúng ta sẽ tìm hiểu về kỹ thuật, di chuyển màn hình trong game. Điều giúp cho game có tính sống động hơn, và có tính chất thời gian thực hơn.

I. Lý Thuyết Cơ Bản

Có hai kiểu thực hiện di chuyển màn hình trong lập trình game như sau:

1. Khi nhân vật di chuyển thì, màn hình sẽ được di chuyển theo tốc độ của nhân vật.

Nghĩa là sự di chuyển của màn hình phụ thuộc vào nhân vật.

Vể bản chất thì nhân vật không di chuyển từ A đến B mà nó di chuyển tại chỗ. Những mỗi lần nó được di chuyển tại chỗ thì màn hình sẽ được cuốn chiếu theo.

Có 3 dạng cơ bản cho phương thức này đó là.

+ Đã tiến thì không thể lùi được.

+ Cho phép lùi lại nhưng giới hạn đến một khoảng cho phép.

+ Cho phép lùi lại từ vị trí bắt đầu. Nhưng những gì đã lấy rồi thì ko xuất hiện. Và sẽ giới hạn thời gian chơi để, gây khó khăn.

Ok. với cách 1 này mình sẽ giới thiệu trong những bài sau. Khi chúng ta học về cách move nhân vật tại chỗ.

Trong bài này chúng ta sẽ học về cách 2.

2. Màn hình tự động di chuyển mà không phụ thuộc vào việc nhân vật có di chuyển hay không.

+ Nghĩa là khi chúng ta chạy game, màn hình sẽ tự động di chuyển và nó không phụ thuộc vào sự chuyển động của nhân vật game.

+ Thường thì tốc độ screen sẽ là chậm nhất so với threats < main object < amo của threats < amo của Object

+ Khi màn hình di chuyển đến gần hết, nó có thể dừng lại để tạo ra cuộc chiến giữa Nhân vật và Mối Hiểm Họa Lớn nhất (Threats Boss). Sau đó là kết thúc bài 1.

Có hai kỹ thuật nhỏ được xử dụng trong kiểu này.

a. Sử dụng lặp ảnh background.

+ Về bản chất screen di chuyển là do background di chuyển. Nếu chúng ta sử dụng background có kích thước = kích thước màn hình.

=> Khi screen di chuyển từ phải về trái, thì dần dần nó sẽ bị khuyết dần.

=> Do đó cần sử dụng cơ chế lặp lại. Nghĩa là sử dụng 2 hàm apply background vào màn hình. Để liên tục bao phủ màn hình

Hãy cùng xem hình minh họa sau:

Phân tích như sau:

+ Image sẽ được di chuyển từ phải qua trái, lên rect.x sẽ liên tục được trừ đi một lượng x_offset.

Giá trị này nhỏ thôi, ví dụ 1 pixel cho mỗi lần di chuyển.

+ rect.x sẽ được sử dụng lần apply surface thứ nhất.

+ Ngay sau đó lần apply surface thứ 2 sẽ sử dụng : rect.x’ + width = rect.x + width – x_offset   (ban đầu rect.x = 0)

=> Lần apply thứ 2:   Một background  được apply tiếp sẽ nối đuôi với background bị di chuyển trong lần apply 1.

=> Liên tục bao phủ được màn hình mà không sợ bị khuyết.

Một câu hỏi đặt ra:

Vậy giả sử khi ảnh background lần 2 đi hết thì sao. CHẲNG NHẼ LẠI APPLY tiếp lần 3 lần 4?

Câu trả lời là không cần. Chúng ta sẽ chặn giới hạn cho lần apply1.

Khi back ground 1 đi hết, nghĩa là rect.x bị trừ liên tục cho đến khi nó nhỏ hơn < – width.

Đúng thời điểm đó thì rect.x của back ground 2 cũng bắt đầu nhỏ hơn 0.

Do đó lúc này ta chỉ cần sét lại rect.x = 0 => Mọi thứ lại trở về ban đầu.

Như vậy chỉ cần 2 lần apply là đủ để liên tục bao phủ background cho màn hình mà vẫn đảm bảo được background chuyển động.

Ưu điểm:

+ Không phải thiết kế một tấm ảnh có bề rộng dài, mà chỉ cần tấm ảnh bằng kích thước windows.

Nhược điểm:

+ Cảnh bị lặp lại, do đó ảnh background thường là những cảnh đơn điệu không có sự đa dạng trong bối cảnh tạo sự sinh động.

+ Phải sử dụng 2 lần apply surface. Nếu tính toán không chuẩn dễ gây ra hiệu ứng nhòe màn hình khi có khoảng trống.

 

b. Sử dụng một ảnh có kích thước bề rộng thật lớn.

Cách số 2 này, chúng ta sẽ thiết kế một background có chiều dài thật lớn.

+ Dài bao nhiêu là do chúng ta quy định, và chúng ta coi nó như độ dài một bài lesson trong game.

Ví dụ màn hình screen là 1200×600.

Chúng ta sẽ tạo một background ví dụ như là:  4800×600

Nhìn hình minh họa trên các bạn sẽ thấy.

Không cần apply 2 lần surface.

+ Ảnh sẽ được load cho đến khi gần cuối.

+ Thường sẽ giới hạn rect,x đến khi ảnh gần cuối thì sẽ dừng lại để chiến đấu với boss và kết thúc bài.

Ưu điểm:

+ Ảnh không có tính chất lặp lại nên nó thể hiện được nhiều cảnh quan sinh động.

+ Chỉ dùng một lần apply surrface, nên không lo chuyện nối ghép, hay sự rời rạc.

 

Nhược điểm.

+ Thiết kế ảnh phức tạp hơn, mất thời gian hơn.

+ Tính toán lại vị trí xuất hiện của threats trên backgroud cho phù hợp, vì lúc này size ảnh và size màn hình là khác nhau.

Ok. Và giờ chúng ta sẽ bắt đầu thực hành.

II. Thực hành di chuyển màn hình trong lập trình Game c++ SDL

Các bạn download hai tấm ảnh sau về để làm demo:              => Link down

KHÔNG DOWN ẢNH TRÊN BLOG: vì tôi đã thu nhỏ lại nên chất lượng ko chuẩn.

Ok. Sau đó xem video để thực hành tốt hơn.

____________________________________________________

Pass Pham

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.