Bir platform oyununda hareketli platformları nasıl ele alırım?


15

Ben box2d ya da başka bir şey kullanmak istemiyorum, sadece basit hareketli platformlar (yukarı-aşağı, sol-sağ, çapraz ve dairesel yollar) istiyorum. Benim sorum güncelleme sırası / kontrol hiyerarşisini işlemek, böylece oyuncu zıplamadan ya da sallanmadan platforma sabit bir şekilde sabit kalır?

Yanıtlar:


16

Benim çözümüm oyun haritasındaki her fiziksel varlığa bir ağaç düğümü ve haritanın kendisine kök düğümü gibi davranmak olacaktır . Düğümler başka düğümler içerebilir. Her bir düğüm (doğrudan veya dolaylı olarak) harita düğümü içinde bulunur.

Diyelim ki karakteriniz bir platformda duruyor. Platformun düğümü, karakterin düğümünü içerir. Böylece, platform her hareket ettiğinde, içerdiği düğümler (bu durumda karakter) de hareket eder.

Bunun gerçekleşmesi için, her düğümün ana düğüme göre bir (x, y) konumuna sahip olması gerekir . Örneğin, karakteriniz platforma göre (1,0) , kendisi de oyun haritasına göre (10,10) bulunabilir . Bu şekilde, platform hareket ederse, karakteriniz örtülü olarak hareket edecektir.

Bu hiyerarşik ağaçta, her düğümün konumu, konumunun artı her üst düğümünün konumlarının toplamına eşittir. Diyelim ki karakterin haritada yerini almak istiyoruz. Hesaplıyoruz:

(karakterin konumu) + (üst düğümün konumu) + (kök düğüm konumu) = (1,0) + (10,10) + (0,0) = (11,0)

Tamam, tüm bu zaman boyunca karakteriniz platformda duruyordu. Atlamaya ne dersin? Eh, o atlar an, platformdan onu ayırmak ve platformu içeren düğüme onu takmak ; bu durumda, harita (kök düğüm).

Tekrar indiğinde, onu hangi düğüme bağlıysa ona bağla.


1
Oynatıcıyı etkilemek için düğümden x ve y hızını da kullanırım. Örnek 1: Platform çok hızlı hareket eder ve durur, oyuncu yukarı ivmeye sahiptir ve piyasaya sürülür. Örnek 2: Platform, ölümcül bir hızda düşen oyuncudan biraz daha yavaş hareket ediyor. Platform yerine üzerinde topraklara güvenli olmalıdır SPLUT
AttackingHobo

bu ilginç bir yaklaşım ama sadece hareketli platormalara izin vermek için motorumda tam bir değişiklik gibi görünüyor. Belki geçici olarak bu etkiyi veren herhangi bir nesneye yapabileceğim bir bileşen olarak objectOnPlatform oluşturursam?
Iain

10

Bunu sahte fizik problemi olarak ele almayı ve yer sürtünmesini kullanarak çözmenizi öneririm.

Karakteri yerde tutmak için yerçekimini zaten kullanıyorsunuz, bu platformların yukarı ve aşağı hareket ettiği durumları ele alıyor. Sol ve sağ hareketi idare etmek için, zemin karakter üzerinde büyük bir sürtünme uygulamalıdır. Tipik olarak bu sürtünme seviyesi% 1.0 veya% 100 olacaktır.

Karakter hareketsiz duruyorsa, hızları 0'dır ve bunun yerine sürtünme nedeniyle platformun hızının% 100'ünü miras alırlar. Aşağıdaki gibi bir şey:

character_velocity = friction * platform_velocity

Bu yaklaşımın yararı, dik yamaçlardaki sürtünmenin üstesinden gelip karakterinizin kaymasına izin vermek gibi ek platform mekaniğine kolayca borç vermesidir. Ayrıca, karakterin üzerinde kayacağı buz oluşturmak için sürtünmeyi kolayca azaltmanıza izin verir.

Ayrıca, oyuncunuzu hareketli bir platformdan atabilecek alçak duvarlar gibi sorunlarla uğraşmak daha kolaydır. Karakteri bir üst platformun çocuğu olarak ele alırsanız, çok fazla iş yapmadan çarpışma tespitinizin geri kalanıyla çok kolay etkileşime girmemesi için iyi bir şans var.


0

Oyuncu pozisyonunu "seviyede mutlak" değil, "platforma göre" düzeltebilir, ardından gerçek pozisyonunu veren bir fonksiyonunuz olabilir. Yine de hoşuma gitmedi.

Oynatıcıyı platforma bağlamak muhtemelen daha iyi (ve daha basit) olacaktır, böylece platform + x / + y hareket ettiğinde, oyuncu o kadar hareket eder.

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.