Hızlı şeyin yavaş görünmesini sağlayın (Box2D)


9

Rakibine top atmak için bir trebuchet'i kontrol ettiğiniz bir oyun üzerinde çalışıyorum.

'Ortaçağ Kuşatması' adlı bir oyun gibi. Trebuchet kolunu salladığında, oyuncunun düğmeye basmak ve topu bırakmak için en iyi anı yakalaması gerekir. Sonra top teğet açıyla uçacaktır. resim açıklamasını buraya girin Benim sorunum şu ki, trebuchet kolu oyuncunun doğru anı yakalayamayacak kadar hızlı sallanması. Bu arada bu kadar hızlı olmalı, aksi takdirde yeterince alamaz. Ve topu ve trebuchet kolunu birbirine bağlayan küçük bir ip var, eğer kol çok yavaş sallanırsa, kol hareket ettiğinde top sadece ipte asılıdır.

Sorunu adım boyutu değiştirerek çözerim, kol her sallandığında, adım boyutunu 1/60'tan 1/200'e değiştiririm. Ve oyuncu topu serbest bıraktığında 1/60'a geri döner.

Benim oyun ağ ile çok oyunculu için dışında bu oldukça iyi çalışıyor. Dolayısıyla adımın değiştirilmesi soruna neden olabilir.

Aklıma gelen başka bir çözüm, yavaş sallanmasına izin vermektir, ancak oyuncu topu serbest bıraktığında, yönünü korurken topa elle hız eklerim. Bu çözümü gerçekten sevmiyorum çünkü sahte görünüyor ve hala ipi çok kısa yapmadıkça topun ipte asılı kalması sorunu hala var ..

Lütfen buna biraz ışık tut, teşekkürler!


DÜZENLE

Herkesin girişi için teşekkürler, kolu yavaşça sallayarak sorunu çözdüm ve oyuncu topu serbest bıraktığında, topun hızını ve iki katını yakala. Adım boyutunu değiştirmekle tamamen aynı görünüyor. Yapmam gereken tek bir şey daha var. Kol gerçekten yavaşça sallandığı için top sadece sallanmak yerine kolun ucuna asılıdır. Bunu, vuruş sırasında ve sadece vuruş sırasında topun çekim kuvvetine eşit bir kuvvet uygulayarak çözdüm. Sonra artık orada asılı kalmaz, kolla birlikte sallanır.

@MrCranky'nin cevabı detaylı ve yapılabilir görünüyor, bu yüzden kabul ediyorum. :)


Belki trebuchet'i yavaşça hareket ettirebilirsin, ama topa etkiyen kuvvetleri çoğaltabilirsin? Daha önce Box2D ile çalışmadım, bu aptalca bir fikirse çok üzgünüm. Bunun dışında, tek tahminim, daha ağır veya daha hafif olanların size daha düşük hızlarda kabul edilebilir sonuçlar verip vermeyeceğini görmek için topun kütlesi ile uğraşmak olacaktır. Ayrıca, gerçek hayat trebuchetlerin fiziğine bakmaya değer olabilir. Bunlar biraz yavaş görünüyor , bu yüzden belki onlar hakkındaki veriler (boyut, cephane, kuvvetler vb.) Size benzetilmiş olanınız için bazı fikirler verebilir.
Christian

2
Bilgisayar fiziğinin "gerçek şey" gibi davranmasını sağlamak gerçekten zordur. Hemen hemen tüm fizik motorları sert cisimleri simüle eder, yani trebouchet kolunun bükülmesi gibi etkiler ne halat fiziği ne de herhangi bir şekilde malzeme davranışı için açıklanmaz, bu nedenle "hile" olmadan kesin bir simülasyon imkansızdır. Gerçek görünen bir şeye yaklaşma süreci şu şekilde gider: tweak, tweak, tweak, cheat, tweak, tweak, cheat, cheat, tweak, baştan başlamak, tweak, tweak, tweak, tweak, cheat, tweak, cheat , hile, çimdik.
LearnCocos2D

4
Yavru top, bu konuya en gerçekçi yaklaşımı kullanır: İnsanlar , gerçekliği manipüle etmede o kadar kötüdür ve bir insanın manuel olarak kontrol edebilmesi için yeterince yavaş hareket eden bir trebuchet "hissi" vermek istiyorsanız, makine yardımına ihtiyaç duyarlar. fiziksel olarak mümkün olandan daha hızlı, tamamen "ateşleme" sanatsal bir animasyon oluşturmak ve daha sonra kullanıcının animasyonu kestiği yere göre topu ortaya çıkarmak isteyebilirsiniz.
MickLH

Yanıtlar:


3

İçgüdüsel olarak, cevaplamak için gereken bağlamın önemli bir bölümünü kaçırdığımızı söyleyebilirim.

Bir fizik simülasyonunu bir ağ bağlantısı üzerinden paylaşmaya çalışıyorsanız, bu genellikle yapmak oldukça zor bir şeydir. Simülasyonlar çok kolay ayrılıyor ve özellikle paketleri kaybedebilen ağ bağlantılarında, işleri bir arada tutmak çok zor.

