Döşeme tabanlı 2B platformda 45 ° eğimler


12

Kiremit tabanlı platformumda basit 45 ° eğimler istiyorum, ancak algoritmayı indiremiyorum. Lütfen kod ve videoya bir göz atın, belki açık olanı özlüyorum?

//collisionRectangle is the collision rectangle of the player with 
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{        
    //Test bottom center point
    var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
    //Get the collision rectangle of the tile, origin is top-left
    Rectangle cellRect =
        _tileMap.CellWorldRectangle(
            _tileMap.GetCellByPixel(calculationPoint));
    //Calculate the new Y coordinate depending on if its a left or right slope
    //CellSize = 8
    float newY = _leftSlope
                            ? (calculationPoint.X % CellSize) + cellRect.Y
                            : (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
    //reset variables so we dont jump in here next frame
    _leftSlope = false;
    _rightSlope = false;
    //now change the players Y according to the difference of our calculation
    wantedPosition.Y += newY - calculationPoint.Y;
}

Neye benzediğini gösteren video: http://youtu.be/EKOWgD2muoc


1
Vektörler harika değil mi? : D
Gustavo Maciel

Yanıtlar:


10

Sorunuzu okuduğumu anladığım kadarıyla , oyuncunun Ybir Xpozisyonu verildiğinde doğru pozisyonu hesaplamak istiyorsunuz . Bu oldukça önemsiz. Bu resme bir göz atın:

eğim

Eğim döşemenizin belirli bir konumda x,yolduğunu varsayalım (başlangıç ​​resimdeki gibi sol alttadır). Oynatıcı konumuna x1ve eğimli döşemenin genişliğine ve yüksekliğine ( u, v) sahipsiniz . x, yve x1dünya koordinatlarıdır.

Bu parametreler verildiğinde, oyuncularınız Y-konumu ( y1) şöyle olur:

y1 = y + (x1 - x) * (v / u)

Sadece 45 derecelik açılarla uğraşıyorsanız, daha da basitleşir:

y1 = y + (x1 - x)

Eğim ters yönde ise:

y1 = y + (v - (x1 - x))

@SkimFlux fix artı yeni formüler artı bazı aptalca şeyler uyguladıktan sonra gözden kaçan işe yaradı. Teşekkürler.
xNidhogg

Daha basit bir hesaplama için y = mx + b'yi kullanamaz mısınız?
ashes999

@ ashes999 Yazdığımdan çok daha basit olduğunu düşünmüyorum. Nelerdir mve bsizin hesaplanmasında?
bummzack

@bummzack m sizin eğiminizdir (aşağı doğru 45 derecelik bir eğim için 1, yukarı doğru -1) ve b x eksenindeki kesişme olacaktır. 9. sınıf cebir. Sadece söylüyorum'.
ashes999

@ ashes999 Evet uzun zaman oldu. Bu denklemi cevap olarak yayınlamaktan çekinmeyin.
bummzack

8

Bu zaten cevaplanmış olmasına rağmen, başka bir denklem sunmama izin verin: y = mx + by, hesaplanan koordinat olduğunda, m eğimdir (45 derecede aşağı için -1, 45 derecede yukarı için 1) ve b, y kesme noktasıdır - - x = 0 olan y koordinatı.

Bu size biraz daha esneklik sağlar; 45 dereceden farklı bir eğim hesaplamak için m değerini değiştirebilirsiniz. Örneğin, bir pi / 3 m size 30 derecelik bir eğim verir.


4

Bu sitede çok değer bulabilirsiniz: http://info.sonicretro.org/Sonic_Physics_Guide

Özellikle aradığınız şey için Katı Fayanslar: Eğimler ve Eğriler bölümüne bakın. Temel olarak bunun erken Sonic oyunlarında nasıl yapıldığına inanıldığını gösterir.


ilginç okuma, ama çok karmaşık. Bu tür bir eğim istediğim tek şeydir, bu nedenle çözümü basitleştirmelidir. Bunun için bir yükseklik haritası / sensör / tarayıcı sistemi aşırıya kaçabilir. Bağlantıyı açtığınız için teşekkürler.
xNidhogg

2

Ayrı Eksen Teoremine bakmak isteyebilirsiniz, Eğim sorununuzu çözecektir, ancak biraz matematik gerektirir ve teorinin kendisi başınızı döndürmek için biraz zaman alır. Sizi daha iyi açıklayan bir eğiticiye ve kitaba bağladım

metanetsoftware Eğitimi

Gerçek Zamanlı-Çarpışma Algılama


bu çok fazla, imo. Bu oldukça basitleştirilmiş bir durumdur ve SAT'ın diğer kullanımlarına gerek yoktur. Yine de bağlantıları çekmek için zaman ayırdığınız için teşekkür ederiz.
xNidhogg

2

Sanırım başka bir yerde bir hata var ya da doğru zamanda _leftSlope / _rightSlope bayrakları ayarlamıyorsunuz. Bu kod X hareketine hiç dokunmuyor, ancak videodaki sorununuz gibi görünüyor.

Bu bayrakların tetiklenip tetiklenmediğini kontrol etmelisiniz. Ardından yatay çarpışma algılamanızı kontrol edin: eğimde tetiklenmesini istemezsiniz.


aman tanrım doğru. Aslında bu olduğunda yatay veya dikey çarpışma tespiti istemiyorum. Bunu devre dışı bırakmayı tamamen unuttum. Şimdi bir şekilde daha iyi görünüyor, ama henüz yapılmadı. Teşekkürler.
xNidhogg
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.