[Game Maker] Jumping in Platform Game [v3.0]

Standard

[Game Maker] Jumping in Platform Game [v2.0]

[Game Maker] Jumping in Platform Game [v1.0]

Ở các version trước, ta sử dụng những biến có sẵn của GM như vspeed, hspeed, gravity… Đó là những biến thời gian thực, tức tự nó sẽ tác động đến object tương ứng, hay tự tác động lẫn nhau (giữa speed và gravity). Ta biết rằng những sự thay đổi đó diễn ra tại event Step, tuy nhiên diễn ra theo thứ tự nào thì ta chưa biết, chưa kể đến mỗi một step còn có 2 sự kiện khác là Begin Step và End Step.

Dễ thấy rằng khi một object di chuyển bằng các biến speed có sẵn, quá trình di chuyển sẽ không bao gồm việc kiểm tra vật cản (tức kiểm tra xem object có bị chặn hay không). Chúng ta đã cố gắng khắc phục vấn đề này bằng cách kiểm tra trước khi object đến một vị trí mới, tuy nhiên sự lệ thuộc vào các biến có sẵn cộng với sự phức tạp khi xử lý các sự kiện của 1 step khiến cho công việc trở nên quá khó khăn mà lại không hiệu quả. Bởi vậy, chúng ta sẽ bước sang một hướng khác – tự tạo các biến về tốc độ cũng như gia tốc, và dùng chúng để di chuyển object.

Sự kiện Create

globalvar 
gcnMaxVspeed, gcnGravity, gcnHSpeed, gcnMainHeigh, 
gbIncVspeed, gbCantJump, gnVspeed, 
gnHspeed, gnGravity; // Khai bao cac bien dung chung

gcnMaxVspeed = 18; gnVspeed = 0// Van toc di chuyen doc cuc dai
gcnGravity = 1; gnGravity = 0 // Gia tri gia toc roi tu do
gnHspeed = 4 // Van toc di chuyen ngang
gbIncVSpeed = 1
gbCantJump = 0
gcnMainHeigh = 32

Sự kiện Step

if place_free(x, y + 1) {gnGravity = gcnGravity} else {gnGravity = 0} // Roi tu do

gnVspeed += gnGravity // Van toc bien thien theo gia toc

if keyboard_check(vk_space) && !place_free(x, y + gcnMainHeigh / 8) // Phim Space dang duoc nhan
    {
    if gbCantJump = 0
        {
        if gbIncVspeed = 0
            {
            gnVspeed = - gcnMaxVspeed // Tao van toc ban dau
            gbIncVSpeed = 1
            gnGravity = gcnGravity
            }
        if gbIncVspeed = 1 {gnVspeed -=  gnGravity} // Tang dan van toc nhay theo thoi gian nhan phim Space
        }
    }
        
if (keyboard_check_released(vk_space) && (gnVspeed < 0)) {gnVspeed += ceil(abs(gnVspeed) * 0.5)} // Giam van toc nhay khi bo phim Space

if abs(gnVspeed) >= gcnMaxVspeed // Gioi han van toc cuc dai
    {
    gnVspeed = (gnVspeed/abs(gnVspeed)) * gcnMaxVspeed
    gbCantJump = 1
    }
    
var nSign;
nSign = abs(gnHspeed) / gnHspeed
for (i = nSign ; abs(i) <= abs(gnHspeed) ; i+= nSign) // Di chuyen ngang
    {
    if !place_free(x + i, y) { gnHspeed = -gnHspeed ; break;}
    }
x += i - nSign

if gnVspeed <> 0
    {
    nSign = abs(gnVspeed) / gnVspeed
    for (i = nSign ; abs(i) <= abs(gnVspeed) ; i+= nSign) // Di chuyen doc
        {
        if !place_free(x, y + i) {gnVspeed = 0 ; gbCantJump = 0 ; gbIncVspeed = 0 ; break;}
        }
    y += i - nSign
    }
    

Không cần giải thích gì thêm vì nếu đã đọc các bài trước thì bạn hoàn toàn có thể hiểu được toàn bộ nhiệm vụ của đoạn code trên alt Về thứ tự các câu lệnh bạn hoàn toàn có thể thay đổi theo ý muốn.

Preview

Ngại quay quá alt Nhưng đảm bảo là rất trơn tru và chính xác (tất nhiên mang tính tương đối vì quá trình di chuyển dọc và ngang ta không xử lý đồng thời) alt

Như vậy vấn đề nhảy trong game đi cảnh đã được giải quyết khá ổn, chấm dứt tại đây, số 3 là một số đẹp, số 4 thấy nó cứ xấu xấu làm sao ấy alt

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s