현재 Monogame을 사용하여 2d 플랫폼 작성자로 작업 중입니다. 스프라이트를 그릴 수 있고 캐릭터와 레벨을 그릴 수 있으며 캐릭터를 이동하고 점프 할 수 있지만 점프하면 캐릭터가 레벨 블록 위로 올라갈 수 있습니다. 왼쪽과 오른쪽 충돌은 정상적으로 작동하지만 캐릭터가 멈춰야 할 때 멈추지 만 점프를하면 제대로 도착하지 않습니다. 나는 다음과 같은 코드를 가지고있다 :C# Monogame : 점프 후 "부동"스프라이트
플레이어가 점프를하고 싶어하는지 확인하기 위해 위쪽 화살표가 눌러 졌는지 확인하기위한 점검이 수행된다. 키 누르기에 대한 검사가 완료되면
if(state.IsKeyDown(Keys.Up) && hasJumped == false)
{
jumping = true;
}
는 jumping
변수가
if (jumping == true)
{
jump();
} else if (falling == true && topOfBlock == false)
{
fall();
}
else
{
hasJumped = false;
verticalMovement = 14;
}
은 기본적으로 당신이 이동할지 여부를 jumping
검사, falling
검사 캐릭터가 떨어지는 경우에 해당하면 볼 수있는 체크있다 topOfBlock
은 문자가 블록 상단에 있는지 확인하고 hasJumped
은 점프가 현재 진행 중인지 (이중 점프가 가능하지 않음) 확인하고 verticalMovement
은 틱당 점프/낙하하는 픽셀 양입니다.
jump()
및 fall()
방법 모양 다음과 같이
private void jump()
{
if (verticalMovement >= 0)
{
position.Y -= verticalMovement;
verticalMovement--;
} else
{
jumping = false;
hasJumped = true;
falling = true;
}
}
public void fall()
{
position.Y += verticalMovement;
verticalMovement++;
}
코드는 명백해 나는 생각한다. 기본적으로 문자가 더 이상 위로 이동하지 않으면 falling
이 true
으로 설정되어 문자가 블록 맨 위에 있지 않은 한 fall()
메서드를 트리거합니다.
마지막으로 문자의 충돌 사각형이 문자의 새 위치로 업데이트됩니다.
colRect = new Rectangle((int)position.X, (int)position.Y, 64, 48);
position.X
와
position.Y
캐릭터의 X 및 Y 위치이다
및 64
및 48
스프라이트의 폭과 높이이다.
private void checkCollision()
{
bool topCol = false;
for (int x = 0; x < blockTileArray.GetLength(0); x++)
{
for (int y = 0; y < blockTileArray.GetLength(1); y++)
{
if (blockTileArray[x, y] != null)
{
if (hero.colRect.Intersects(blockTileArray[x, y].topWall))
{
topCol = true;
}
}
}
}
if(topCol == true)
{
hero.topOfBlock = true;
} else
{
hero.topOfBlock = false;
}
}
topCol
에게이 블록의 충돌 사각형과 교차 여부를 확인하려면 블록 또는하지의 상단과 충돌이 있는지 여부를 확인하는 부울입니다. 루프는 배열의 모든 블록이 문자와 교차하는지 여부를 확인합니다 (topWall
). 그렇다면 topCol
을 true로 설정합니다. 루프 후에는 topCol
이 true인지 여부를 확인합니다. 그럴 경우 hero.topOfBlock
에서 true
으로 문자가 넘어 가지 않아야 함을 의미합니다. false
인 경우 을 false
으로 설정하면 jumping
도 false 인 경우 Hero 클래스에서 fall()
메서드를 트리거합니다. 다음
마지막으로 topWall
충돌 직사각형 생성된다
topWall = new Rectangle((int)position.X, (int)position.Y - size, size, 1);
position.X
와 position.Y
는 X 및 Y 위치이다 size
은 블록의 폭과 높이이다 (둘은 사각형이기로 30이다) , 1은 1 픽셀 높이로 만듭니다.
이제 내가 말했듯이, 문제는 점프 후 캐릭터가 떠 다니는 것입니다. 시작 y 위치는 402 픽셀입니다 (첫 번째 블록의 topWall.Y
은 420입니다. 즉, 게임이로드 될 때 문자가 블록의 맨 위에 놓이는 것을 의미 함). 점프 후에는 402로 돌아 가야합니다. 한 번 점프 후 374, 373, 387, 386, ..., 374, 373으로 다시 387로 돌아갑니다. 나는이 문제를 일으키는 것이 무엇인지 전혀 모른다. 블라인드와 캐릭터의 충돌 직사각형으로 팅크하는 것과 같은 여러 가지를 시도했지만 아무것도 작동하지 않는 것 같습니다. 내가 을 (int)position.Y - size
에서 제거했을 때 (나는 문제라고 생각했었다), 문자가 블록을 통과하여 수정되지 않았다.
당신은 말할 After jumping once
점핑을위한 'position.Y - = verticalMovement;'가 있습니까? 점프 할 때 추가해서는 안되며 떨어질 때 빼는 것이 좋습니까? 또한'verticalMovement'가 초기화 될 때 어떤 가치가 있습니까? – AsheraH
아니요, Y 값이 높을수록 스프라이트가 낮아집니다. 따라서 점프를 원한다면 Y 값을 줄여야합니다. 따라서'+ ='대신에'- ='를 사용하십시오. – lolwut147258369
@AsheraH 위치 0,0은 프로그래밍에서 대부분의 경우 XNA 및 winforms, html 등의 경우 왼쪽 상단에 있습니다. – Steven