Platform oyunlarında sallanmayı nasıl kolayca uygulayabilirim?


9

Oyuncunun ipleri (Örümcek Adam veya Biyonik Komando'nun yaptığı gibi) sallamak için kullanabileceği bir oyun geliştiriyorum ve bu davranışı uygularken sorun yaşıyorum. Bunu nasıl yapabileceğimi kimse bana yardımcı olabilir mi, yani fizik formülleri vb. Şimdiye kadar 3 fikir buldum. Biri yay kullanıyor, ama çok zaman alıyor ve bazen ürkek oluyor. Diğer ikisi bir sonraki adımı (biri potansiyel enerjiyi ve diğeri torku hesaplayarak) hesaplamaya çalışıyor ve her ikisi de oyuncu sallanmaya çalıştığında neredeyse çöküyor.

İşte torku hesaplamak için yazdığım kod:

float dx = Runner->getPosition().x - ancher.x; 
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;

İlgili (bir ip yapımında): 2D Halat Çarpışma Algılama
doppelgreener

@JonathanHobbs bu sorunun cevabını tam olarak nasıl bir istisna dışında ipimi uygulamaya çalıştığımdır, çünkü benim durumumda çarpışma istenmeyen her ip parçasını bir sensör olarak ayarladım, böylece birbirlerine yapışmadan serbestçe hareket edebilsinler.
Ali1S232

Halat için basit sarkaç + harap görünen bazı animasyonlar ne olacak? Biyonik Komando gibi eski oyunların sarkaçtan başka bir şeye sahip olduğuna inanmıyorum.
user712092

@ kullanıcı sarkaç fikri iyi çalışması gerekir. ama benim durumumda ya oyuncunun hızlı hareketi ya da kötü uygulamam yüzünden iyi sonuçlar vermedi.
Ali1S232

@Gajet Doğru olana kadar bazı hata ayıklama çizimi yapmaya çalışıyorsunuz? Bu sarkaç hattı, çarpışmalar elde etmek için Box2D'de yeterince ince bir kutu olarak yapılabilir (ve belki de fiziğin dışında tutup el ile hareket edebilir mi?).
user712092

Yanıtlar:


6

Katı bir salıncak istiyorsanız, dönüş noktasına olan mesafe sabitse, karakteri dönüş noktasında ortalanmış bir dairenin üzerindeki bir nokta olarak ele almanız yeterlidir. Ona tek boyutlu (daire boyunca) açısal hız verin. Her kare açısal ivme olmalıdır accelerationDueToGravity * cos(angleOfPlayerOnCircle)(0 derece sağa bakacak şekilde).

Halatın daha uzun / daha kısa olmasını istiyorsanız, yukarıdaki şemayı kullanabilir ve her bir çerçevenin yarıçapını değiştirebilirsiniz.


cevap benim ikinci denemem oldu ama çok daha hızlı bir şekilde hareket edeceğim soruyu düzenleyecek ve kodumu ekleyebilirim belki sorunun nerede olduğunu tespit edebilirsiniz.
Ali1S232

3

birçok denemeden sonra box2d ile gittim.

Bu simülasyon için genellikle iki yaklaşım vardır veya en azından 2 tane buldum:

  1. bir tanesi bazı daire şekilleri kullanmak ve uzak eklemleri kullanarak birleştirmektir.
  2. diğeri ise zincirin kendisi için dikdörtgenler oluşturmak ve daha sonra bunları döner eklemler kullanarak bağlamaktır.

her senaryoda bir ancher (benim durumumda statik bir kutu) olması gerekir. ip parçalarının ağırlığını düşürürseniz (daire şekilleri veya dikdörtgen şekiller kullanırsanız) daha iyi olur, örneğin daha gerçekçi fiziklere sahip olmak için yoğunluklarını 0,1'e ayarladım ve ipin ucuna bağlanan kutu için yoğunluk 10'u kullandım.

Halat segmentinizin birbirine nasıl tepki verdiği konusunda endişelenmeniz gereken başka bir şey. Sadece ipimin sahnede serbestçe hareket etmesini istedim, bu yüzden tüm halat fikstürlerini sensör olarak işaretledim. farklı bir yaklaşıma ihtiyacınız olabilir.

endişelenmeniz gereken bir sonraki şey, dünya güncellemesine geçtiğiniz yineleme sayısıdır: ipin düşük segmenti için (belki en fazla 8) yüksek bir iterasyon değeri kullanmaya gerek yoktur. ancak segment sayısını arttırırsanız, örneğin 30 segment denedim, düşük tekrarlama sayısı ile ipiniz uzunluğunu arttırması gerektiği gibi artmaktadır, bu yüzden bu durumları çözmek için belki 40/40 tekrarlamaya ihtiyacınız vardır.

bazı testlerden sonra kutu 2d, 0.1m ila 10m nesne boyutlarına sahip sahneler için tasarlanmıştır ve büyük sahneler için önerilen maksimum boyut yaklaşık 50mx50m'dir. temelde bu parametreleri eşleştirmek için nesnenizi ölçeklendirmeniz gerekir. Benim durumumda ilk olarak piksel konumlarını doğrudan box2d'ye geçirmeye çalıştım, ancak dünyanın olması gerektiği kadar hızlı hareket etmesini engelleyen bazı hız sınırları varmış gibi görünüyordu, bu yüzden en iyi sonuçları elde etmek için sahneyi 64 kez ölçeklendirmek zorunda kaldım. Kendimi test etmeme rağmen box2d'de daha büyük sahneler kullanmanızı engelleyen bazı sınırlamalar var. örneğin b2Setting.hdosyada #define b2_maxTranslation 2.0fbox2d ayarlarını değiştirebileceğiniz tanımlı bir değer var, ancak önerilmez.


bana downvote kazanmak için box2d ile neden yanlış ??
Ali1S232

Bu soruya cevap vermiyor. En azından Box2D kullanarak nasıl çalıştığını yaz.
bummzack

@bummzack: tamam cevabıma ekleyeceğim
Ali1S232

Bunu cevabınız olarak kabul ederseniz, sorunuz kusurlu ise. Bölümlenmiş ip fiziği, tanımladığınızdan çok farklıdır.
AttackingHobo

@attackingHobo: quesiton o zaman doğruydu ama kodumu box2d'ye dönüştürdüğümde, çok fazla çaba harcamadan orada bölümlenmiş ip fiziği uygulayabildiğimi anladım. ve çok farklı değil, sorumu parçalı bir ipin sadece bir parçası olarak düşünün. ve neredeyse tüm çözümlerim box2d olmadan daire tarzı bir halat uygulamak için yollar oldu.
Ali1S232

2

Halatın çekül hattından (merkezden) ne kadar uzak olduğuna bağlı olarak salınım hareketinin hızını yavaşlatmayı düşündünüz mü?


tüm 3 yaklaşım için ipin uzunluğu sallanma hızını hesaplamak için kullandığım parametrelerden biridir. Ama doğru kullandığımı garanti edemiyorum. Sadece bazı fiziksel hesaplamalar yaptım ve çözülmüş versiyonlarını oyuna uyguladım.
Ali1S232

Merkezden uzaklaştıkça, ipin bir sonraki hareketinden önceki gecikme uzar. Gecikmenin ABSolute değerini 0.28 gibi bir şeyle çarpabilirsiniz (bununla denemeniz gerekir).
Randolf Richardson

Söylemeye çalıştığınız şeyi alamıyorum, bir sonraki adımı hesaplarken delta_time için sabit bir değere sahibim ve hesaplamak için sahip olduğum tüm parametreleri (önceki hız, önceki konum, halat uzunluğu vb.) Kullanıyorum ve yeni konum oluşturmak için delta_time ile çarpılan bu hızı son konuma ekleyin. başka bir şey ifade ediyorsanız, lütfen cevabınızda tüm ayrıntıları belirtin.
Ali1S232

1

Oyuncu ipin uzunluğundan daha fazla olduğunda, oyuncu hemen geçtiği mesafeye eşit bir kuvvetle geri itilecektir. Bu yaylanma hissetmeden çalışmalı ve oyuncuya sezgisel hissetmelidir. Yine de oyununuz için en iyi sonuçları almak için fizik ayarlarınızı yapmak zorunda kalabilirsiniz.

Halat takıldığında. Bir maxLengthdeğer kaydedin .

Her güncelleme, kontrol distancearasındaki playerveattachPoint

Eğer distancedaha azdır maxLengthnormalde güncelleme, ipten hiçbir etkileri.

Mesafe, mesafeden daha büyükse maxLength, ' normalden attachPointoynatıcıya doğru olanı bulun . Arasındaki farkı alın distanceve maxLength. Ekle playerVelocity, normalfarkı ile çarpılır.

Sahte Kod:

dx = (attachPoint.x - player.x)
dy = (attachPoint.y - player.y)

distance = sqrt(dx*dx+dy*dy);

if (distance > maxDistance)
{
    float dx1 = dx / distance * maxDistance;
    float dy1 = dy / distance * maxDistance;
    v.x += (dx1 - dx) / dt;
    v.y += (dy1 - dy) / dt;
}

playerVel += v * dt;

yani ben cevabınıza düzenlenmiş kod (üzgünüm ama eklemek için daha iyi bir yer bulamadık) önerdiğiniz biri mi?
Ali1S232

Düzenlemeyi onayladım ve evet bence bu olmalı. Daha önce halat fiziği kullandım ve aynı şeyi yapmak için çok daha kıvrımlı bir yol kullandım, çünkü bu kodun düzgün çalışacağından tamamen emin değilim, ama sanırım ve yapmasa bile, sizi 95 yolun% 'si.
AttackingHobo

Bazı denemeden sonra ben bu sorun için ve size olması için bu kodu değiştirmek zorunda arada box2d çalışıyor gidersiniz tahmin dx = player.x - attachpoint.xve dy = player.y - attachpoint.y.
Ali1S232

1

Http://www.cocos2d-iphone.org/archives/1112 adresine bakarsanız, ipin ucuna tutturulmuş sağlam bir gövdeye sahip bir ip uygulaması vardır. Fizik motoru için Box2D kullanır. Kaynak koduna bakarsanız, istediğiniz herhangi bir dilde uygulayabileceğinizden eminim.

Ayrıca, Halat sorusuna yukarıdaki bağlantı benim ve yukarıdaki bu demo (sağlanan bağlantı) gerçekten yardımcı oldu.

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.