Thứ Năm, 8 tháng 9, 2016

ỨNG DỤNG CÔNG THỨC VẬT LÝ ĐỂ TẠO HIỆU ỨNG

ỨNG DỤNG CÔNG THỨC VẬT LÝ ĐỂ TẠO HIỆU ỨNG

Tác giả: Võ Xuân Minh Tuấn

Mục đích: bài này trình bày cách thức áp dụng công thức tính toán của vật lý để tạo ra hiệu ứng trong môi trường Alice. Ở đây, chúng tôi thực hiện ví dụ trên trò chơi khá nổi tiếng là Flappy Bird nhằm gợi ý việc ứng dụng các công thức mà chúng ta đã từng học thời phổ thông đề ứng dụng tạo hiệu ứng trong Alice. Bên cạnh đó, chúng tôi cũng giới thiệu một số kỹ thuật cần thiết để ứng dụng trong việc làm game như là chơi tiếp tục khi bị mất mạng, giữ nguyên điểm số trong quá trình chơi

Tác giả: Võ Xuân Minh Tuấn

Mục đích: bài này trình bày cách thức áp dụng công thức tính toán của vật lý để tạo ra hiệu ứng trong môi trường Alice. Ở đây, chúng tôi thực hiện ví dụ trên trò chơi khá nổi tiếng là Flappy Bird nhằm gợi ý việc ứng dụng các công thức mà chúng ta đã từng học thời phổ thông đề ứng dụng tạo hiệu ứng trong Alice. Bên cạnh đó, chúng tôi cũng giới thiệu một số kỹ thuật cần thiết để ứng dụng trong việc làm game như là chơi tiếp tục khi bị mất mạng, giữ nguyên điểm số trong quá trình chơi

Trong nội dung bài, chúng tôi sẽ mô tả cách tạo ra các nhân vật trong trò chơi song song đó sẽ giới thiệu cho quí vị thấy cách áp dụng công thức bằng cách xây dựng hàm và ứng dụng trong quá trình xử lý để tạo ra hiệu ứng của trò chơi.

Trong hình bên dưới là màn hình chứa các method chính, event chính. Method StartPlay (đây sẽ chính là phương thức sẽ được kích hoạt đầu tiên khi chương trình chạy). Bên cạnh đó, chúng tôi đã biểu diễn các vị trí của các object làm mốc chính trong virtual world. Các object còn lại đều được xác định vị trí bằng code dựa trên các object làm mốc chính như là

-          Chướng ngại vật Ball1, Ball2 (Màu vàng)

-          Mây (cloud1, cloud2)

-          BlueBirdShow

-          PinkBird.

-          BlueBirdInvi.

-          BallStartPoint: Màu đen.

-          BallEndPoint: Màu đỏ.

1.       Nhân vật Blue Bird

1.1.     Cấu tạo

-          Blue Bird được xây dựng từ 03 object xếp chồng lên nhau ở vị trí xuất phát.

·         Bluebirdinvi: Object chính, giữ vai trò chuyển động lên xuống và va chạm.

·         BluebirdShow: Object hiển thị, object duy nhất được nhìn thấy trong khi chơi, dùng để hiển thị các hiệu ứng đồ họa.

·         Pinkbird: Dùng để đánh dấu vị trí xuất phát, phục vụ cho việc chơi lại sau khi chết.

·         Hình bên dưới thể hiện màn hình đầu tiên của ứng dụng

1.2.    Hiệu ứng tạo ra sự sống động cho chương trình

1.2.1.  Hiệu ứng Đập cánh

-          Hành động này được áp dụng cho object Bluebirdshow

·         Chúng tôi sử dụng kỹ thuật capture pose để tạo ra 03 tư thế đập cánh của bluebird như hình bên dưới

·         Xây dựng Method bluebirddapcanh với parameter dura quy định thời gian của một lần đập cánh (ở đây chúng tôi áp dụng bằng giá trị 4*dura)

1.2.2. Hiệu ứng Bay

-          Đây là hiệu ứng quan trọng nhất và chính yếu nhất trong ứng dụng

-          Ở đây, để làm nhanh tốc độ game trong quá trình chơi., chúng tôi áp dụng cách thức là tất cả các chuyển động trong phần này đều được chia cho biến toàn cục GameSpeed (Quí vị vui lòng xem chi tiết phần này tại mục 5.1)

-          Chuyển động bay lên xuống của Bluebird trong flappy bird khá phức tạp, chúng tôi thưc hiện chia chuyển động đó thành nhiều khoảng nhỏ để tiện mô tả, mỗi khoảng kéo dài 0,02s. Bên cạnh đó, chúng tôi sẽ kết hợp hiệu ứng bluebirdshow quay đầu lên xuống để tạo cảm giác chim đang di chuyển.

-          Để thực hiện điều này, chúng tôi xây dựng method birdflystep, với thành phần như sau

·         time: tham số này dùng để thể hiện khoảng thời gian của 1 chuyển động với giá trị gán mặc định là 0,02.

