Döşeme tabanlı izometrik oyunda serbest hareket


9

Kiremit tabanlı bir izometrik oyunda serbest hareketi uygulamanın makul bir kolay yolu var mı? Bu, oyuncunun bir döşemeden diğerine hemen atlamayacağı veya ızgaraya "yakalanmayacağı" anlamına gelmez (örneğin, döşemeler arasındaki hareket animasyonluysa, ancak animasyon bitmeden herhangi bir şey yapmanıza karşı kilitlenirseniz). Oyun programlama ile ilgili herhangi bir şeye gerçekten yeni başlıyorum, ancak bu sitenin ve diğer bazı kaynakların yardımıyla temel şeyleri yapmak oldukça kolaydı, ancak bu özel sorun için yararlı bir kaynak bulamadım .

Şu anda buna yakın bir şey doğaçlama yaptım: http://jsfiddle.net/KwW5b/4/ (WASD hareketi). Hareket fikri, oyuncunun farklı bir döşemeye ne zaman geçtiğini tespit etmek ve sonra ofsetleri çevirmek için fare haritasını kullanmaktı ve çoğunlukla doğru çalışıyor (her köşe oyuncuyu yanlış yere hareket ettiriyor: bkz. Http: //www.youtube.com/watch?v=0xr15IaOhrI , muhtemelen tam fare haritasının düzgün çalışmasını sağlayamıyorum), ancak iyi / aklı başında bir çözüme bile yakın olduğu konusunda hiçbir yanılsamam yok. Her neyse, çoğunlukla sadece ne tür bir şey uygulamak istediğimi göstermek.


Bu kod harika görünüyor, sorun tam olarak nedir? Kodunuz oldukça mütevazı (iyi bir şekilde) kodunuz oldukça iyi görünüyor, demoda hangi özellik eksik?
AturSams

Köşe sorunları ile kastettiğim bu tür bir davranıştı: youtube.com/watch?v=0xr15IaOhrI . Sorunlu ofsetler için çok fazla if kontrolü yapmak dışında başka bir çözüm bulamadım ve o zaman bile oyuncunun yanlış bir yere çarptığı bazı özel durumlar var. Ama dediğim gibi, başka bir yerde kullandığım yöntemi görmediğim için bu tür hareketlerin genellikle nasıl uygulandığını merak ediyordum.
xtr486

Yanıtlar:


10

Her şeyden önce yönleri değiştirmenizi öneririm: W - yukarı sol S - aşağı sağ A - aşağı sol D - sağ üst

daha sezgisel olarak: W - yukarı S - aşağı A - sol D - sağ

Endişenizle ilgili olarak, biri izometrik karo koordinatlarını ızgara koordinatlarına çeviren ve ikincisini tersine çeviren iki işlev yapmanızı öneririm. Bu şekilde MVC'yi kolayca ayırabilirsiniz ve aktif kutucuğu hesaplarken hayatınızı kolaylaştıracaktır: resim açıklamasını buraya girin


1
Cevabınız gerçekten umut verici görünüyor, ama itiraf ediyorum ki hemen hemen başımın üzerinden geçti. Ancak, önümüzdeki birkaç gün içinde çözümünüzü sindirmeye devam edeceğim. Bu, peşinde olduğunuz yere yakın mı? jsfiddle.net/Sd4ZP/18 Bazı mantık hataları var (bir tarafından kapalı vb.) Ve böyle, ama bildiğim kadarıyla yukarıdan aşağıya ve izometrik haritalar aynı harekete sahip. Ben bile aldım değil kiremit ofset yukarıdan aşağıya izometrik
çevirmek olduğunu

Şimdiye kadar iyi görünüyor! Akşam saatlerine bakacağım. Mesele, izometrik karo çizim yöntemindeki dönüşümleri positionToUser () çevirme işlevine uygulamak ve bu işlevi positionFromUser () yöntemine ters çevirmektir.
Markus von Broady

Sorunu görüyorum: tuval çizim API'sini kullanmak yerine görüntüleri koyarak izometrik görünüm çiziyorsunuz. Sonunda izo fayanslarınız düz bir renkten çok daha fazla olacağı için oldukça mantıklı. Ancak, hata ayıklama için, karolar arasında, hayatınızı daha kolay hale getirecek çizgiler de çizmelisiniz. Her neyse, kodunuzu çatalladım ve positionToUser (x, y) çeviri fonksiyonu oluşturdum. Siyah kareyi bir karo üzerinde ortalayarak test edin (çünkü iso görünümünde her zaman ortalanır) ve fareyi alt tuvalin üzerine getirerek
Markus von Broady

Teşekkürler! Aslında kendimi bir şey, yani drawIsometric işlevindeki izometrik ofset çıkarım yaptım. Şimdi şuna benziyor: jsfiddle.net/P2eKF/4 , ki bu sadece orijinal soruda sorduğum şeyi yapıyor, bu yüzden cevabınızı işaretleyeceğim. :)
xtr486

Yaptığına sevindim! WA, WD, AS, SD tuş kombinasyonlarının hareketi 45 derecelik açılar yerine izometrik eksenlere nasıl hizaladığını seviyorum. İyi iş.
Markus von Broady

0

Eğer anlıyorsam, oyuncunun fayans döşemesini ancak zıplamadan hareket ettirmesini istersiniz. Yapabilirsin:

1- t0 döşemesi ile başlayın ve 0 ofseti

2- Oyuncu t1 döşemesine geçtiğinde ofset = - (t1 - t0)

3- Oynatıcı güncellemesinde ofset 0 değilse, güncelleme zamanını ve oynatıcı hızını kullanarak azaltın.

amount = deltatime * playerSpeed
deltaoff = sqrt(offsetX*offsetX + offsetY*offsetY)
total = min( amount, deltaoff )
offsetX = offsetX - (total * offsetX / deltaoff)
offsetY = offsetY - (total * offsetY / deltaoff)

4- Oyuncunun karoda olduğunu bilmek için ofset == 0 kontrolünü kullanabilirsiniz.

Bununla harita üzerinde serbestçe hareket eden ancak fayanslara yapışan bir oyuncu elde edersiniz.

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.