2014-10-17 3 views
1

두 개의 직사각형을 만들었으므로 그 중 하나를 사용하여 이동하고 점프 할 수 있으며 다른 하나는 장애물로 계속 Form에 나타납니다. 장애물을 장애물 (또는 벽이라면)으로 사용하려면 기본적으로 이동식 사각형이 장애물의 왼쪽 측면과 충돌 할 때 정지되도록하고 싶습니다. 충돌시 2D 사각형이 움직이지 않아야합니다.

나는 기사에서 두 개의 사각형 사이 (가 충돌을 감지하지 분명히 쉽기 때문) 충돌을 감지 할 방법 이 코드 발견 :

OutsideBottom = Rect1.Bottom < Rect2.Top 
OutsideTop = Rect1.Top > Rect2.Bottom 
OutsideLeft = Rect1.Left > Rect2.Right 
OutsideRight = Rect1.Right < Rect2.Left 
//or 
return NOT (
(Rect1.Bottom < Rect2.Top) OR 
(Rect1.Top > Rect2.Bottom) OR 
(Rect1.Left > Rect2.Right) OR 
(Rect1.Right < Rect2.Left)) 

을하지만 그것을 구현하는 방법을 모르겠어요. 나는 키보드에서 'A'를 누를 때 ('D'는 오른쪽으로, 'W'는 점프로) 실제로 true가 될 때 "button1.lft"라는 부울이 있습니다. left (Timer_Tick 이벤트에서).

편집 :

"rect1.IntersectsWith (rect2)은"충돌을 감지하기 위해 노력하고 있습니다. 그런데 오른쪽 구석이 장애물 왼쪽에 충돌하면 움직일 수있는 사각형이 오른쪽으로 움직이지 않기를 원하지만 (왼쪽으로 도약하고 계속 움직일 수 있어야 함) 나는 이것을 어떻게 사용할 것인가? 측면 (등)?

+4

'Rectangle' 구현에'Rectangle.Intersects()'메소드가 있습니까? 그렇다면'bool collided = rect1.Intersects (rect2); ' – itsme86

+0

'충돌을 감지하지 못하기 때문에 분명합니다. 더 쉽지만 빠릅니다. 나머지 값을 검사하는 것을 중지합니다. 업데이트가 발생할 때마다 매번 업데이트 조건을 한 번씩 빠르게 확인하십시오. 12. – TyCobb

답변

1

// UPDATE Rectangle로부터 상속받은 PlayableCharacter 클래스가 있다고 가정 해 보겠습니다.

public class PlayableCharacter:Rectangle { 

    //position in a cartesian space 
    private int _cartesianPositionX; 
    private int _cartesianPositionY; 

    //attributes of a rectangle 
    private int _characterWidth; 
    private int _characterHeight; 

    private bool _stopMoving=false; 


    public PlayableCharacter(int x, int y, int width, int height) 
    { 
     this._cartesianPositionX=x; 
     this._cartesianPositionY=y; 
     this._chacterWidth=width; 
     this._characterHeight=height; 
    } 

    public bool DetectCollision(PlayableCharacter pc, PlayableCharacter obstacle) 
    { 

    // this a test in your method 
     int x=10; 
     if (pc.IntersectsWith(obstacle)){ 
      Console.Writeline("The rectangles touched"); 
      _stopMoving=true; 
      ChangeMovingDirection(x); 
      StopMoving(x); 
     } 

    } 

    private void ChangeMovingDirection(int x) 
    { 
    x*=-1; 
    cartesianPositionX+=x; 
    } 


    private void StopMoving(int x) 
    { 

    x=0; 
    cartesianPositionX+=x; 
    } 

} 코드에서

문자가 오른쪽 양의 x 값에 갈 때 I`ve 상황에서, 당신을 주어는 문자는 다른 방향에 직면하게 될 것이다. 그가 왼쪽으로 움직이면 장애물과 충돌하면 다른 방향을 향하게됩니다.

StopMoving을 사용하면 예를 들어 루프에서 시간이지나면서 실행되는 스크립트를 만들더라도 문자를 움직일 수 없습니다.

저는 이것이 당신의 작업을위한 기초를 제공해야한다고 생각합니다. 문제가 있으면 작성한 솔루션에 의견을 말하십시오. 내 도달 범위에 있다면 당신을 도울 수 있도록 최선을 다할 것입니다.

+0

@ Anders23 일반적으로 객체를 이동하면 해당 위치의 픽셀 값이 수정되기 때문입니다. 코드를 사용하면 프로세스를 중지 할 수 있습니다. –

+0

오른쪽이 장애물의 왼쪽면 (및 기타 등등)과 충돌하면 움직이는 사각형이 오른쪽으로 이동하는 것을 멈추고 싶지만 (그래도 점프하고 왼쪽으로 이동할 수 있음) 코드가 어떻게 생겼을까요? – Anders23

+0

제공된 답변이 어떤 방식 으로든 도움이되었거나 실제로 찾고 있었다면 다른 사람들이 알 수 있도록 답변으로 표시하십시오! :) @ Anders23 –