2016-12-08 4 views
1

현재 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++; 
} 

코드는 명백해 나는 생각한다. 기본적으로 문자가 더 이상 위로 이동하지 않으면 fallingtrue으로 설정되어 문자가 블록 맨 위에 있지 않은 한 fall() 메서드를 트리거합니다.

마지막으로 문자의 충돌 사각형이 문자의 새 위치로 업데이트됩니다.

colRect = new Rectangle((int)position.X, (int)position.Y, 64, 48); 
position.Xposition.Y 캐릭터의 X 및 Y 위치이다

6448 스프라이트의 폭과 높이이다.

가 충돌 사각형 나는 다음과 같은 코드

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.Xposition.Y는 X 및 Y 위치이다 size은 블록의 폭과 높이이다 (둘은 사각형이기로 30이다) , 1은 1 픽셀 높이로 만듭니다.

이제 내가 말했듯이, 문제는 점프 후 캐릭터가 떠 다니는 것입니다. 시작 y 위치는 402 픽셀입니다 (첫 번째 블록의 topWall.Y은 420입니다. 즉, 게임이로드 될 때 문자가 블록의 맨 위에 놓이는 것을 의미 함). 점프 후에는 402로 돌아 가야합니다. 한 번 점프 후 374, 373, 387, 386, ..., 374, 373으로 다시 387로 돌아갑니다. 나는이 문제를 일으키는 것이 무엇인지 전혀 모른다. 블라인드와 캐릭터의 충돌 직사각형으로 팅크하는 것과 같은 여러 가지를 시도했지만 아무것도 작동하지 않는 것 같습니다. 내가 을 (int)position.Y - size에서 제거했을 때 (나는 문제라고 생각했었다), 문자가 블록을 통과하여 수정되지 않았다.

그냥 내가 무슨 뜻인지 좀 더 명확한, 여기이 사진은 만들려면 :

When the game loads

당신은 말할 After jumping once

+0

점핑을위한 'position.Y - = verticalMovement;'가 있습니까? 점프 할 때 추가해서는 안되며 떨어질 때 빼는 것이 좋습니까? 또한'verticalMovement'가 초기화 될 때 어떤 가치가 있습니까? – AsheraH

+0

아니요, Y 값이 높을수록 스프라이트가 낮아집니다. 따라서 점프를 원한다면 Y 값을 줄여야합니다. 따라서'+ ='대신에'- ='를 사용하십시오. – lolwut147258369

+0

@AsheraH 위치 0,0은 프로그래밍에서 대부분의 경우 XNA 및 winforms, html 등의 경우 왼쪽 상단에 있습니다. – Steven

답변

0

"그것은 검사 루프가 topCol 사실인지 후 그렇지 않은 경우 hero.topOfBlock이 true로 표시됩니다. 즉 문자가 떨어지지 않아야 함을 의미합니다. "

위의 if-then 조건문에 해당합니다. 캐릭터의 Y 좌표를 타일의 꼭대기에 설정하는 것에 대해서는 언급하지 않았습니다. 그게 문제를 일으킬 지 모르겠다. checkCollision을 호출 할 때마다 달라 지지만 문제의 일부일 것이다.