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

Standard

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

Lần trước ta đã dùng 1 biến đại diện cho gravity, đó là gnGravity, mục đích là để tăng khả năng tùy biến lên một tầm cao hơn. Dẫu vậy cuối cùng lại chẳng dùng đến những cái “cao” đó. Vậy nên chúng ta sẽ quay về với thực tại :-s

Ý tưởng.

    • Việc nhảy sẽ thực thi khi người dùng nhấn và bỏ phím Space (sự kiện Key_Press)
    • Khi bắt đầu nhảy, tạo 1 vận tốc đầu và gia tốc.
    • Vật sẽ nhảy đến khi vận tốc = 0 thì rơi xuống. Trong quá trình rơi vật dừng lại khi gặp vật cứng (Solid).
    • Trong quá trình nhảy, phím Space vô tác dụng.

Thực hiện.

1. Tạo object và room

Tương tự v1.0, nhưng lần này ta tạo 1 phòng rộng hơn và nhiều object hơn🙂

9-23-2010 09-47-33

2. Viết code

1. Giống v1.0, ta khai báo 1 vài biến cần thiết dùng chung tại sự kiện Create của Main:

globalvar gcnMaxVspeed, gcnGravity, gcnHSpeed; // Khai bao cac bien dung chunggcnMaxVspeed = 16; // Gia tri van toc khi bat dau nhaygcnGravity = 1; // Gia tri gia toc roi tu dogcnHSpeed = 4;hspeed = gcnHSpeed;vspeed = 0;

Nếu như ở v1.0, ta xác định quá trình nhảy có đang diễn ra hay không bằng biến gbJumping – việc này là không cần thiết và khiến vấn đề trở nên phức tạp trong một vài trường hợp smile_embaressed Ta sẽ làm theo một hướng khác, đó là kiểm tra xem Main có đang đứng trên một vật cứng hay không smile_regular

2. Tại sự kiện Step của Main:

move_outside_solid(90,32); // Tranh vat cung.

// ==={JUMP}===

// Bat dau nhayif keyboard_check_pressed(vk_space) && !place_free(x, y + 8)    {    vspeed = - gcnMaxVspeed;    gravity = gcnGravity;    }

// Qua trinh nhayif abs(vspeed) > gcnMaxVspeed // Gioi han van toc roi cuc dai    {    vspeed = (vspeed/abs(vspeed)) * gcnMaxVspeed;    }

if !(place_free(x, y + vspeed)) // Neu voi van toc hien tai vat cham vat cung gan nhat    {    if vspeed > 0 // Neu dang di xuong        {        while (place_free(x, y + 1)) // Di den sat vat cung            {            y += 1;            }        }    if vspeed < 0 // Neu dang di len        {        while (place_free(x, y - 1)) // Di den sat vat cung            {            y -= 1;            }        }    vspeed = 0;    }

// ==={JUMP}===

// ==={MOVE}===

// Di chuyenif !(place_free(x + hspeed, y)) // Doi chieu khi gap vat cung    {    hspeed = - hspeed;    }

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

// ==={MOVE}===

Bạn có thể đọc chú thích để hiểu nhiệm vụ của đoạn code trên. Có một số vấn đề cần lưu ý như sau:

  • Trong nhiều trường hợp, Main sẽ bị mắc kẹt tại vật cứng, để tránh điều này, ta dùng hàm move_outside_solid(90,32) – tức tránh vật cứng theo hướng đi lên (90 độ), khoảng cách tối đa là 32 pixel.
  • Chúng ta dùng biến gravity có sẵn thay vì tạo biến gnGravity. Và vì gravity là một biến thời gian thực trong Game Maker nên ta không cần xử lý giá trị của vspeed như v1.0 (ngoại trừ việc giới hạn tốc độ rơi tối đa).
  • Nếu như ở v1.0, khi vspeed quá lớn dẫn đến Main chạm vật cứng, ta dùng hàm move_contact_solid ~> sẽ khiến game có vẻ bị khựng khi Main gần tiếp đất. Để khắc phục, ta tạo một vòng lặp và tăng/giảm dần y cho đến khi Main ở sát vật cứng.
  • Khi vật di chuyển khỏi vật cứng, ta xử lý quá trình rơi tự do bằng cách đặt giá trị cho gravity.
  • Có thể bạn sẽ thắc mắc vì sao ở phần check phím Space lại là !place_free(x, y + 8) chứ không phải !place_free(x, y + 1) (đây chính là giải pháp thay cho việc dùng biến gbJumping) Sarcastic smile Là bởi vì đối với những trường hợp khi mà vật cứng có diện tích nhỏ, hspeed lại tương đối lớn thì việc để Main tiếp đất rồi nhảy ngay lập tức sẽ khá khó khăn. Ta linh động bằng cách tăng lên 1 giá trị vừa phải (có lẽ 8 là hơi quá Thinking smile), như vậy người dùng sẽ có thể nhấn Space trước khi Main tiếp đất để thực hiện việc nhảy sang chỗ khác Wink

3. Preview

One thought on “[Game Maker] Jumping in Platform Game [v2.0]

  1. Pingback: [Game Maker] Jumping in Platform Game [v3.0] |

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