Bir varlığın bir yönde hareket etmesini nasıl sağlarım?


11

Bir var Entityher oyun kene güncellenir örneği. Varlığın sadece sürekli ilerlediğini varsayalım. Varlığın açısını bu yönde hareket ettiren bir işleve vermek istiyorum:

moveForward(90);onları sağa doğru hareket ettirmelidir. Rotasyonumu global olarak ilan edersem int,

moveForward(rotation);
rotation++;

hareketi ile küçük bir çemberin izini sürecekti.

Bunu nasıl yapabilirim? Bunun vektör matematiğini içerdiğini varsayıyorum; Bilmiyorum, bu yüzden kısa bir açıklama güzel olurdu.

Yanıtlar:


16

En basit anlamda böyle bir şeye sahipsiniz.

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

Ancak hız düşmanın hızlıdır ve x yönünde ne kadar hareket etmeleri gerektiğini ve açının günahını ya da cos'ını alıp hızla çarparak y yönünde ne kadar hareket ettiklerini belirleyebilirsiniz. Çünkü...

 sin(a) = x / speed

Yani:

 x = speed * sin(a)

Ve:

cos(a) = y / speed

Yani:

y = speed * cos(a)

Örnekte moveForward(90)doğuracak speed * sin(90)veya speed * 1x yönünde ve speed * cos(90)ya 0y yönünde (belirttiğiniz gibi sağa hareket etmelidir). Bu temel anlamda başlamanız gerekir.

Genel yapmak:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

Ahh, hayal ettiğimden çok daha basit, çok teşekkürler :)
Shaun Wild

Eminim y ve x'leri değiştirmelisiniz. sin (alfa) = b / c.
jcora

@ SOH-CAH-TOA yaptığım çizimle eşleşiyor, günah çizimde x / hız olan hipotenüsün tersidir. Açı üçgenin diğer tarafında olsaydı tersine çevrilirdi (ve bu oyun tasarımı için daha pratik ise onu değiştirebilirdim, ama keyfi olduğunu hissediyorum).
Kevin DiTraglia

Cep telefonumdayım, bu yüzden yorumlamak oldukça zordu. Ben sadece formüller üzerinde yağsız ...
jcora

Bu gerçekten hoş bir üçgen. +1
Bro Kevin D.

3

Diğer cevap şu an için yanlıştır, bir dönüşe göre bir düzlem boyunca doğru hareket etmek için aşağıdakileri yaparsınız:

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

Ancak cos / sin için sadece dönüş değiştiğinde güncellediğiniz bir değişken oluşturmanızı tavsiye ederim, böylece 4 kez bir kene hesaplamıyorsunuz.

StrafeSpeed ​​bir yandan diğer yana, forwardSpeed ​​ise rotasyonunuz boyunca ilerlemektedir.

edit: tesselode aynı şeyi yan yana hareket yok dışında yapar.


2

Güncelleme işaretlerini söylediniz, bu yüzden değişken bir kare hızınız olmadığını varsayıyorum. Öyleyse:

x + = hız * math.cos (açı)

y + = hız * math.sin (açı)

Değişken kare hızı kullanıyorsanız, delta zamanıyla da çarpmanız gerekir.

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.