Sorunuzun basit ve en sağlam cevabı değişken bir zaman aralığı kullanmaktır. Karar anına yaklaştığınızda, fizik simülasyonunuzu geçen her gerçek dünya saniyesi için bir saniye güncellemek yerine, yarım saniye veya başka bir uygun sayı ile güncelleyin. Bir entegrasyon etkisi olduğundan, muhtemelen güncelleme penceresi sırasında güncelleme hızını daha düşük hıza indirerek kurtulmak mümkün olacaktır, ancak aynı zamanda hızlı bir şekilde daha düşük hıza enterpolasyon da yapabilirsiniz. Her iki durumda da, esasen ağır çekimde fizik simülasyonunu oynuyorsunuz. Mükemmel bir şekilde doğru davranmalı, oyuncunun karar verebileceği kadar yavaş olmalıdır. Fiziğin çalışmasını sağlamak için fuding yapmanın başka yollarını düşünmezdim, büyük olasılıkla hepsi korkunç çalışır ve 'doğru' hissetmezler.

Böylece ağ uygulamasına geri dönüyoruz. Daha fazla bilgi olmadan, sanırım iki seçeneğiniz var. İlk olarak, diğer ağa bağlı tarafla kilit adımında çalışıyorsanız. Dolayısıyla, bir oyuncunun karar vermesi için yavaşlaması gerektiğinde, her iki oyuncuyu da eşit derecede yavaşlatın. Bu muhtemelen atış yapmayan oyuncu için can sıkıcı ve garip hissedecek, çünkü kendi tepki sürelerini karıştıracak.

İkincisi için, iki trebuchet'in birbirine ateş ettiğini hayal edin. Trebuchet'in fırlaması 10 saniye sürüyor ve ateş penceresi T + 5'lerde başlıyor. P1, ateşleme döngüsünü T + 0'larda başlatır ve T + 5'lerde yerel fizik simülasyonunu% 50 oranında yavaşlatır. Tüm döngü boyunca oynamak 15s alacak. Böylece T + 5s'de P1, P2'ye 10'ların başlatma döngüsünü tam hızda oynatmaya başlamasını söyler. P1, trebuchet döngüsünün 15 saniye aldığını, P2 10 saniyeyi aldığını görüyor, ancak her iki oyuncu da döngü bitimini T + 15'lerde görüyor. P1 gerçekten serbest kaldığında, P2'ye serbest bırakıldıkları kavramsal döngüde olduğunu söyler. Eğer P1 T + 10'larda serbest kalırsa, bu aslında 10'ların lansman döngüsünde 7.5'lerde. P2 daha sonra T + 12.5s'de (döngünün yerel oynatılmasında 7.5s) serbest bırakmayı gösterebilir ve her iki oyuncu simülasyonu mermiyi döngüde aynı fiziksel noktada başlatmış olmalıdır.

Yani bu ikinci yaklaşımda, artık kilit adımını simüle etmiyorsunuz. İki bağımsız simülasyon çalıştırıyorsunuz, bunun yerine oyuncu girdilerini izliyorsunuz. Her ikisine de oyuncunun 7.5s'de fırlatma döngüsüne çıktığı söylenirse, her ikisi de merminin nereye ineceği konusunda hemfikir olmalıdır. Yine de pratikte, bu çok hızlı bir şekilde sapma gösterecektir ve simülasyon durumlarını bir şekilde senkronize etmeniz gerekecektir.


0

Neden sadece var olan ve benzer durumlarda çalışanları kopyalamak / uyarlamak değil?

resim açıklamasını buraya girin


0

Eğer trebuchet'iniz çok hızlı hareket ediyorsa, bariz çözüm onu ​​yavaşlatmak için zamanı ölçeklendirmek olacaktır. Yani, gerçek zamanın her saniyesi için, örneğin fizik simülasyonunuzda sadece 0,1 saniye geçmesini sağlayın. Şimdi, oyuncunun bakış açısından, top 10 kat daha yavaş hareket edecektir.

Aslında, aynı etkiyi elde etmenin başka bir yolu daha var: zamanı ölçeklemek yerine, zaman da dahil olmak üzere tüm fizik sabitlerinizi ölçeklendirin. Örneğin, yerçekimi ivmesinin birimleri hız / zaman = mesafe / zaman²'dir, bu nedenle yerçekimi oyununuzdaki tek sabitse, 100 = 10²'lik bir faktörle ölçeklendirmek, zamanı 10 kat yavaşlatma ile aynı etkiyi elde eder. .

Elbette, fizik modelinizde zaman birimleri olan diğer sabitler (veya hız = mesafe / zaman veya hızlanma = mesafe / zaman², vb.) Varsa, yörüngeleri aynı tutmak istiyorsanız bunları da ölçeklendirmeniz gerekir. .

Bununla pratik olarak ne kadar ileri gidebileceğinize dair bir sınır olduğunu unutmayın: 100'lük bir faktörle yavaşlatırsanız, trebuchet'inizi kontrol etmek gerçekten kolay olacaktır, ancak oyuncularınız da onları ateş ettikten sonra yavaşça aşağı yüzer. Bu bir sorun varsa, diğer cevaplarda önerilenler gibi, trebuchet ateş ederken gerçekten yavaş zaman ölçeklendirmesi kullanmak, ancak top başlatıldıktan sonra daha hızlı bir zaman ölçeğine geçmek gibi daha gelişmiş numaralara başvurmanız gerekebilir.


teşekkürler, ama muhtemelen düzenlememi görmedin. Evet, cevabınızdaki son yöntemle
çözdüm
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.