문제

마우스가 창의 바깥 쪽 가장자리 (많은 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...
}

위에서 언급 한 구성 요소 중 4 개가 모서리에 겹치는 4 개를 가지지 않으면 서 어떤 화면 경계가 교차되었는지 결정하는 방법에 대한 손실에 있습니다. 이것은 상당히 비싸다고 생각합니다 (게임을 실행하는 동안 각 구성 요소를 확인해야 함) ...

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와 정확히 얼마나 많은 오버 헤드가 있습니까? 게임 창의 경계를 따라 탐지가 이루어져야한다면이 방법이나 유사한 방법이 더 효율적일까요?

참고 : 이것은 창 모드와 가능한 전체 화면 응용 프로그램에서도 사용됩니다.

도움이 되었습니까?

해결책

나는 당신이 사용하는 것과 같은 것을 구현했습니다. MouseMotionListener. 왜 오버 헤드를 추가 할 것이라고 생각하는지 잘 모르겠습니다. 만약 당신이 하나를 추가하고 각 방법을 단순히 콘솔에 인쇄하도록 (느리게) 마우스를 움직이고 마우스를 움직이면 꽤 딱딱합니다. 사용자의 관점에서.

내 구현은 스크롤 창, 직사각형 영역, 타이머 및 MouseMotionListener.

먼저, 나는 패널을 만들었습니다 AutoScrollPane, 그것은 확장됩니다 JScollPane. 비록 그것이 a JScrollPane, 스크롤 바를 숨길 수 있습니다. 이를 통해지도 게임에서 또는 RTS 게임에서와 같이 뷰포트를 이동하기위한 기능을 활용할 수 있습니다.

둘째, 스크롤 영역의 경우 실제로 8 : N, NE, E, SE, S, S, S, W 및 NW (예 : "North", North-East "등을 가지고 있으며 대각선은 대각선 스크롤을 허용합니다. 간단히 구현하십시오 Rectangle에스. 그들은 화면이나 다른 것들에 그려지지 않습니다 - 나는 클래스 크기의 8 개의 직사각형을 적절하게 그리고 창의 영역과 일치하는 좌표로 인스턴스를 인스턴스화합니다. 실제로 창을 크기로 조정할 수 있으므로 필요한 경우 직사각형을 조정합니다.

셋째, 켜고 끄질 수있는 타이머가 있습니다. 켜지면 모든 "진드기"가 Runnable. 이것 Runnable's 작업은 패널의 뷰포트를 특정 방향으로 특정 거리로 스크롤하는 것입니다. 각 Runnable 스윙 이벤트 큐에 건네집니다.

마지막으로, 나는 a MouseMotionListener. 그것은 마우스를 가로 채고 나가고 이벤트를 이동하는 것입니다. 이벤트를받을 때마다 현재 마우스 위치와 사각형 중 하나를 교차하는지 확인합니다. 어떤 사각형을 기반으로, 스크롤 방향을 선택합니다. 마우스가 이전 이벤트의 스크롤 영역에 있는지 여부를 추적합니다. 이 정보를 바탕으로 스크롤을 시작하거나 스크롤을 중지하거나 무슨 일이 일어나고 있는지 여부를 알고 있습니다. 마우스가 창 밖으로 나가면 스크롤이 중지되기를 원했습니다. 따라서 출구/입력 이벤트가 사용됩니다. 어쨌든, 스크롤을 시작하기 위해, 리스너는 스크롤의 방향과 거리를 절약하고 타이머를 시작하도록 지시합니다. 스크롤을 중지 할 때 (예 : 마우스가 스크롤 영역을 종료 할 때와 같이) 타이머가 중지하도록 지시합니다.

부드러운 스크롤을 위해 올바른 타이머 세분화와 스크롤 거리를 선택하는 데 시간이 걸렸지 만 꽤 잘 작동합니다. 이 개요가 도움을 제공하기를 바랍니다.

다른 팁

조기 최적화가 소프트웨어 개발의 모든 악의 근본이라고 말한 것은 Martin Fowler라고 생각합니다. MouseMotionListener를 시도해보십시오. 게임의 성능에 영향을 미친다는 것을 알면 최적화하는 것에 대해서만 생각해보십시오.

오버 헤드에 대해 읽을 때 MouseMotionListener에는 아무런 문제가 없습니다. 아마도 하나의 특정 Exmaple 일 것입니다.

모든 프로그래밍 언어로 할 수있는 일은 나쁜 일이든 잘못 될 수 있습니다.

청취자에게하는 일에주의를 기울이면 모두 괜찮을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top