Độ dốc 45 ° trong một nền tảng 2D dựa trên Ngói


12

Tôi muốn có các độ dốc 45 ° đơn giản trong nền tảng dựa trên gạch của mình, tuy nhiên tôi dường như không thể làm giảm thuật toán. Xin hãy xem mã và video, có lẽ tôi đang thiếu điều hiển nhiên?

//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 về nội dung của nó: http://youtu.be/EKOWgD2muoc


1
Không phải vectơ tuyệt vời? : D
Gustavo Maciel

Câu trả lời:


10

Từ những gì tôi hiểu khi đọc câu hỏi của bạn, bạn muốn tính toán Yvị trí chính xác , đưa ra một Xvị trí của người chơi. Điều này là khá tầm thường. Hãy nhìn vào hình ảnh này:

dốc

Giả sử gạch dốc của bạn ở một vị trí nhất định x,y(gốc nằm phía dưới bên trái như trong ảnh). Bạn có vị trí người chơi x1và chiều rộng và chiều cao của ô dốc ( u, v). x, yx1là tọa độ thế giới.

Đưa ra các tham số này, vị trí Y của bạn ( y1) sẽ là:

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

Nếu bạn chỉ xử lý các góc 45 độ, thì nó thậm chí còn đơn giản hơn:

y1 = y + (x1 - x)

Nếu độ dốc ngược lại, đó là:

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

sau khi áp dụng sửa lỗi @SkimFlux cộng với công thức mới của bạn cộng với một số điều ngu ngốc tôi đã bỏ qua nó đã hoạt động. cảm ơn.
xNidhogg

Bạn không thể sử dụng y = mx + b để tính toán đơn giản hơn?
tro999

@ tro999 Tôi không nghĩ nó đơn giản hơn nhiều so với những gì tôi đã viết. Là gì mbtrong tính toán của bạn?
bummzack

@bummzack m là độ dốc của bạn (1 cho độ dốc 45 độ xuống dưới, -1 cho hướng lên) và b sẽ là phần chặn trên trục x. Đại số lớp 9. Chỉ cần nói.
tro999

@ tro999 Vâng, nó đã được một thời gian dài. Hãy đăng phương trình này như một câu trả lời.
bummzack

8

Mặc dù điều này đã được trả lời, cho phép tôi đưa ra một phương trình khác: y = mx + btrong đó y là tọa độ được tính, m là độ dốc (-1 cho xuống ở 45 độ, 1 cho lên ở 45 độ) và b là giao thoa y - - tọa độ y trong đó x = 0.

Điều này cho phép bạn linh hoạt hơn một chút; bạn có thể thay đổi m để tính độ dốc khác ngoài 45 độ. Ví dụ, một m pi / 3 cung cấp cho bạn độ dốc 30 độ.


4

Bạn có thể tìm thấy rất nhiều giá trị trong trang web này: http://info.sonicretro.org/Sonic_Physics_Guide

Cụ thể cho những gì bạn đang tìm kiếm hãy kiểm tra phần Solid Tiles: Slopes and Curves. Về cơ bản nó cho bạn thấy làm thế nào người ta tin rằng điều này đã được hoàn thành trong các trò chơi Sonic đầu tiên.


đọc thú vị, nhưng quá phức tạp. Loại dốc này là độ dốc duy nhất tôi muốn, do đó nên đơn giản hóa giải pháp. Một hệ thống bản đồ / cảm biến / máy quét chiều cao sẽ là quá mức cần thiết cho việc này. Cảm ơn cho việc đào lên các liên kết, mặc dù.
xNidhogg

2

Bạn có thể muốn xem xét Theorm trục trục, nó sẽ giải quyết vấn đề độ dốc của bạn, nhưng nó đòi hỏi khá nhiều toán học và lý thuyết phải mất một thời gian để bạn có thể đi đầu. Tôi đã liên kết bạn với một hướng dẫn và một cuốn sách giải thích nó tốt hơn

Hướng dẫn về metanetsoftware

Phát hiện va chạm thời gian thực


đó là quá nhiều, imo. Đây là một trường hợp rất đơn giản và không cần sử dụng SAT nữa. Cảm ơn đã dành thời gian để kéo lên các liên kết, mặc dù.
xNidhogg

2

Tôi nghĩ rằng bạn có lỗi xảy ra ở một nơi khác hoặc bạn không đặt cờ _leftSlope / _rightSlope vào đúng thời điểm. Mã này hoàn toàn không chạm vào chuyển động X, nhưng dường như đó là vấn đề của bạn trong video.

Bạn nên kiểm tra xem những lá cờ đó có được kích hoạt hay không. Sau đó kiểm tra phát hiện va chạm ngang của bạn: bạn không muốn nó kích hoạt trên dốc.


trời ơi Tôi thực sự không muốn phát hiện va chạm ngang hoặc dọc khi điều này xảy ra. Tôi hoàn toàn quên vô hiệu hóa điều đó. Có vẻ như bây giờ tốt hơn, nhưng chưa được thực hiện. Cảm ơn.
xNidhogg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.