2016-08-29 4 views
0

간단한 게임을 만들고 있습니다. 나는 화살표 키와 불로 나의 캐릭터를 움직이게 만들었다. 나는 그림 상자 인지도에 벽을 추가했다. 나는이 같은 충돌을 감지 할 수 있었다 :충돌 감지 및 정지 동작

private void timer6_Tick(object sender, EventArgs e){ 
    foreach (PictureBox pic in brick){ 
     if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)){ 
      Console.WriteLine("Colision!"); 
      switch (rotation){ 
       case "up": 
        canup = false; 
        candown = true; 
        canleft = true; 
        canright = true; 
        break; 
       case "down": 
        canup = true; 
        candown = false; 
        canleft = true; 
        canright = true; 
        break; 
       case "left": 
        candown = true; 
        canup = true; 
        canleft = false; 
        canright = true; 
        break; 
       case "right": 
        candown = true; 
        canup = true; 
        canleft = true; 
        canright = false; 
        break; 
      } 
     } 
     else 
     { 
      Console.WriteLine("No colision?!"); 
     } 
    } 
} 

예상대로 작동하지만 곧 "Colision! echo는 괜찮습니다. 이것은 충돌이 발생할 때 캐릭터가 향하고 있던 방향으로의 움직임도 멈 춥니 다. 것은 나가이 bool 중 하나가 동일한 방향에서 다시 움직이기 위하여 나의 특성을 막는 틀린 체재 한 충돌을 나가는 때이다. 나는이 브룩들을 모두 다른 브랜치에 설정하려고했지만 콜리 전이 있더라도 5 개의 벽이 있기 때문에 다른 브랜치는 5 번에서 4 번 실행됩니다. 어떤 벽이나 벽이 없는지를 확인하는 일종의 "any"함수가 필요합니다. 한 순간에 맞았다.

+0

당신은 당신이 당신의'Timer' 내부보다는 액형이 있고 충돌을 감지 할 경우, 당신이 할 -assuming 당신의'movement' 기능에 충돌을 확인할 수 있습니다 그 운동을 허용하지 마라. – uTeisT

+2

다른 접근법을 고려하십시오 : 사용자가 * 명령 *을 입력하십시오. 그런 다음 게임 컨텍스트에서 명령을 평가하고 * 명령을 * 승인 * 또는 * 거부 *합니다. 승인되면 문자가 표시된 방향으로 이동합니다. 거부되면 아무 일도 일어나지 않습니다. 이 패턴을 사용하여 게임을 구성하면 많은 문제가 사라질 것입니다. –

답변

1

나는 당신에 받고있는 것을 100 % 확실하지 않다하지만 난이 도움이 될 생각 :

canup = true; 
candown = true; 
canleft = true; 
canright = true; 
foreach (PictureBox pic in brick) 
{ 
    if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)) 
    { 
     Console.WriteLine("Colision!"); 
     switch (rotation) 
     { 
      case "up": 
       canup = false; 
       break; 
      case "down": 
       candown = false; 
       break; 
      case "left": 
       canleft = false; 
       break; 
      case "right": 
       canright = false; 
       break; 
     } 
    } 
    else 
    { 
     Console.WriteLine("No colision?!"); 
    } 
    ... 

이것은 시작에 true로 모든 bools을 설정하고 단지 거짓으로 개별 bools을 설정합니다 루프 내부.

+2

또한 'rotate'에 문자열 대신 enum을 사용하면 도움이 될 수 있습니다. –

0

캐릭터를 멈추고 충돌을 해결할 수 있습니까? 벽돌과 캐릭터는 서로 충돌하여 충돌을 유발합니다. 다시 충돌없이 충돌 외부로 이동해야합니다.

일반적인 방법은 캐릭터의 위치를 ​​프레임으로 다시 설정하는 것입니다. 또는 더 정확하게하려면 캐릭터가 얼마나 깊숙한 곳으로 침투했는지 알아 내고 방향을 따라 다시 이동 시키십시오 (͡ ° ͜ʖ °). 그 금액에 의해 어디에서 왔는지.