Dulu (1990), game pinball lama dibuat seperti ini:
Ada beberapa layer untuk playfield (apa yang Anda lihat saat bermain game):
dan beberapa lapisan untuk tabrakan:
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 ):
Beberapa perusahaan game menggunakan mesin fisika mereka sendiri tetapi cara lain yang lebih mudah adalah menggunakan mesin fisika seperti Box2D
atau Bullet
. Sebagian besar permainan pinball iPhone yang saya lihat menggunakan mesin fisika yang sudah ada + beberapa aset 3d.
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.
sumber
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 :)
sumber
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.
sumber
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
sumber