2016-11-22 4 views
0

나는 여기에 비슷한 대답을 찾을 수 없지만, 내 자신의 문제에 너무 구체적이라면 사과드립니다.컨트롤러에 모델에 대한 참조가없는 경우 MVC 스타일 게임용 스윙 GUI를 만들 수 있습니까?

Java에서 명령 줄 인터페이스와 GUI (명령 줄 플래그를 사용하여 활성화 됨)를 모두 사용하는 간단한 게임을 작성합니다. 게임을 작성하는 방법은 게임 로직 (모델)이 입력 (컨트롤러) 및 출력 (뷰)에 대한 참조를 갖고 있지만 입력 또는 출력 모두 모델에 대한 참조를 가지고 있지 않다는 것입니다 (이것이 요구 사항 임). 게임의 흐름을 따라서 유사한 응용 프로그램 모델의 루프에 의해 제어됩니다 이제

while (!gameFinished) { 
    InputType in = input.getUserInput(); //1 
    performAction(in); 
} 

나는 이것에 대한 스윙 GUI (나는 경험이없는 뭔가를) 구축을 위해 노력하고 있음을, 나는에 어려움을 겪고 있어요 이벤트 청취와 함께 어떻게 작동하는지보십시오. 단추를 누를 때 (새로운 게임, 게임 저장, 게임 종료 등), InputType이 모델에 전송되어 (기본적으로 주석 처리 된 행과 동일하게 처리 됨) 이상적으로 처리됩니다. 그러나 모델에 대한 참조를 보유하지 않으면 InputType을 '보낼'수 없습니다. 필자는 '듣기'보다는 '요구하는'모델을 사용하는 GUI를 구현하고자합니다.

이것이 가능합니까? 그렇다면 누군가가이 문제를 해결할 수있는 유용한 자원을 제공 할 수 있습니까? 그렇지 않은 경우 설명이나 잠재적 인 대체 솔루션 제안을 보내 주시면 감사하겠습니다.

+1

* 게임이 기록 방식은 게임 로직 (모델)는 입력 (컨트롤러) 및 출력 (표시)에 대한 참조를 보유하고 있지만, 입력 또는 출력이 모두 기준을 가지고있다 (이것은 요구 사항이었습니다.) * 이것은 MVC 패턴에서 거꾸로입니다. MVC 패턴의 배경은 모델이 뷰와 컨트롤러를 모르는 것이므로 동일한 모델에서 다른 뷰를 만들 수 있습니다. –

+0

[예] (http://stackoverflow.com/a/3072979/230513). – trashgod

답변

1

나는 당신의 흐름이 옳은지 틀린 지 들어 가지 않을 것입니다.

  • 입력란에 이벤트 대기열을 만듭니다. 리스너는 큐에 이벤트를 추가 할 수 있습니다. 그런 다음 모델은 입력에 큐에 처리되지 않은 이벤트가 있는지 여부를 묻고 발생한 이벤트에 따라 작업을 수행 할 수 있습니다. model이 view 인터페이스에 대한 참조를 보유하면 performAction 메소드에서 적절한 뷰 메소드를 호출합니다.

의사 코드 :

  • class Controller{ 
        Queue<UIEvent> events; 
    
        void setupUI(){ 
         button.addEventListener(new EventListener(){ 
          Model.this.events.add(new TappedButtonEvent()); 
         }); 
        } 
    
        UIEvent dequeueEvent(){ 
         if(events.size() > 0){ 
          return events.pop() 
         } 
         return null; 
        } 
    
        } 
    
        class Model{ 
    
        public void loop(){ 
         while (!gameFinished) { 
          UIEvent in = input.dequeueEvent(); 
          if(in != null){ 
            performAction(in); 
          } 
         } 
        } 
        } 
    
    보기를 처리 할 수 ​​있도록, 뭔가가 모델에 표시되는 방법을 캡슐화하지 마십시오.

    interface View{ 
    void displayExitMessage() 
    } 
    
    class CommandLineView implements View{ 
    
    void displayExitMessage(){ 
        this.commandLine.append("Are you sure you want to exit(Y/N)?"); 
    } 
    } 
    
    class CommandLineView implements View{ 
    
    void displayExitMessage(){ 
        this.window.showDialog("Are you sure you want to exit?", Button.YES, Button.NO); 
    } 
    } 
    
+0

고마워, 좋은 해결책 같아. :) –

관련 문제