Phát hiện va chạm 2D cho trò chơi Pinball


9

Cho đến nay trong các trò chơi trước, tôi đã sử dụng va chạm 2D đơn giản với các hộp sau đó kiểm tra ở mức pixel xem có va chạm không.

Nếu thực hiện một trò chơi pinball trong gần nhiều khung hình, quả bóng sẽ tiếp xúc với một bức tường hoặc một bề mặt khác, vậy có cách tiếp cận nào khác không?

Câu trả lời:


19

Quay trở lại những ngày (1990), các trò chơi pinball cũ đã được thực hiện như thế này:

Có một số lớp cho sân chơi (những gì bạn thấy khi chơi trò chơi):

nhập mô tả hình ảnh ở đây

và một số lớp cho va chạm:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Hình ảnh thang độ xám bên trái là bản đồ va chạm cho trò chơi chính, hình bên phải là bản đồ va chạm cho khu vực đặc biệt: đường dốc pinball.

White = diện tích tự do cho bóng, chỉ số màu có 255.

Gray= bóng sẽ bị "đẩy ra" khỏi khu vực này. chỉ số màu = góc của vector để thêm vào vị trí bóng. xám nhạt = 0 độ. màu xám đậm = 360 độ.

Một số mã giả:

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

Một số chỉ số màu sắc đặc biệt cũng có thể được sử dụng cho một cái gì đó khác hơn là va chạm, một loạt màu sắc tùy chỉnh (ví dụ: 240-255) có thể được dành cho việc phát hiện vùng đặc biệt như spinners, triggers, bumpers, holes, ...

Như bạn có thể thấy, điều này rất đơn giản. Chỉ có một vài pixel "đọc" trên mỗi khung. Do đó, bạn có thể thực hiện mô phỏng vật lý chạy ở tốc độ khung hình cao thực sự, ví dụ: 200 khung hình / giây. Sử dụng tốc độ khung hình cao sẽ mô phỏng trơn tru và giảm "đường hầm" (điều này xảy ra khi bóng đi quá nhanh và vượt qua các yếu tố máng mà không va chạm). Sự đơn giản đó cũng là điều làm cho các trò chơi pinball mượt mà có thể trở lại 386 computers(và thậm chí nhanh 286) trong những ngày qua (trong số một số thủ thuật khác như đạp xe màu, cuộn vga và che mặt nạ ...).

Ngày nay, hầu hết các trò chơi pinball không còn được thực hiện như thế này. Thay vào đó, sân chơi là một cảnh 2d / 3d sử dụng đa giác hoặc họa tiết và va chạm được thực hiện đối với một số đường đơn giản, đường cong bezier hoặc hình cầu đại diện cho hình dạng đơn giản của sân chơi trực quan.

ví dụ (từ pinball trực quan ):

nhập mô tả hình ảnh ở đây

Một số công ty trò chơi sử dụng công cụ vật lý của riêng họ nhưng một cách khác, dễ dàng hơn là sử dụng công cụ vật lý như Box2Dhoặc Bullet. Hầu hết các trò chơi pinball trên iPhone mà tôi thấy đều sử dụng công cụ vật lý có sẵn + một số tài sản 3d.


... chúng ta đang nói về javascript và canvas ở đây, vì vậy thao tác chậm nhất có thể trong khung này là ... vẽ và đọc pixel ... đặc biệt là trên các thiết bị chậm nhất. Vì vậy, 4/5 câu trả lời này chỉ đơn giản là lịch sử / không liên quan. Nhưng sự hợp lý không thể cạnh tranh với hình ảnh.
GameAlchemist

1
Bản đồ va chạm có thể được lưu trữ trong một mảng, tại sao bạn muốn lưu trữ chúng trong một số khung vẽ? Như bạn đã nói, phần đầu tiên của câu trả lời chủ yếu dành cho lịch sử, nhưng nếu bạn cần triển khai một pinball trên một cpu rất thấp (ví dụ: GSM cũ) thì điều này vẫn có thể áp dụng được. Trong thời hiện đại, tôi muốn đề xuất sử dụng một công cụ vật lý như jbox2d hoặc tự mình thực hiện vật lý với các va chạm với các đoạn đường hoặc đường cong bezier (nếu bạn nghĩ rằng bạn có thể viết một thứ như vậy).
tigrou

