2009-10-28 8 views
1

많은 RTS 게임과 비슷하게 마우스가 창의 바깥 가장자리에 도달하면보기가 움직이는 게임을 만들고 싶습니다. MouseMotionListener를 사용할 때 상당한 오버 헤드가 있음을 읽었습니다.마우스 이동 최적화

게임 플레이 (JPanel) 내에 게임 플레이에는 영향을주지 않지만 마우스가 MouseAdapter.mouseEntered()/mouseExited()를 통해 내부 구성 요소를 떠날 때 등록되는 두 번째 투명 구성 요소가있을 수 있습니다. ?

boolean mouseOnScreen; 
boolean mouseWithinInnerComponent; //is (10 <= mouse.x <= screenWidth - 10) && (10 <= mouse.y <= screenHeight) 

if(mouseOnScreen && !mouseWithinInnerComponent) 
{ 
    //do something... 
} 

내가 마우스에있는 경우 감지 할 수있는 화면 주위에 테두리를 형성하기 위해 모서리에 중복 위에서 언급 한 요소 네 가지를하지 않고 교차 된 화면 경계를 확인하는 방법에 대한 손실입니다 가장자리 또는 모서리. 이 나는

boolean mouseOnScreen; 
boolean mouseWithinTopComponent; //is (0 <= mouse.y <= 10) 
boolean mouseWithinBottomComponent; //is (screenHeight - 10 <= mouse.y <= screenHeight) 
boolean mouseWithinLeftComponent; //is (0 <= mouse.x <= 10) 
boolean mouseWithinRightComponent; //is (screenWidth - 10 <= mouse.x <= screenWidth) 

if(mouseOnScreen) 
{ 
    if(!mouseWithinBottomComponent) 
    { 
     //move view up 
    } 
    if(!mouseWithinTopComponent) 
    { 
     //move view down 
    } 
    if(!mouseWithinLeftComponent) 
    { 
     //move view right 
    } 
    if(!mouseWithinRightComponent) 
    { 
     //move view left 
    } 
} 

가 정확히 얼마나 많은 오버 헤드 된 MouseMotionListener 존재 ... (게임을 실행하는 동안 각 구성 요소를 확인하는 데) 매우 비싼 상상? 탐지 방법이 게임 창의 경계를 따라 이루어질 필요가 있다면이 방법이나 비슷한 방법이 더 효과적일까요?

참고 : 가능한 전체 화면 응용 프로그램뿐만 아니라 창 모드에서도 사용됩니다.

답변

2

나는 MouseMotionListener을 사용하여 필요한 것과 동일한 것을 구현했습니다. 왜 오버 헤드가 추가 될지 생각하지 않는 이유는 모르겠다. 하나를 추가하고 각각의 메소드를 콘솔 (느린 속도)에 프린트하고 마우스를 움직이면 각각의 메소드가 꽤 멋지다는 것을 알 수있다. 사용자의 관점에서 볼 때

내 구현은 스크롤 창, 직사각형 영역, 타이머 및 MouseMotionListener의 4 가지 주요 부분으로 구성됩니다.

먼저 AutoScrollPane이라는 패널을 만들고 JScollPane까지 확장했습니다. JScrollPane이지만 스크롤바를 숨길 수 있습니다. 이 기능을 사용하면 RTS 게임에서처럼 뷰포트를지도에서 움직이는 기능을 활용할 수 있습니다.

둘째, 스크롤 영역의 경우 대각선 길이를 허용하면서 실제로 8 : n, ne, e, se, s, sw, w 및 nw (즉, 북쪽, 북동쪽 등) 대각선 스크롤링. 나는 간단하게 Rectangle으로 구현한다. 그들은 스크린이나 다른 것에 그려지지 않는다. - 클래스의 8 개의 직사각형을 적절하게 그리고 좌표 영역과 함께 인스턴스화한다. 사실 내 창을 허용한다. 크기가 조정되었으므로 필요한 경우 사각형의 크기를 조정합니다.

셋째, 나는 켜고 끌 수있는 타이머가 있습니다.이 기능을 켜면 모든 "틱"이 Runnable을 생성합니다.이 Runnable's 작업은 패널의 적절한 방향으로 일정한 거리의 뷰포트. 각각 Runnable Swing 이벤트 큐에 건네집니다.

마지막으로 MouseMotionListener입니다. 마우스 입력, 종료 및 이동 이벤트를 가로 채는 것입니다. 이벤트를 수신 할 때마다 현재 마우스 위치와 사각형 중 하나와 교차하는지 여부를 확인합니다. 어느 직사각형을 기준으로 스크롤 할 방향을 선택합니다. 마우스가 이전 이벤트의 스크롤 영역에 있었는지 여부를 추적합니다.이 정보를 바탕으로 스크롤링을 시작해야하는지, 스크롤을 멈추는 지, 아니면 계속 진행되고 있는지를 알 수 있습니다. 마우스가 패널 밖으로 나가면 내 스크롤을 멈추고 exit/enter 이벤트를 사용하고 싶었습니다. 어쨌든, 스크롤을 시작하기 위해, 청취자는 스크롤 할 방향과 거리를 저장하고 타이머가 시작하도록 지시합니다. 마우스가 스크롤 영역에서 빠져 나올 때와 같이 스크롤을 멈출 때가되면 타이머가 멈추라 고 알려줍니다.

원활한 스크롤링을 위해 적절한 타이머 세분성 및 스크롤 거리를 선택하는 데 다소 시간이 걸리지 만 꽤 잘 작동합니다. 이 개요가 도움이되기를 바랍니다.

+0

아주 좋은 알고리즘 설명 –

2

나는 마틴 파울러 (Martin Fowler)가 조숙 한 최적화가 소프트웨어 개발의 모든 악의 뿌리라고 주장했다. 왜 MouseMotionListener를 시도해보고 게임의 성능에 영향을 준다면 최적화에 대해서만 생각해보십시오.

+1

동의합니다. 또한 크 누스 (Knuth)는 다음과 같이 말했습니다. "조기 최적화는 모든 악의 근원 인 약 95 %의 시간에 작은 효율성을 잊어 버려야합니다." – SingleShot

0

당신은 아마 하나의 특정 exmaple가

어떤 프로그래밍 언어로 할 수있는 일이 잘못되었거나 잘못 수행 할 수 있었다 오버 헤드에 대해 읽을 때 모든 MouseMotionListener 아무 문제가 없습니다.

청중이하는 일에주의를 기울이는 경우 모두 괜찮습니다.

관련 문제