Yansıma Açısı


11

Bu "Breakeout tarzı" oyun var.

Merkezde bir topum var, topun etrafındaki bloklar ve blokların etrafındaki yastıklar. Oyun şöyle görünür:

Dairesel bir koparma oyunu

Piksel başına çarpışmayı başardım ve topum aşağıdaki matematikle bloklarla temas ettiğinde " yansıtır ":

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

Yansıma açısı hesaplamasını gösteren resim

Mavi çizginin top yönü olduğu ve siyah çizginin (taban çizgisi) blok yüzeyi olduğu yerde.

Yön radyan cinsinden ifade edilen bir açıdır (elbette dereceye dönüştürülebilir).
Top tarafından taşınan:

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

Çok uzak çok iyi.

Benim sorun şimdi, pedleri (küçük renkli bloklar etrafında 3 koyu ve büyük bloklar) ile geliyor.

Dönerken yüzey açısı değişir.
Dahası, top da kenarlara çarpmalıdır, peki, vuruşun yönünü ve topun yeni hareket yönünü nasıl ölçebilirim?

ps : Gerekirse, kod ve oynanabilir bir swf sağlayabilir.


Düzenle

Tamam, açılarla ilgili sorun Vektörler ile çözüldü , ancak yine de yanlarda ve arkada çarpışmada sorunum var.

Bunun için başka bir soru açacağım ve buraya bağlayacağım.


3
Hesaplarınızı yeniden ilişkilendirirseniz, +100 itibar bonusu almanız gerekir. Profilinizin Hesaplar sekmesinde bir seçenek olmalıdır. Bu arada, bu görüntüleri sizin için yayınlayacağım.
Grace Note

Yönünüzü 0 ile 360 ​​arasında bir açı ile toplayıp trigonometri kullandığınız topu hareket ettirmek ister misiniz?
Jonathan Connell

@Grace, Görüntüler için çok teşekkür ederim ... @ 3nixios, açı ve hareket hakkında daha fazla bilgi ekledim.
NemoStein

Her blok için yalnızca bir "yön" saklarsanız, her siyah bloğu "tek yönlü" yüzün her zaman dışa baktığı dört ayrı bloktan oluşan bir grup olarak yeniden tasarlayabilirsiniz. Muhtemelen dört köşede uç durumlar olacaktır.
horatio

Yanıtlar:


8

Sorununuzu doğru anladığımdan emin değilim, ama yapmak istediğiniz şeyin bir çarpışmadan sonra topunuzun sonuç yönünü bulmak olduğunu varsaydım.

İşte beyaz tahta üzerinde bunun için olası bir çözümü gösteren hızlı bir çizim:

resim açıklamasını buraya girin

Yeşil oklar topun hızını (vektör olarak), mavi bloklar büyük siyah bloklarınızı temsil eder ve kırmızı ok sonuç vektörüdür.

İlk durumda, mavi blok 30 derecelik bir eğime sahiptir. Çarpışma problemini çözmenin yollarından biri, her şeyi yatay eksene geri getirmektir. Yapmanız gereken her şeyi 30 derece döndürmek (bloğun eğimi) (bunun için matrisler kullanabilirsiniz).

Sonra, çarpışmanın nereden geldiğini kontrol edersiniz . Çarpışma yatay ise, hızın x bileşenini ters çevirin . Dikey ise (bu durumda olduğu gibi), y bileşeni ( ball.Velocity.Y = -ball.Velocity.Y). Bu aynı zamanda topun köşelere çarptığında doğru hareket etmesini sağlayacaktır (her iki bileşeni de tersine çevirecektir). Bundan sonra, sadece gerçek duruma (çizimde olmayan) geri dönmeniz gerekir.

İkinci durumda, aynı şey, ancak topun hızı bloğa dik olmamalıdır. 70 derece döndürür, çarpışmanın nereden geldiğini kontrol edersiniz ve uygun bileşenleri tersine çevirirsiniz. Sonra gerçek durumunuza geri dönersiniz.

Not: Vektör yerine yönü temsil etmek için bir açı kullandığınızı fark ettim. Bu hesaplamalar için bir vektör oluşturabilir veya aynı genel fikri koruyabilir, ancak açılarla çalışabilirsiniz.

Bu kesinlikle gitmenin en iyi yolu değil ve eminim ki bir şekilde hesaplayabilirsin ama bence sorununa olası bir çözüm.


Teşekkürler ... Tahtanızı çok sevdik. Bir dakika sonra deneyeceğim ... Ahn, ve sence vektörlerin bakımı / çalışması daha iyi olabilir mi ??
NemoStein

Haha fakir çizim becerilerimi affeder.
Jesse Emond

Hata! Aslında çizerken önemli bir adımı unuttum .. -block inclination angleUygun bir çarpışma tepkisi için geri dönmelisin .. Aptal bana.
Jesse Emond

Sanırım kişisel tercihlerle ilgili, ama ben vektörleri çok tercih ediyorum. Çoğu zaman arkalarındaki matematik hakkında düşünmek zorunda değilsiniz ve genellikle kodu daha temiz hale getirir. Eğer bir tutmak Yani Direction(bir vektör gibi) ve bu yüzden gibi topun konumunu güncelleyin: ball.Position += ball.Direction * ball.Speed;.
Jesse Emond

@ Jesse, bunu şimdiye kadar yapamadım. Yönteminizi mükemmel anladım, ancak uygulayamadım. Bunu yapmak için vektörleri kullanmak için radyan açıları kullanan kısmı yeniden yazmam gerekecek (aslında bu pek değil). Şimdilik başka alternatifler deneyeceğim ve başka bir alternatifiniz varsa denemekten mutluluk duyacağım. Teşekkürler.
NemoStein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.