Saya memiliki game "Gaya Breakeout" ini.
Saya punya meriam di tengah, blok di sekitar meriam dan bantalan di sekitar blok. Seperti inilah bentuk gimnya:
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;
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.
sumber
Jawaban:
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:
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.
sumber
-block inclination angle
untuk memiliki respons tabrakan yang tepat .. Silly me.Direction
(sebagai vektor) dan memperbarui posisi bola seperti:ball.Position += ball.Direction * ball.Speed;
.