Deteksi Tabrakan 2D untuk Pinball Game


9

Sejauh ini dalam game sebelumnya saya telah menggunakan tabrakan 2D sederhana dengan kotak kemudian memeriksa pada tingkat piksel untuk tabrakan.

Jika membuat permainan pinball di hampir banyak frame bola akan bersentuhan dengan dinding atau permukaan lain, jadi apakah ada pendekatan lain?

Jawaban:


19

Dulu (1990), game pinball lama dibuat seperti ini:

Ada beberapa layer untuk playfield (apa yang Anda lihat saat bermain game):

masukkan deskripsi gambar di sini

dan beberapa lapisan untuk tabrakan:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Gambar grayscale kiri adalah peta tabrakan untuk permainan utama, gambar kanan adalah peta tabrakan untuk area khusus: pinball landai.

White = area bebas untuk bola, indeks warna ada 255.

Gray= bola akan "didorong menjauh" dari zona ini. indeks warna = sudut vektor untuk menambah posisi bola. abu-abu terang = 0 deg. abu-abu gelap = 360 derajat.

Beberapa kode semu:

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; //

    }
}

Beberapa indeks warna khusus juga dapat digunakan untuk sesuatu yang lain daripada tabrakan, berbagai warna kustom (misalnya: 240-255) dapat dipesan untuk mendeteksi zona khusus seperti spinners, triggers, bumpers, holes, ...

Seperti yang Anda lihat, ini sangat sederhana. Hanya ada beberapa piksel "baca" per bingkai. Karena ini, Anda dapat membuat simulasi fisika berjalan pada framerate nyata misalnya: 200 fps. Menggunakan framerate tinggi akan memperlancar simulasi dan mengurangi "tunneling" (ini terjadi ketika bola berjalan terlalu cepat dan melewati elemen tanpa bertabrakan). Kesederhanaan itu juga yang memungkinkan permainan pinball yang mulus pada 386 computers(dan bahkan cepat 286) di masa lalu (di antara beberapa trik lain seperti bersepeda warna, pengguliran vga dan masking sprite ...).

Saat ini, sebagian besar permainan pinball tidak lagi dibuat seperti ini. Alih-alih playfield adalah adegan 2d / 3d menggunakan poligon atau sprite dan tabrakan dibuat terhadap beberapa garis yang disederhanakan, kurva bezier, atau bola yang mewakili bentuk sederhana dari playfield visual.

contoh (dari pinball visual ):

masukkan deskripsi gambar di sini

Beberapa perusahaan game menggunakan mesin fisika mereka sendiri tetapi cara lain yang lebih mudah adalah menggunakan mesin fisika seperti Box2Datau Bullet. Sebagian besar permainan pinball iPhone yang saya lihat menggunakan mesin fisika yang sudah ada + beberapa aset 3d.


... kita berbicara javascript dan kanvas di sini, jadi operasi paling lambat yang mungkin dalam kerangka ini adalah ... menggambar dan membaca piksel ... terutama pada perangkat paling lambat. Jadi 4/5 dari jawaban ini hanya sejarah / tidak relevan. Tetapi rasionalitas tidak dapat bersaing dengan gambar.
GameAlchemist

1
Peta tabrakan dapat disimpan dalam sebuah array, mengapa Anda ingin menyimpannya di beberapa kanvas? Seperti yang Anda katakan bagian pertama dari jawabannya sebagian besar untuk sejarah, tetapi jika Anda perlu menerapkan pinball pada cpu yang sangat rendah (misalnya: gsm lama) ini masih berlaku. Di zaman modern, saya lebih suka menyarankan menggunakan mesin fisika seperti jbox2d atau melakukan sendiri fisika dengan tabrakan terhadap segmen garis atau kurva bezier (jika Anda pikir Anda dapat menulis hal seperti itu).
tigrou

Membaca piksel dalam gambar juga sangat cepat di peramban modern. Beberapa demo "omg JS lebih cepat dari C" semuanya adalah kernel pemroses gambar.
Sean Middleditch

Bagaimana Anda belajar tentang tigrou peta tabrakan?
Bemmu

1
Karena remake mimpi pinball ini: pouet.net/prod.php?which=24499 (bukan oleh saya). Lihat di sumber, peta tabrakan yang saya bicarakan ada di sana.
tigrou

1

Pinball memiliki kumpulan fisika yang sangat kaya, tidak hanya lubang atau dinding, tetapi juga elemen yang bereaksi (memukul balik) atau permukaan yang tidak rata di mana bola melambat dan kemudian mempercepatnya kembali.

Jika Anda ingin membuat pinball yang bagus, cara untuk pergi adalah menggunakan deteksi tabrakan 3D, atau sistem yang dirancang sendiri dengan setiap objek yang dapat collidable yang memiliki metode dengan parameter jarak dan kecepatan, mengembalikan kecepatan yang berubah.


Mengapa Anda mengatakan deteksi tabrakan 3D apa yang cocok ini memiliki lebih dari 2D?
John

@ John Saya membayangkan pinball yang bagus sebagai game 3D dengan landai dll. Anda bisa memprogram landai ini dalam 2D, dan skalakan bola saat melewati ramp dan turun ketika jatuh sendiri, tetapi dalam hal ini masih 3D game, Anda hanya menambahkan dimensi Z sendiri.
Markus von Broady

1

Saya membuat permainan pinball beberapa waktu lalu; itu berbasis pixel juga. Saya memiliki peta tabrakan yang hanya berisi data tabrakan. Perkiraan tabrakan normal mudah ditemukan:

Ambil area peta tabrakan yang tumpang tindih bola, temukan pusatnya, bentuk vektor dari titik itu ke pusat bola, lalu normalkan.

Harapan yang memberi Anda beberapa ide :)


1

Pertama, jika Anda membuat permainan pinball, kemungkinan besar Anda akan membutuhkan lebih banyak pendeteksian-CIRCLE-collision daripada BOX yang berlari :-)
Mengingat kompleksitas fisik yang terlibat dalam pinball penuh, saya akan menyarankan untuk melihat pada mesin fisik 2D yang ada. Box2D memiliki reputasi yang cukup dalam javascript, mungkin ada orang lain tetapi saya tidak menemukan yang baik (dan gratis).
Rq1: Anda tentu menggunakan (seperti yang saya lakukan) perpecahan klasik dalam game Anda antara pembaruan dan menggambar. Dan Anda menggunakan penghitung waktu (setInterval / setTimeout) dan / atau RequestAnimationFrame untuk memanggil pembaruan, lalu menggambar, secara teratur. Pinball mungkin adalah jenis gim di mana Anda ingin memiliki satu pemutakhiran mengemudi, dan lainnya menggerakkan undian, sehingga Anda dapat menyesuaikan kecepatan masing-masing secara mandiri, untuk bekerja pada berbagai perangkat. Karena Anda tidak bisa hanya menjatuhkan (memperbarui + menggambar) jika perangkat terlalu lambat: jika waktu antara dua pembaruan (dt) menjadi terlalu lama, mesin fisik mungkin kehilangan tabrakan.


0

Anda mungkin melihat pinball visual vs pinball masa depan untuk subjek 2d vs 3d. Jika Anda bermain pinball visual (Semuanya dibuat dalam 2d) maka mainkan pinball masa depan, atau sesuatu seperti Zen Pinball, Anda merasakan perbedaan dalam cara mereka bermain. Saya pribadi lebih suka 3d, tetapi proyek Anda mungkin lebih cocok untuk 2d, Hanya Anda yang bisa memutuskan itu

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.