Oyuncunun araziye karşı düzgün bir şekilde kaymasını sağlamak


11

diyagram

İzometrik bir oyun yapıyorum. Oyuncu bir duvara çapraz olarak yürümeye çalıştığında, onun üzerinden düzgün bir şekilde kaymasını istiyorum, böylece hareketin hangi kısmı yasal olursa kullanılır ve normal yönde herhangi bir şey atılır. Duvarlar sadece dikey veya yatay değil, herhangi bir açı olabilir ve oynatıcının 360 hareketi vardır.

Neredeyse oradaymışım gibi hissediyorum ama son parçayı yerine koyamıyorum.

Güncelleme: Herkese harika haberler! Çalışıyorum. Ama ... Neyin normalleşmesi ve neyin olmaması gerektiği konusunda biraz kafam karıştı. Normal bir birim vektör olmalı, değil mi? ama sonra bunu girişimle karıştırıyorum, böylece normalleştiriyorum - yanlış mıyım?

Bu arada, oynatıcıyı normal yönde 1 piksel itmem gerektiğini de buldum, böylece şeylere takılmıyorlar - iyi çalışıyor.

Yanıtlar:


13

Hareket vektörünüzü normal düzleme yansıtın ve sonucu hareket vektörünüzden çıkarın.

Vector undesiredMotion = normal * (dotProduct(input, normal));
Vector desiredMotion = input - undesiredMotion;

Zaten böyle bir şey. Güzel diyagramınızda giriş duvardan uzakta gibi görünse de biraz kafam karıştı.


Üzgünüm, orada dikey bir duvarın önünde olması gerekiyordu. korkunç çizim
Iain

1
Nokta ürün hakkında biraz kafam karıştı. Nokta ürün skaler değil mi?
Iain

1
Evet, ancak istenmeyen hareketinizin vektörünü elde etmek için onu normal (bir vektör) ile çarpıyorsunuz. Skaler s ile çarpılan bir vektör (x, y, z) vektörü (sx, sy, sz) alır.
Chris Howe

Bitti, değişkenleri umarım diyagramla eşleşecek şekilde değiştirdi. :)
Chris Howe

@Bu gerçekten bu cevabı nasıl kullanacağımı anlamaya çalışıyorum ama anlayamıyorum. Bu tam kodu oluşturduğumda gerçekten garip desiredMotionsonuçlar elde ediyorum . Hiç çalıştın mı?
test edin

1

Hareketin normal yönündeki bileşenini kaldırmak doğrudan ileri olsa da, hareket vektörünü döndürmek için oyununuza uygun olabilir. Örneğin, 3 kişilik bir aksiyon oyununda, duvarlara ve diğer sınırlara hafifçe asılmak kolay olabilir, böylece oyuncunun neyi amaçladığını tahmin edebilirsiniz.

// assume that 'normal' is unit length
Vector GetDesired(Vector input, Vector normal) {
   // tune this to get where you stop when you're running into the wall,
   // vs. bouncing off of it
   static float k_runningIntoWallThreshold = cos(DEG2RAD(45));

   // tune this to "fudge" the "push away" from the wall
   static float k_bounceFudge = 1.1f;

   // normalize input, but keep track of original size
   float inputLength = input.GetLength();
   input.Scale(1.0f / inputLength);

   float dot = DotProduct(input, normal);

   if (dot < 0)
   {
      // we're not running into the wall
      return input;
   }
   else if (dot < k_runningIntoWallThreshold)
   {
      Vector intoWall = normal.Scale(dot);
      intoWall.Scale(k_bounceFudge);

      Vector alongWall = (input - intoWall).Normalize();
      alongWall.Scale(inputLength);

      return alongWall;
   }
   else
   {
      // we ran "straight into the wall"
      return Vector(0, 0, 0);
   }
}

Güzel. Ancak bir geçiştirme faktörüne göre ölçeklendirirseniz, duvar boyunca onu kaydırıp kaymasını sağlar mı yoksa sadece bir tweaking vakası mıdır?
Chris Howe

Benim düşüncem, iyi görünmesi için ayarladığınız; Kesinlikle çok büyükse, zıplıyormuşsunuz gibi görünecektir, ancak yeterince ince olursa, yüzeydeki hafif virajlara asılmanızı engeller.
dash-tom-bang
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.