타일 ​​기반 2D 플랫 포머에서 45 ° 경사


12

타일 ​​기반 플랫 포머에서 간단한 45 ° 경사를 원하지만 알고리즘을 다운시키는 것만으로는 불가능합니다. 코드와 비디오를 살펴보십시오. 아마도 분명하지 않습니까?

//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 2016 년

@ ashes999 나는 그것이 내가 쓴 것보다 훨씬 간단하다고 생각하지 않습니다. 계산에서 m그리고 무엇입니까 b?
— bummzack 2016 년

@bummzack m은 기울기 (하위 45도 기울기의 경우 1, 위로 기울기의 경우 -1)이고 b는 x 축의 절편입니다. 9 학년 대수학. 그냥 말해
— ashes999

@ ashes999 그래 오랜만이야. 이 방정식을 답으로 자유롭게 게시하십시오.
— bummzack 2016 년

8

이것은 이미 답변되었지만 다른 방정식을 제공하겠습니다. y = mx + b여기서 y는 계산 된 좌표, m은 기울기 (45도에서 1은 45도에서 1은 45도, b는 y 절편입니다)- -x = 0 인 y 좌표

이렇게하면 약간 더 유연 해집니다. m을 변경하여 45도 이외의 다른 기울기를 계산할 수 있습니다. 예를 들어, m / 3의 pi / 3는 30 도의 기울기를 제공합니다.


4

이 사이트에서 많은 가치를 찾을 수 있습니다 : http://info.sonicretro.org/Sonic_Physics_Guide

특히 당신이 찾고있는 것을 위해 Solid Tiles : Slopes and Curves 섹션을 확인하십시오. 기본적으로 이것이 초기 소닉 게임에서 달성되었다고 생각되는 방식을 보여줍니다.


흥미로운 읽기이지만 너무 복잡합니다. 이 종류의 기울기는 내가 원하는 유일한 것이므로 솔루션을 단순화해야합니다. 높이 맵 / 센서 / 스캐너 시스템은 이로 인해 과도하게 사용됩니다. 그래도 링크를 파고 주셔서 감사합니다.
— xNidhogg

2

Seperate Axis Theorm을 살펴볼 수도 있습니다. 기울기 문제를 해결하지만 약간의 수학이 필요하며 이론 자체는 머리를 돌리기까지 시간이 걸립니다. 더 잘 설명하는 튜토리얼과 책에 당신을 연결했습니다

메타넷 소프트웨어 튜토리얼

실시간 충돌 감지


너무 많아요, imo. 이것은 매우 단순화 된 경우이며 다른 SAT 사용이 필요하지 않습니다. 그래도 링크를 가져 오는 데 시간을 내 주셔서 감사합니다.
— xNidhogg

2

다른 곳에서 오류가 있거나 올바른 시간에 _leftSlope / _rightSlope 플래그를 설정하지 않은 것 같습니다. 이 코드는 X 움직임에 전혀 영향을 미치지 않지만 비디오의 문제인 것 같습니다.

해당 플래그가 전혀 트리거되는지 확인해야합니다. 그런 다음 수평 충돌 감지를 확인하십시오. 경사면에서 트리거하지 않기를 바랍니다.


오 신 이시군요 나는 이것이 일어날 때 실제로 수평 또는 수직 충돌 감지를 원하지 않습니다. 나는 그것을 비활성화하는 것을 완전히 잊었다. 지금은 다소 나아 보이지만 아직 완료되지 않았습니다. 감사.
— xNidhogg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.