Đọc pixel trong hình ảnh cũng rất nhanh trong các trình duyệt hiện đại. Một số bản demo "omg JS nhanh hơn C" là tất cả các hạt nhân xử lý hình ảnh.
Sean Middleditch

Làm thế nào bạn tìm hiểu về các bản đồ va chạm tigrou?
Bemmu

1
Bởi vì giấc mơ pinball này được làm lại: pouet.net/prod.php?which=24499 (không phải bởi tôi). Tìm trong các nguồn, bản đồ va chạm tôi nói về là có.
hổ báo

1

Pinball có bộ vật lý rất phong phú, không chỉ lỗ hoặc tường, mà cả các yếu tố phản ứng (đánh lại) hoặc bề mặt không bằng phẳng nơi bóng chậm lại và sau đó lấy lại tốc độ.

Nếu bạn muốn tạo ra một pinball tốt, cách tốt nhất là sử dụng phát hiện va chạm 3D hoặc hệ thống tự điều chỉnh với mọi vật thể có thể va chạm có một phương pháp với các tham số khoảng cách và vận tốc, trả về vận tốc thay đổi.


Tại sao bạn nói phát hiện va chạm 3D những gì trang phục này có trên 2D?
Giăng

@ John Tôi tưởng tượng một quả bóng pin tốt như một trò chơi 3D có các đường dốc, v.v. Bạn có thể lập trình các đường dốc này ở dạng 2D, và phóng bóng lên khi đi qua đoạn đường dốc và xuống khi nó rơi trở lại, nhưng trong trường hợp này vẫn là 3D Trò chơi, bạn chỉ cần thêm kích thước Z một mình.
Markus von Broady

1

Tôi đã làm một trò chơi pinball một lúc trước; nó cũng dựa trên pixel. Tôi đã có một bản đồ va chạm chỉ chứa dữ liệu va chạm. Một va chạm gần đúng bình thường rất dễ tìm thấy:

Lấy diện tích bản đồ va chạm chồng lên quả bóng, tìm tâm, tạo thành vectơ từ điểm đó đến tâm bóng, sau đó chuẩn hóa.

Hy vọng rằng cung cấp cho bạn một số ý tưởng :)


1

Đầu tiên, nếu bạn thực hiện một trò chơi pinball, rất có thể bạn sẽ cần phát hiện va chạm CIRCLE nhiều hơn so với HỘP giới hạn một :-)
Với sự phức tạp của vật lý liên quan đến một pinball đầy đủ, tôi sẽ đề nghị xem xét một động cơ vật lý 2D hiện có. Box2D khá nổi tiếng trong javascript, có thể có những người khác nhưng tôi đã không gặp phải bất kỳ cái nào tốt (và miễn phí).
Rq1: Bạn chắc chắn sử dụng (như tôi làm) sự phân chia cổ điển trong trò chơi của bạn giữa cập nhật và vẽ. Và bạn sử dụng bộ đếm thời gian (setInterval / setTimeout) và / hoặc RequestAnimationFrame để gọi cập nhật, sau đó vẽ, theo cách thông thường. Pinball có thể là loại trò chơi mà bạn muốn có một bản cập nhật lái xe hẹn giờ và một trò chơi khác điều khiển bốc thăm, do đó bạn có thể điều chỉnh tốc độ của từng trò chơi một cách độc lập, để hoạt động trên nhiều loại thiết bị. Bởi vì bạn không thể thả (cập nhật + vẽ) nếu thiết bị quá chậm: nếu thời gian giữa hai lần cập nhật (dt) trở nên quá dài, động cơ vật lý có thể bỏ lỡ một vụ va chạm.


0

Bạn có thể xem qua pinball trực quan và pinball tương lai cho chủ đề 2d vs 3d. Nếu bạn chơi pinball trực quan (Mọi thứ được thực hiện trong 2ngày) thì hãy chơi pinball trong tương lai hoặc một cái gì đó như Zen Pinball bạn sẽ cảm thấy sự khác biệt trong cách họ chơi. Cá nhân tôi thích 3d, nhưng dự án của bạn có thể phù hợp hơn với 2d, Chỉ bạn mới có thể quyết định rằng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.