Saya ingin memiliki kemiringan 45 ° sederhana di platformer berbasis ubin saya, namun saya sepertinya tidak bisa menurunkan algoritme. Silakan lihat kode dan videonya, mungkin saya kehilangan yang jelas?
//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;
}
Video seperti apa: http://youtu.be/EKOWgD2muoc
xna
c#
xna-4.0
platformer
xNidhogg
sumber
sumber
Jawaban:
Dari apa yang saya mengerti membaca pertanyaan Anda, Anda ingin menghitung
Y
posisi yang benar , diberiX
posisi pemain. Ini agak sepele. Lihatlah gambar ini:Dengan anggapan slope-tile Anda berada pada posisi tertentu
x,y
(asal berada di kiri bawah seperti pada gambar). Anda memiliki posisi pemainx1
dan lebar serta tinggi ubin yang miring (u, v
).x, y
danx1
merupakan koordinat dunia.Dengan parameter ini, posisi Y pemain Anda (
y1
) adalah:Jika Anda hanya berurusan dengan sudut 45 derajat, maka akan semakin mudah:
Jika kemiringan adalah sebaliknya, itu adalah:
sumber
m
danb
dalam perhitungan Anda?Meskipun ini sudah dijawab, izinkan saya untuk menawarkan persamaan lain:, di
y = mx + b
mana y adalah koordinat yang dihitung, m adalah kemiringan (-1 untuk turun pada 45 derajat, 1 untuk naik pada 45 derajat), dan b adalah penyadapan y - - koordinat y tempat x = 0.Ini memungkinkan Anda sedikit lebih fleksibel; Anda dapat mengubah m untuk menghitung kemiringan berbeda selain 45 derajat. Misalnya, m pi / 3 memberi Anda kemiringan 30 derajat.
sumber
Anda dapat menemukan banyak nilai di situs ini: http://info.sonicretro.org/Sonic_Physics_Guide
Khusus untuk apa yang Anda cari, lihat bagian Solid Tiles: Slopes and Curves. Ini pada dasarnya menunjukkan kepada Anda bagaimana hal ini diyakini dilakukan dalam permainan Sonic awal.
sumber
Anda mungkin ingin melihat ke dalam The Seperate Axis Theorm, Ini akan menyelesaikan masalah kemiringan Anda, tetapi itu membutuhkan cukup banyak matematika dan teorinya sendiri membutuhkan waktu untuk menyelesaikan masalah Anda. Saya telah menautkan Anda dengan tutorial dan buku yang menjelaskannya dengan lebih baik
Tutorial metanetsoftware
Real-Time-Collision-Detection
sumber
Saya pikir Anda memiliki kesalahan off-by-one di tempat lain, atau Anda tidak mengatur flag _leftSlope / _rightSlope pada waktu yang tepat. Kode ini tidak menyentuh gerakan X sama sekali, tetapi itu tampaknya menjadi masalah Anda dalam video.
Anda harus memeriksa apakah flag-flag itu dipicu sama sekali. Kemudian periksa deteksi tabrakan horizontal Anda: Anda tidak ingin itu memicu pada kemiringan.
sumber