·         HowFar: biến này dùng để lưu độ dài của một bước chuyển động với giá trị là 0,02s.

·         rollHowMany: biến này hỗ trợ tính số vòng xoay của bluebirdshow.

-          Trong hàm, chúng tôi thực hiện tính toán giá trị của biến HowFar theo công thức vật lý                 x-x0=v0t+gt2/2, trong đó:

·         HowFar=x-x0

·         v0=speed: 1 biến cục bộ để lưu vận tốc hiện tại của bluebird.

·         g=GiaToc: 1 hằng số quy định gia tốc rơi tự do, ở đây tôi cho bằng -150m/s2 thay vì -9.8 m/s2 như thực tế để đẩy nhanh tốc độ nhằm tăng độ khó.

·         Hình bên dưới thể hiện biến GiaToc cùng giá trị khởi tạo của nó

-          Kế tiếp, chúng tôi mô tả chuyển động lên xuống của BlueBird như hình bên dưới

-          Chúng tôi thực hiện mô tả chuyển động xoay của BlueBirdShow với 02 tình huống

·         Tình huống 1 xảy ra khi TurnFace==True: Tình huống này xảy ra khi người chơi vừa nhấn nút Up và BluebirdShow được thiết lập trả về vị trí ban đầu. Đồmg thời trả giá trị biến TurnFace thành False.

·         Tình huống 2: Ngược lại, BlueBirdShow sẽ turn forward 2/100 revolution.

·         Về biến TurnFace: Trong quá trình chuyển động, BlueBird sẽ xoay mặt dần về phía mặt đất để tạo hiệu ứng lao xuống, khi người chơi nhấn Up, chúng ta cần điều chỉnh cho BlueBird xoay mặt lên để tạo hiệu ứng lao lên. Thay vì điều chỉnh ngay khi người chơi nhấn Up, chúng tôi chọn cách đánh dấu lại bằng cách đánh dấu bằng biến toàn cục TurnFace rồi sau đó điều chỉnh ở đây để tránh một số phiền phức trong quá trình thực hiện.

 

-          Sau mỗi chuyển động, chúng ta sẽ cần tính và lưu lại vận tốc của BlueBird sau mỗi chuyển động theo công thức vật lý v=v0+gt, trong đó:

·         v và v0 là giá trị tốc độ tịnh tiến lên xuống của BlueBird trước và sau lần chuyển động đang thực hiện, tương ứng với biến Speed.

·         g là gia tốc rơi tự do như ở trên tương ứng với hằng số GiaToc.

·         t là thời gian chuyển động tương ứng với parameter time.

-          Tổng quát, chúng ta có toàn bộ method hỗ trợ choc him bay trong cho trò chơi như sau

1.2.3. Hiệu ứng BirdDie

-          Hiệu ứng này được áp dụng khi chim chết, tận dụng thủ tục BirdFlyStep để tạo hiệu ứng chim lao đầu xuống khi chết.

-          Biến Speed ở đây chính là biến toàn cục Speed xử dụng ở hiệu ứng bay 1.2.1.

-          Khi chim chết, ta trả giá trị Speed về 0 để chim bắt đầu quá trình lao đầu xuống. Sau đó, chúng ta gọi 15 lần thủ tục BirdFlyStep, đồng thời phát ra âm thanh khi chết.

-          Việc đưa giá trị của biến Speed về 0 nhằm mục đích làm dừng chuyển động tịnh tiến lên xuống hiện tại của BlueBird để bắt đầu quá trình rơi tự do. Việc gọi 15 lần thủ tục BirdFlyStep đảm bảo BlueBird lao xuống.

1.2.4.     Function IfAlive

-          Function này hỗ trợ kiểm tra chim đã bị va chạm hay chưa?

-          Function liên quan đến các thành phần trong trò chơi như là

·         Ball1, Ball2: Các chướng ngại vật được xây dựng để thay thế cho ống cống xanh trong bản gốc flappy bird.

·         BallEndPoint: object được xây dựng nằm ở ngoài màn hình, ngay dưới bluebird để đánh dấu vị trí thấp nhất bluebird có thể bay đến mà không chết.

-          Các tình huống xử lý:

·         BlueBird va chạm với Ball1 hoặc Ball2: function này sẽ trả về giá trị False.

·         BlueBird bay thấp hơn mức an toàn: điểu này có nghĩa chim va chạm với BallEndPoint, cho nên function này cũng trả về giá trị False.

·         BlueBird bay cao hơn mức an toàn: điểu này có nghĩa khoảng cách từ chim tới BallEndPoint lớn hơn 3.5 mét, và function sẽ trả về giá trị False.

·         Ngược lại, function sẽ trả về giá trị True.

 

 

1.2.5.  Cập nhật nội dung mới xây dựng vào startPlay

-          Chúng ta sẽ cho bluebird bay theo các khoảng 0,02s bằng thủ tục BirdFlyStep cho đến khi biến StillAlive – nhận giá trị từ hàm IfAlive trả về giá trị False nghĩa là chim đã va chạm, tương đương với thua cuộc.

