[Hướng Dẫn] Di chuyển vòng tròn

Focker_cFocker_c Posts: 1,577Registered
edited July 2019 in Game Maker: Studio
Hey yo, what's up !

It's me Focker.

Hôm nay thì mình sẽ hướng dẫn về di chuyển vòng tròn.
Trước nhất là trên GMS, vì engine này chưa có function để bắt object di chuyển kiểu vòng tròn.
Còn đối với các engine khác, các bạn cũng có thể tham khảo vì mình nói về nguyên lý chung về cách 1 vật thể di chuyển vòng tròn.
Mình sẽ hướng dẫn các bạn lập ra 1 script function như sau :
move_round (ct_x, ct_y, rad, spd)

Trong đó :
ct_x là tọa độ x của tâm vòng tròn (ct là viết tắt cho center) ;
ct_y là tọa độ x của tâm vòng tròn ;
radi là bán kính (radius) ;
spd là tốc độ di chuyển (speed) .
Như vậy vật thể của chúng ta sẽ liên tục xoay quanh 1 tâm có tọa độ (ct_x,ct_y) , và luôn cách tâm 1 khoảng cách radi. Sau mỗi step, vật thể di chuyển thêm 1 khoảng cách là spd so với vị trí của step trước.
Mình sẽ cho các bạn xem đoạn script trước rồi thì trình bày sau :
ct_x = argument0
ct_y = argument1
radi = argument2
spd = argument3

dir_cur = point_direction(ct_x,ct_y,x,y);
dir_next = dir_cur + spd 
x = lengthdir_x(radi,dir_next) + ct_x;
y = lengthdir_y(radi,dir_next) + ct_y;
4 dòng đầu chỉ là mình nhập các dữ liện của function vào các biến đã giải thích bên trên.
8dqre8ioounbaoozgjpg

Khi này các bạn hãy hình dung là 1 vòng tròn vô hình (nhưng mình đã vẽ nó màu đen như hình vẽ).
Trước tiên là mình tìm ra góc độ hiện tại của tâm (Đỏ) so với điểm đang đứng hiện tại của vật thể (Xanh). Góc độ hiện tại dir_cur (viết tắt của direction_current ấy mà) được tính dựa trên 2 điểm là (ct_x,ct_y) là tọa độ tâm và (x,y) là tọa độ hiện tại của vật thể. Cho nên :
dir_cur = point_direction(ct_x,ct_y,x,y);
Góc độ này mình cũng đã vẽ màu xanh trong hình.
Và ở trong step tiếp theo , vật thể cần đi tới 1 điểm mà vẫn thuộc trên vòng tròn (điểm Vàng trong hình). Cho nên góc tọa với tâm sẽ lớn ra hơn 1 chút. Hay là dir_cur sẽ phải lớn hơn 1 chút để vật thể tới được điểm Vàng. Góc độ mới sẽ tính bằng :
dir_next = dir_cur + spd
Nếu các bạn suy luận tốt, thì spd chính là góc nhỏ màu Xám trong hình. 
Rồi, bây giờ đã tìm ra góc độ mới, việc cần làm là tính ra tọa độ của vật thể nếu ở góc độ mới ấy.
x = lengthdir_x(radi,dir_next) + ct_x;

y = lengthdir_y(radi,dir_next) + ct_y;
Mình giải thích 1 dòng thì các bạn sẽ tự hiểu dòng còn lại. 
lengthdir_x(r,k) sẽ trả về tọa độ x của điểm mà cách gốc (0,0) một khoảng là r và theo góc độ là k.
Như vậy 
x = lengthdir_x(radi,dir_next) (chưa đủ nhé)
sẽ đưa tọa độ x tới vị trí điểm mới mà soi tới tâm với góc độ mới đã tính bên trên, và đưa vào bán kính radi chỉ là để chính xác điểm soi tớ lài tâm chứ ko phải điểm nào khác. Dù có chạy ở đâu đâu trên đường tròn thì luôn cách tâm 1 khoảng là radi mà.
Ở cuối mỗi dòng thêm vào + ct_x+ ct_y là để gắn cái gốc (0,0)  vào là tâm của hình tròn thôi.

Xin HẾT.
Bài hướng dẫn chỉ mang tính nâng cao trình độ lập trình, thuật toán.
Nếu bạn là người dùng GMS mà muốn ăn sẵn thì hãy copy đoạn srcipt trên vào script folder của bạn và đặt tên là move_round.
Khi cần dùng đến thì bạn dùng lệnh move_round (ct_x, ct_y, rad, spd)

Mở rộng :
- Bạn hãy tự tìm cách để vật thể xoay theo chiều ngược lại thử xem ?
- Nếu bạn tinh ý, dir_next cứ liên tục bị cộng thêm spd. Dù là GMS có thể tự quy nếu góc vượt quá 360 thì lại về 0 độ, ví dụ như là 370 thì coi như 10 độ ấy. Nhưng nếu cứ xoay mãi thì sẽ cộng ra con số lớn, vậy bài tập mở rộng cho bạn là hãy làm bước quy đổi như trên, nếu vượt quá 360 thì tự quay về 0 độ.

Cảm ơn.

Comments

Sign In or Register to comment.