Sudut Refleksi

11

Saya memiliki game "Gaya Breakeout" ini.

Saya punya meriam di tengah, blok di sekitar meriam dan bantalan di sekitar blok. Seperti inilah bentuk gimnya:

Game Breakout melingkar

Saya telah berhasil mendapatkan collision per pixel dan bola saya " mencerminkan " pada kontak dengan blok dengan matematika berikut:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

Gambar yang menggambarkan perhitungan sudut refleksi

Di mana garis biru adalah arah bola, dan garis hitam (garis dasar) adalah permukaan blok.

Arah adalah sudut yang dinyatakan dalam radian (yang dapat dikonversi ke derajat, tentu saja).
Bola digerakkan oleh:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

Sejauh ini bagus.

Masalah saya datang sekarang, dengan bantalan (3 blok gelap dan besar di sekitar blok berwarna kecil).

Saat mereka berbalik, sudut permukaan berubah.
Lebih dari itu, bola harus mengenai sisi juga, jadi, bagaimana saya bisa mengukur arah pukulan dan arah gerakan bola yang baru?

ps : Jika perlu, saya dapat menyediakan kode dan swf yang dapat dimainkan.


Edit

Ok, masalah dengan sudut diselesaikan dengan Vektor , tapi saya masih punya masalah dengan sisi dan tabrakan kembali.

Saya akan membuka pertanyaan lain untuk itu dan menautkannya di sini.

NemoStein
sumber
3
Jika Anda menghubungkan kembali akun Anda, Anda harus mendapatkan bonus +100 reputasi. Itu harus menjadi opsi di tab Akun Anda di profil Anda. Sementara itu, saya akan memposting gambar itu untuk Anda.
Grace Note
Saya mengumpulkan Direction Anda adalah sudut antara 0 dan 360 dan untuk memindahkan bola yang Anda gunakan trigonometri?
Jonathan Connell
@ Jejak, Terima kasih banyak untuk gambarnya ... @ 3nixios, saya telah menambahkan lebih banyak info tentang sudut dan gerak.
NemoStein
Jika Anda hanya menyimpan satu "arah" per blok, mungkin Anda membayangkan kembali setiap blok hitam sebagai kelompok empat blok individu, di mana wajah "arah" selalu menghadap ke luar. Mungkin akan ada kasus tepi di empat sudut.
horatio

Jawaban:

8

Saya tidak yakin apakah saya memahami masalah Anda dengan benar, tetapi saya berasumsi bahwa apa yang ingin Anda lakukan adalah menemukan arah yang Anda hasilkan setelah tabrakan.

Inilah gambar cepat di papan tulis saya yang menunjukkan solusi yang memungkinkan untuk itu:

masukkan deskripsi gambar di sini

Panah hijau mewakili kecepatan bola (sebagai vektor), blok biru mewakili blok hitam besar Anda dan panah merah adalah vektor yang dihasilkan.

Pada kasus pertama, blok biru memiliki kecenderungan 30 derajat. Salah satu cara untuk memperbaiki masalah tabrakan adalah mengembalikan semuanya pada sumbu horizontal. Yang perlu Anda lakukan adalah memutar semuanya hingga 30 derajat (kemiringan blok) (Anda dapat menggunakan matriks untuk itu).

Kemudian, Anda memeriksa dari mana tabrakan itu berasal . Jika tumbukan itu horizontal, balikkan komponen x kecepatan. Jika vertikal (seperti dalam kasus ini), komponen y ( ball.Velocity.Y = -ball.Velocity.Y). Ini juga akan membuat bola bertindak dengan benar ketika menyentuh sudut (itu akan membalikkan kedua komponen). Setelah itu, Anda hanya perlu memutar kembali ke situasi sebenarnya (yang tidak ada pada gambar).

Pada kasus kedua, itu adalah hal yang sama, kecuali bahwa kecepatan bola tidak tegak lurus terhadap blok. Anda memutar 70 derajat, memeriksa dari mana tabrakan itu berasal, dan membalikkan komponen yang sesuai. Setelah itu, Anda memutar kembali ke situasi Anda yang sebenarnya.

Catatan: Saya perhatikan bahwa Anda menggunakan sudut untuk mewakili arah alih-alih vektor. Anda bisa saja membuat vektor untuk kalkulasi ini atau mempertahankan ide umum yang sama tetapi bekerja dengan sudut.

Ini tentu bukan cara terbaik untuk pergi dan saya yakin Anda bisa menghitungnya dengan beberapa cara tapi saya pikir itu solusi yang mungkin untuk masalah Anda.

Jesse Emond
sumber
Terima kasih ... Senang papan Anda. Saya akan coba sebentar lagi ... Ahn, dan menurut Anda vektor mana yang lebih baik untuk dipertahankan?
NemoStein
Haha maafkan keterampilan menggambar saya yang buruk.
Jesse Emond
Ups, saya sebenarnya lupa langkah penting saat menggambar .. Anda harus memutar kembali dengan -block inclination angleuntuk memiliki respons tabrakan yang tepat .. Silly me.
Jesse Emond
Saya kira ini tentang preferensi pribadi, tetapi saya lebih suka vektor BANYAK. Anda tidak perlu memikirkan matematika di belakang mereka sebagian besar waktu dan biasanya membuat kode lebih bersih. Jadi Anda bisa menyimpan Direction(sebagai vektor) dan memperbarui posisi bola seperti: ball.Position += ball.Direction * ball.Speed;.
Jesse Emond
@Jesse, saya tidak bisa melakukan ini sampai sekarang. Saya memahami metode Anda dengan sempurna, tetapi tidak bisa menerapkannya. Untuk melakukan ini saya harus menulis ulang seluruh bagian yang menggunakan sudut radian untuk menggunakan vektor (ini sebenarnya tidak banyak). Untuk saat ini saya akan mencoba alternatif lain, dan jika Anda memiliki alternatif lain, saya akan dengan senang hati mencoba. Terima kasih.
NemoStein