45 °ลาดใน platformer 2D ที่ใช้กระเบื้อง


12

ฉันต้องการมีความลาดชันที่เรียบง่าย 45 °ใน platformer ที่ใช้กระเบื้องของฉันอย่างไรก็ตามฉันแค่ดูเหมือนจะไม่สามารถทำให้อัลกอริทึมลง โปรดดูรหัสและวิดีโอบางทีฉันอาจจะขาดอะไรไปหรือเปล่า?

//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;
}

วิดีโอของสิ่งที่ดูเหมือน: http://youtu.be/EKOWgD2muoc


1
เวกเตอร์ไม่น่ากลัวใช่ไหม : D
Gustavo Maciel

คำตอบ:


10

จากสิ่งที่ฉันเข้าใจการอ่านคำถามของคุณคุณต้องการคำนวณYตำแหน่งที่ถูกต้องให้Xตำแหน่งของผู้เล่น นี่เป็นเรื่องเล็กน้อย ดูรูปนี้:

ลาด

สมมติว่าแผ่นกระเบื้องเอียงของคุณอยู่ในตำแหน่งที่กำหนดx,y(จุดกำเนิดอยู่ด้านล่างซ้ายเหมือนในภาพ) คุณมีตำแหน่งผู้เล่นx1และความกว้างและความสูงของแผ่นกระเบื้องที่เอียง ( u, v) x, yและx1เป็นพิกัดโลก

ด้วยพารามิเตอร์เหล่านี้ผู้เล่นของคุณตำแหน่ง Y ( y1) จะเป็น:

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

หากคุณกำลังทำมุม 45 องศาเท่านั้นมันจะง่ายขึ้นกว่าเดิม:

y1 = y + (x1 - x)

หากความชันเป็นอีกด้านหนึ่งคือ:

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

หลังจากใช้โปรแกรมแก้ไข @SkimFlux พร้อมสูตรใหม่ของคุณรวมถึงบางสิ่งที่โง่ฉันมองข้ามมันทำงาน ขอบคุณ
xNidhogg

คุณไม่สามารถใช้ y = mx + b สำหรับการคำนวณที่ง่ายกว่านี้ได้หรือไม่?
ashes999

@ ashes999 ฉันไม่คิดว่ามันจะง่ายกว่าสิ่งที่ฉันเขียน การคำนวณของคุณคืออะไรmและb?
bummzack

@bummzack m คือความชันของคุณ (1 สำหรับความชัน 45 องศาลดลง, -1 สำหรับขึ้นไป) และ b จะเป็นจุดตัดบนแกน x พีชคณิตเกรด 9 เพียงแค่พูดใน
ashes999

@ ashes999 ใช่มันเป็นเวลานาน รู้สึกอิสระที่จะโพสต์สมการนี้เป็นคำตอบ
bummzack

8

แม้ว่านี่จะได้รับคำตอบแล้วให้ฉันเสนอสมการอีกอัน: y = mx + bโดยที่ y คือพิกัดที่คำนวณแล้ว m คือความชัน (-1 สำหรับลงที่ 45 องศา, 1 สำหรับที่ 45 องศา) และ b คือค่าตัดแกน y - - พิกัด y ที่ x = 0

สิ่งนี้จะช่วยให้คุณมีความยืดหยุ่นมากขึ้นเล็กน้อย คุณสามารถเปลี่ยน m เพื่อคำนวณความชันอื่นที่ไม่ใช่ 45 องศา ตัวอย่างเช่น m ของ pi / 3 ให้ความชัน 30 องศา


4

คุณอาจพบว่ามีค่ามากในเว็บไซต์นี้: http://info.sonicretro.org/Sonic_Physics_Guide

โดยเฉพาะอย่างยิ่งสำหรับสิ่งที่คุณกำลังมองหาตรวจสอบในส่วนกระเบื้องที่เป็นของแข็ง: ความลาดชันและเส้นโค้ง มันแสดงให้คุณเห็นว่าเชื่อได้อย่างไรว่าเกมนี้ประสบความสำเร็จในเกม Sonic ยุคแรก


อ่านที่น่าสนใจ แต่ซับซ้อนเกินไป ความลาดชันแบบนี้เป็นสิ่งเดียวที่ฉันต้องการดังนั้นควรทำให้การแก้ปัญหาง่ายขึ้น ระบบความสูงของแผนที่ / เซ็นเซอร์ / สแกนเนอร์จะถูก overkill ขอบคุณสำหรับการขุดลิงค์
xNidhogg

2

คุณอาจต้องการตรวจดู The Seperate Axis Theorm มันจะแก้ปัญหาความชันของคุณได้ แต่มันต้องใช้คณิตศาสตร์สักหน่อยและทฤษฎีเองก็ใช้เวลาสักพักกว่าจะผ่านไปได้ ฉันเชื่อมโยงคุณเข้ากับบทช่วยสอนและหนังสือที่อธิบายได้ดีขึ้น

การสอนซอฟต์แวร์ metanets

Real-Time-ชน-การตรวจสอบ


นั่นมันมากเกินไป imo นี่เป็นกรณีที่ง่ายมากและไม่จำเป็นต้องใช้ SAT อื่น ๆ ขอบคุณที่สละเวลาดึงลิงค์ขึ้นมา
xNidhogg

2

ฉันคิดว่าคุณมีข้อผิดพลาดแบบออฟไลน์อยู่ที่อื่นหรือคุณไม่ได้ตั้งค่าสถานะ _leftSlope / _rightSlope ในเวลาที่เหมาะสม รหัสนี้ไม่ได้สัมผัสกับการเคลื่อนไหว X เลย แต่นั่นเป็นปัญหาของคุณในวิดีโอ

คุณควรตรวจสอบว่ามีการเรียกใช้ธงเหล่านั้นหรือไม่ จากนั้นตรวจสอบการตรวจสอบการชนกันในแนวนอนของคุณ: คุณไม่ต้องการให้มันเรียกใช้บนทางลาด


โอ้พระเจ้าถูกต้อง ฉันไม่ต้องการตรวจจับการชนกันทั้งแนวนอนและแนวตั้งในกรณีนี้ ฉันลืมปิดการใช้งานโดยสิ้นเชิง ดูดีขึ้นตอนนี้ แต่ยังไม่เสร็จ ขอบคุณ
xNidhogg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.