1.3.    Xây dựng event cho phím mũi tên hướng lên:

-          Chúng ta chỉ xây dựng một event duy nhất để chỉnh lại tốc độ của bluebirdinvi và vị trí của bluebirdshow kết hợp đồng thời phát tiếng đập cánh khi người chơi nhấn phím up.

2.       Xây dựng các chướng ngại vật:

-          Trong ứng dụng này, chúng ta sẽ xây dựng hai chướng ngại vật đã nêu trên lần lượt là Ball1 và Ball2

2.1.    ballGo

-          Đây là một method thực hiện cơ chế để di chuyện hướng ngại vật tạo nên độ khó cho chương trình

-          Các parameter của method này bao gổm

·         whatBall: xác định Ball1 hoặc Ball2 được đưa vào hàm để xử lý

·         MoveUpHowFar: Quy định độ cao của chướng ngại vật nhằm tạo sự khác biệt giữa những lần xuất hiện khác nhau của chướng ngại vật.

-          Đầu tiên, chúng ta cho whatBall move to BallStartPoint (điểm xuất phát của tất cả các chướng ngại vật), sau đó, cho whatBall quay mặt về phía điểm đích là BallEndPoint.

-          Thực hiện whatBall move up MoveUpHowFar nhằm chỉnh lại vị trí xuất phát.

-          Sau đó, cho whatBall move forward 1 khoảng howfar với giá trị khoảng cách từ điểm xuất phát đến điểm đích + 0.55 mét.

2.2.    Bổ sung thành phần mới xây dựng vào startPlay

-          Ở đây, chúng ta dùng hàm random tạo sự khác biệt vị trí giữa các chướng ngại vật thông qua biến HowFar.

-          Để giảm độ khó, chúng ta chỉ để xuất hiện cùng lúc 2 chướng ngại vật với điều kiện khoảng cách giữa chúng phải lớn hơn 1,2 mét. Ngược lại, chúng ta chỉ cho phép ball1 xuất hiện

2.3.    Cách tính điểm sau khi bluebird vượt qua chướng ngại vật

-          Ở đây, chúng tôi định nghĩa rằng chỉ cần chướng ngại vật đi hết lộ trình, nghĩa là bluebird đã vượt qua chướng ngại vật, ta sẽ tiến hành tăng điểm. Để tăng độ khó cho game, chúng ta tăng đồng thời giá trị gamespeed.

2.4.    Tổng quan của phương thức startPlay

-          Đặt các thành phần xây dựng ở trên vào method startPlay

3.       Hoàn tất startPlay

4.       Các hiệu ứng nền

4.1.    Các đám mây

-          Chúng ta thực hiện tương tự với như với các chướng ngại vật. Chúng ta cần chỉnh lại thời gian và khoảng cách thích hợp.

-          Cập nhật my first method

4.2.    Bầu trời:

-          Chúng ta thực hiện làm bầu trời di chuyển.

5.       Kiểu dữ liệu và giá trị khởi tạo của biến toàn cục

5.1.    Biến GameSpeed, MaxGameSpeed và DefaultGameSpeed:

-          Mục đích của biến GameSpeed: Tăng tốc độ chơi theo điểm số để tăng dần độ khó, giảm nhàm chán cho game.

-          DefaultGameSpeed: Là hằng số giá trị ban đầu của GameSpeed, chúng tôi đã thiết lập giá trị mặc định là 1. Bên dưới là phần code dùng ở đầu method StartPlay nhằm mục đích điều chỉnh giá trị ban đầu của GameSpeed.

-          Biến maxGameSpeed: Là hằng số, quy định giá trị cao nhất có thể đạt được của GameSpeed. Ở đây, chúng tôi chọn giá trị là 2, nhưng giá trị này có thể thay đổi để tăng độ khó.

-          Cách thức hoạt động của biến GameSpeed

o   GameSpeed sẽ tăng dần theo điểm số cho nên chúng ta sẽ thực hiện cùng lúc với tăng điểm số trong phần tính điểm (quí vị vui lòng xem lại mục 2.3) của chương trình chính StartPlay.

o   Với cách thức chia Duration của các chuyển động chính cho GameSpeed, tốc độ chơi sẽ thay đổi tỉ lệ thuật với biến này.

o   Ở đây, các chuyển động chính là chuyển động lên xuống và xoay của BlueBird trong thủ tục BirdFlyStep (quí vị vui lòng xem lại mục 1.2.2) và chuyển động tịnh tiến của 2 chướng ngại vật Ball1 và Ball2 trong BallGo (quí vị vui lòng xem lại mục 2.1).

Chúc mừng quí vị đã hoàn tất ứng dụng với việc kết hợp với công thức vật lý để làm hiệu ứng. Hẹn gặp quí vị ở chủ để khác

Không có nhận xét nào:

Đăng nhận xét