Koparma Çarpışması: Çarpışma tarafını algılama


10

Bir koparma klonu yazıyorum (ilk oyunum) ve tuğlanın hangi tarafına vurulduğunu nasıl anladığım konusunda tamamen sıkıştım.

Şuna benzeyen bir çarpışma algılama yöntemi var:

DetectCollision(Object a, Object b)

   x = distance(a.x, b.x);
   y = distance(a.y, b.y);

   if (x is smaller than the combined width &  y is smaller is than combined height {
       return true;
   }
return false;  

Bu tamamen iyi çalışıyor, ancak düzgün tepki verebilmek için çarpışma tarafını ve merkeze göre konumu bilmem gerekiyor.

Geçtiğimiz birkaç günü gözetleyerek geçirdim ama kayboldum.

Yanıtlar:


13

Tüm bunlar, çarpıştığı tuğlanın konumuna göre topun konumundan çıkarılabilir.

Bir çarpışma tespit ettiğinizde:

if(ballPosition.y <= brickPosition.y - (brickHeight/2))
  //Hit was from below the brick

if(ballPosition.y >= brickPosition.y + (brickHeight/2))
  //Hit was from above the brick

if(ballPostion.x < brickPosition.x)
  //Hit was on left

if(ballPostion.x > brickPosition.x)
  //Hit was on right

İlk ikisi topun tuğlanın üstünde mi altında mı olduğunu kontrol eder. Eğer tuğladan daha fazlası yoksa, hangi tarafta olduğunu kontrol edin. Bu, konumu aldığınız yere uyacak şekilde cımbızlanmalıdır, yani brickPosition, tuğlanın veya tuğlanın merkezidirPosition, sol üst köşedir.


1
Ancak, oyuncuyu bir tuğla içinde hareket ettiğinden, oyuncuyu yeniden konumlandırmak için nasıl kullanırsınız, bu koşulların birden fazlası karşılanır ve istenen x'i duvarın kenarına sıfırlarsanız, örneğin tuşa basarsanız bir tuğla istenen x'i tam olarak duvarın yanına yerleştirir, o zaman gerçekten işe yaramaz çünkü karakterin teorik pozisyonunu hangi yönden çarptığını görmek için kontrol ettiğinizde, bu koşulların birden fazlası karşılanacak, yani nasıl oynatıcıyı sıfırlamak için bunu kullanın, her if sonuna başka bir tane eklemeniz gerekir mi?
bluejayke

Bildiğim kadarıyla bir koparma türü oyun "oyuncu" raket olduğunu. Kürek bir tuğlanın içinde hareket etmiyor ya da kürenin konumunu, topun tuğlalarla etkileşimine göre değiştirmiyorsunuz. Yaptığınız şey buysa, ek mantığa ihtiyacınız yoktur, tüm çarpışma kontrollerini yapana kadar yeniden konumlandırmayı işlemeyin. Ya da çeklerden biri doğru olduğunda iade edin.
MichaelHouse

8

Vektör Matematik'i aralarındaki açıları keşfetmek için kullanabilirsiniz!

İşte kısa bir cevap:

ballToBrick = ballPosition - brickPosition;
ballToBrick.Normalize();
brickFacing = Vector2(0,1).Normalize();


float angle = acos( Dot(ballToBrick, brickFacing) );

Tuğla kaplama zor bir vektör, açı hesaplamasının "başlangıç ​​noktası" dır. ve vektörün yukarıyı göstermesini istiyorsanız (0, 1), sola (-1, 0), sağa (1, 0), aşağıya (0, -1) gelin. Yukarı ve sağın pozitif olduğu OpenGL ekseninde olduğunuzu varsayarsak.

Eğer bilmiyorsanız, kullanılan her fonksiyonun tanımları:

Vector2.Normalize()
{
    float length = squareroot(x * x + y * y);
    x = x / length;
    y = y / length;
    return this;
}

Dot(Vector2 a, Vector2 b)
{
    return a.x * b.x + a.y * b.y;
}

( https://en.wikipedia.org/wiki/Dot_product )

Referans: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

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.