Java의 마우스 이벤트에 대한 다양한 옵션을 처리하는 표준 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1241633

  •  12-09-2019
  •  | 
  •  

문제

Java에서 그리드 기반 SIM 게임을 개발하고 있으며 다음을 수행하는 표준 방법이 있는지 궁금합니다. 게임 패널 인 패널이 있으며 패널을 클릭 할 때 발생할 수있는 여러 가지가 있습니다. 예를 들어, 방을 만들 때 마우스를 끌고 왼쪽 클릭하면 다른 단계가 있습니다. 지금, 내가 한 방식은 부울을 사용하여 무엇이 건축되고 있는지, 그리고 어떤 단계에 있는지 확인하는 것입니다.

이와 같은 것을 다루는 더 나은 또는 표준적인 방법이 있습니까? 나는 빠른 Google을 가지고 있었지만 앞서 말했듯이 Stack Overflow의 사람들은 항상 더 좋고 관련성이 높고 최신 답변을 제공합니다.

나는 나 자신이 여전히 Java에 새로운 것을 생각합니다.

미리 감사드립니다.

도움이 되었습니까?

해결책

전략 패턴과 비슷한 것을 조사해 볼 수 있습니다.

기본적으로 도구 모음의 룸 버튼을 클릭하여 시작합니다. 도구 모음은 지나가고 그리드에 '룸 플레이스'액션 리스트너를 사용하도록 지시합니다. 아마도 듣고 있던 이전 액션 리스너를 제거 할 것입니다

Room Place ActionListener는 왼쪽/오른쪽 클릭, 드래그 등에 대한 모든 흥미로운 논리를 구현합니다.

방을 건설하는 데 여러 단계가있는 경우 (예 : 문, 창문을 놓고 문을 덫을 놓으십시오); 액션 리스너는 다음 단계에 제어를 전달할 책임이 있습니다 : 약간의 유한 상태 기계.

따라서 '방'버튼을 클릭하여 시작하십시오. 'Place Room'리스너가 추가됩니다. 'Place Room'이 게임 상태를 수정 한 다음 ActionListener를 'Place Wind Ad Infinitum ... 끝날 때까지.

매우 간단한 (컴파일 할 수없는) 예 :

class GridPanel extends JPanel
{
    void SetMouseListener(MouseListener newListener)
    {
        for(MouseListener ml : getMouseListeners())
            removeMouseListener(ml);
        addMouseListener(newListener);
    }
}

class ControlPanel extends JPanel
{
    GridPanel gameGrid;

    void OnRectangleButtonClicked(some stuff)
    {
        gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid));
    }
}

class PlaceRoomListener extends MouseAdapter
{
    GridPanel gameGrid;

    //constructor, etc

    void OnClick(mouse event)
    {
        gameGrid.doCoolStuff();
        gameGrid.SetMouseListener(new PlaceTrapDoorListener());
    }
}

//etc

이제는 적합하지 않은 예를 제외하고, Pyrolistical에는 요점이 있습니다. 일반적으로 게임 모델과 그래픽 인터페이스를 하나의 단일 글로벌 클래스로 결합하고 싶지 않습니다. GUI에서 모델을 분리하고 잘 정의 된 인터페이스를 통해 조작하기를 원합니다.

(또한 마우스 리스너를 제거한 다음 모든 청취자를 무작위로 제거하는 방법이 더 나은 방법이있을 것입니다 ... 나는 약간의 서두르고 있었다, 죄송합니다)

다른 팁

게임 모델/상태를 정의하고 마우스 작업과 분리하여 유지 해야하는 것 같습니다.

MVC를 사용하고 있습니까?

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