Ana sayfamda pong üzerinde kullandığım ilgili mantık : (lütfen okumaya başlamadan önce oynayın, böylece aşağıdaki kodla elde ettiğim etkiyi biliyorsunuz)
Temel olarak, top raketle çarpıştığında, yönü tamamen göz ardı edilir; raketin ortasından ne kadar çarpıştığına göre yeni bir yön verilir. Top, raketin tam ortasına vurursa, tamamen yatay olarak gönderilir; sağ kenara vurursa, aşırı bir açıyla (75 derece) uçar. Ve her zaman sabit bir hızda hareket eder.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Raketin orta Y değerini alın ve topun Y kesişimini çıkarın. Eğer raket 10 piksel yüksekse, bu sayı -5 ile 5 arasında olacaktır. Buna "göreceli kesişme" diyorum, çünkü şimdi "raket alanı" içinde, topun raketin ortasına göre kesiştiği nokta.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Bağıl kesişimi alın ve raket yüksekliğinin yarısına bölün. Şimdi -5 ile 5 arasındaki sayımız -1 ile 1 arasında bir ondalıktır; o oluyor normalize . Ardından, topun sıçramasını istediğiniz maksimum açı ile çarpın. Onu 5 * Pi / 12 radyan (75 derece) olarak ayarladım.
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Son olarak, basit trigonometri kullanarak yeni top hızlarını hesaplayın.
Bu tam olarak istediğiniz etki olmayabilir veya normalize edilmiş göreceli kavşaklığı azami bir hız ile çarparak da bir hız belirlemek isteyebilirsiniz; bu, topun bir raketin kenarına vurması durumunda daha hızlı veya merkezin yakınında durması durumunda daha yavaş çalışmasını sağlar.
Muhtemelen bir vektörün neye benzeyeceği ya da topların sahip olduğu vektör değişkenini (hız ve yön) nasıl kaydedebileceğim üzerine bir kod istiyorum.
Bir vektör dolaylı olarak hem hız hem de yön içerir. Vektörümü "vx" ve "vy" olarak saklıyorum; yani, x yönündeki hız ve y yönündeki hızdır. Fizikte bir giriş dersi almadıysanız, bu size biraz yabancı gelebilir.
Bunu yapmamın nedeni, gerekli çerçeve başına hesaplamaları azaltmak; Her çerçeve, sadece yapmak x += vx * time;
ve y += vy * time;
zaman milisaniye cinsinden son karesinden bu yana zaman, nerede (dolayısıyla hızları milisaniye başına piksel içindedir).
Topu eğme yeteneğinin uygulanmasına ilişkin olarak:
Öncelikle, topun çarptığı anda raketin hızını bilmeniz gerekir; bu, raketin geçmişini takip etmeniz gerekeceği için, raketin geçmiş konumlarından birini veya daha fazlasını bilmeniz, böylece hareket edip etmediklerini görmek için mevcut konumuyla karşılaştırabilmeniz anlamına gelir. (pozisyondaki değişiklik / zamandaki değişiklik = hız; bu nedenle 2 veya daha fazla pozisyona ve bu pozisyonların zamanlarına ihtiyacınız var)
Şimdi , pratik olarak hareket ettiği eğriyi temsil eden, ancak topun gerçek dünyadaki dönüşüne eşdeğer olan topun açısal bir hızını izlemeniz gerekir . Sıçrama açısını kürek ile çarpışma sırasında topun göreceli konumundan nasıl enterpolasyon yapacağınıza benzer şekilde, bu açısal hızı (veya döndürme) çarpışmadaki raket hızından da enterpolasyon yapmanız gerekecektir. Sadece döndürme açısı ile yaptığınız gibi döndürmeyi ayarlamak yerine, topun mevcut döndürmesini eklemek veya çıkarmak isteyebilirsiniz, çünkü bu, oyunlarda iyi çalışma eğilimindedir (oyuncu topun döndüğünü görebilir ve dönmesine neden olabilir. daha da çılgınca, ya da düz hareket etmesini sağlamak için dönüşe karşı koyma).
Bununla birlikte, bunun en yaygın olan ve onu uygulamanın en kolay yolu olmasına rağmen, bir sıçramanın gerçek fiziğinin yalnızca vurduğu nesnenin hızına dayanmadığını unutmayın; açılı bir hıza sahip olmayan (dönüşsüz) bir nesnenin açılı bir yüzeye çarpan bir cisim, üzerine verilen bir dönüşe sahip olacaktır. Bu daha iyi bir oyun tamircisine yol açabilir, bu yüzden buna bakmak isteyebilirsiniz, ancak bunun arkasındaki fizikten emin değilim, bu yüzden açıklamaya çalışmayacağım.