[Game Maker] Vận tốc tức thời và ứng dụng trong game ném bóng

Standard

Đây là một vấn đề đã từng nghĩ đến rất nhiều lần, nhưng không có hướng giải quyết (cũng chẳng hiểu sao lại không nữa Confused smile). Tình cờ chơi game này, ham muốn trỗi dậy Smile

Flight | Armor Games

Mục tiêu rất đơn giản: Làm một ví dụ nhỏ, gồm 1 quả bóng và vài viên gạch làm nền, nhấn chuột trái để di chuyển quả bóng, và bỏ chuột để ném nó đi (gia tốc chiều thẳng đứng, hướng xuống, không xét lực cản không khí).

1-18-2011 23-16-11

Để chủ động hơn, ta xử lý các sự kiện liên quan đến chuột trong event Step, với lưu ý:

  • Nhấn chuột trái 1 lần vào bóng để chọn, tiếp tục giữ chuột để di chuyển bóng.
  • Trạng thái bỏ chuột được xác định bằng 2 điều kiện: Bóng đang được điều khiển bởi chuột, và hiện tại chuột trái không được giữ.
    if mouse_check_button(mb_left) = true // Neu chuot trai duoc nhan...
    {
        if (abs(mouse_x - x) < 32) && (abs(mouse_y - y) < 32) // ... tai vi tri cua oO
        {
            bDown = true // oO dang duoc dieu khien boi chuot
        }
    }
    
    if (mouse_check_button(mb_left) = true) && (bDown = true) // Neu chuot trai tiep tuc duoc nhan thi di chuyen oO theo con tro chuot
    {
        gravity = 0 // Gan gia toc = 0 de oO khong bi roi khi dang duoc dieu khien bang chuot
        // Dat oO vao vi tri con tro chuot
            x = mouse_x
            y = mouse_y
    }
    
    if (bDown = true) && (mouse_check_button(mb_left) = false) // Su kien bo chuot trai lan dau tien tinh tu khi oO duoc dieu khien boi chuot
    {
        bDown = false  // oO dang khong duoc dieu khien boi chuot
    }
    

Vì Game Maker sử dụng step làm đơn vị thời gian, nên độ dịch chuyển tọa độ của 1 object trong 1 step cũng chính là vận tốc tức thời của object đó. Như vậy, khi bóng đang được điều khiển bởi chuột, tại mỗi step ta sẽ tính toán giá trị tức thời này, và khi bỏ chuột, ta sẽ gán cá giá trị đó vào vận tốc của bóng:

if (mouse_check_button(mb_left) = true) && (bDown = true) // Neu chuot trai tiep tuc duoc nhan thi di chuyen oO theo con tro chuot
{
    gravity = 0 // Gan gia toc = 0 de oO khong bi roi khi dang duoc dieu khien bang chuot
    // Dat oO vao vi tri con tro chuot
        x = mouse_x
        y = mouse_y
    // Tinh van toc tuc thoi dua tren do dich chuyen toa do trong khoang thoi gian 1 step
        nDeltaX = x - xprevious
        nDeltaY = y - yprevious
}

if (bDown = true) && (mouse_check_button(mb_left) = false) // Su kien bo chuot trai lan dau tien tinh tu khi oO duoc dieu khien boi chuot
{
    bDown = false  // oO dang khong duoc dieu khien boi chuot
    // Gioi han van toc toi da = 128 / 4 = 32 (tri tuyet doi)
        vspeed = min(abs(nDeltaY), 128) * sign(nDeltaY) / 4
        hspeed = min(abs(nDeltaX), 128) * sign(nDeltaX) / 4
}

Về cơ bản thì vấn đề chỉ có vậy, tuy nhiên ta sẽ cần thêm vài dòng code cho các sự kiện của bóng như rơi tự do, chạm đất… và ngoài ra, để quá trình chuyển động của bóng thực hơn và dễ theo dõi hơn, ta sẽ trang trí một chút, như vẽ tọa độ đề các, hiển thị thông số về vận tốc + gia tốc, vẽ mũi tên chỉ hướng di chuyển và một bản đồ mini…

110119 - Instant Velocity

Chi tiết các bạn tham khảo file .gmk bên dưới, hoặc để xem thử thành quả, các bạn coi file .exe (nén trong file zip).

Instant Velocity.gmk (12.3 KB)

Instant Velocity.zip (1.2 MB)

5 thoughts on “[Game Maker] Vận tốc tức thời và ứng dụng trong game ném bóng

  1. bạn ơi cho mình hỏi làm sao chuyển từ file .gmk sang .exe
    để chạy độc lập và gửi cho người khác
    trả lời vào mail của mình nhá

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