Inilah logika yang relevan yang saya gunakan pada pong di beranda saya : (silakan mainkan sebelum membaca, agar Anda tahu efek yang saya capai dengan kode berikut)
Pada dasarnya, ketika bola bertabrakan dengan dayung, arahnya sama sekali diabaikan; itu diberikan arah baru sesuai dengan seberapa jauh dari pusat dayung itu bertabrakan. Jika bola mengenai dayung tepat di tengah, itu dikirim persis horisontal; jika menyentuh tepat di tepi, ia terbang pada sudut yang ekstrem (75 derajat). Dan selalu bergerak dengan kecepatan konstan.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Ambil nilai tengah Y dari dayung, dan kurangi persimpangan Y dari bola. Jika dayung tingginya 10 piksel, angka ini akan berada di antara -5 dan 5. Saya menyebutnya "intersect relatif" karena berada di "ruang dayung" sekarang, persimpangan bola relatif ke tengah dayung.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Ambil persimpangan relatif dan membaginya dengan setengah tinggi dayung. Sekarang angka -5 ke 5 kita adalah desimal dari -1 hingga 1; itu dinormalisasi . Kemudian gandakan dengan sudut maksimum yang Anda inginkan agar bola memantul. Saya mengaturnya ke 5 * Pi / 12 radian (75 derajat).
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Akhirnya, hitung kecepatan bola baru, menggunakan trigonometri sederhana.
Ini mungkin bukan efek yang Anda inginkan, atau Anda mungkin ingin juga menentukan kecepatan dengan mengalikan persimpangan relatif yang dinormalisasi dengan kecepatan maks; ini akan membuat bola melaju lebih cepat jika menyentuh dekat tepi dayung, atau lebih lambat jika mengenai dekat pusat.
Saya mungkin ingin beberapa kode pada apa yang akan terlihat seperti vektor atau bagaimana saya bisa menyimpan variabel dari vektor bola memiliki (kecepatan dan arah).
Vektor berisi kecepatan dan arah, secara implisit. Saya menyimpan vektor saya sebagai "vx" dan "vy"; yaitu, kecepatan dalam arah x dan kecepatan dalam arah y. Jika Anda belum mengambil kursus pengantar dalam fisika, ini mungkin agak asing bagi Anda.
Alasan saya melakukan ini adalah karena mengurangi perhitungan per-bingkai yang diperlukan; setiap frame, Anda cukup lakukan x += vx * time;
dan di y += vy * time;
mana waktu adalah waktu sejak frame terakhir, dalam milidetik (oleh karena itu kecepatannya dalam piksel per milidetik).
Mengenai menerapkan kemampuan untuk melengkung bola:
Pertama-tama, Anda harus mengetahui kecepatan pemukul pada saat bola mengenai; yang berarti Anda harus melacak sejarah pemukul, sehingga Anda dapat mengetahui satu atau lebih dari posisi masa lalu pemukul sehingga Anda dapat membandingkannya dengan posisi saat ini untuk melihat apakah itu bergerak. (perubahan posisi / perubahan waktu = kecepatan; jadi Anda perlu 2 posisi atau lebih, dan waktu posisi itu)
Anda sekarang juga perlu melacak kecepatan sudut bola, yang secara praktis mewakili kurva sepanjang perjalanannya, tetapi setara dengan putaran bola dunia nyata. Mirip dengan bagaimana Anda akan menginterpolasi sudut pantulan dari posisi relatif bola pada tabrakan dengan dayung, Anda juga perlu menginterpolasi kecepatan sudut ini (atau memutar) dari kecepatan dayung pada tabrakan. Daripada hanya mengatur putaran seperti yang Anda lakukan dengan sudut pantulan, Anda mungkin ingin menambah atau mengurangi putaran bola yang ada, karena itu cenderung bekerja dengan baik dalam permainan (pemain dapat melihat bola berputar, dan menyebabkannya berputar bahkan lebih liar, atau melawan putaran dalam upaya membuatnya lurus).
Namun, perhatikan bahwa meskipun ini adalah akal sehat yang paling umum dan mungkin cara termudah untuk mengimplementasikannya, fisika sebenarnya dari pantulan tidak hanya bergantung pada kecepatan objek yang ditabraknya; sebuah objek tanpa kecepatan sudut (tanpa putaran) yang mengenai permukaan pada suatu sudut, akan memiliki putaran yang diberikan padanya. Ini mungkin mengarah ke mekanik permainan yang lebih baik, jadi Anda mungkin ingin melihat ini, tapi saya tidak yakin dengan fisika di baliknya sehingga saya tidak akan mencoba menjelaskannya.