타일 ​​기반 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

내가 당신의 질문을 읽는 것을 이해하면서, 당신 은 플레이어 YX위치에 따라 올바른 위치 를 계산하고 싶습니다 . 이것은 다소 사소합니다. 이 이미지를 살펴보십시오.

경사

슬로프 타일이 주어진 위치에 있다고 가정합니다 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.