2009-07-17 4 views
6

저는 자바로 간단한 게임을 프로그래밍하고 있습니다 만, 나는 그것을 깔끔하고 멋진 디자인으로 해킹하려고하지 않고 노력하고 있습니다.OO 게임 디자인 질문

나는 클릭 및 키 누르기를받는 GamePanel과 모든 엔터티를 포함하고 업데이트를 담당하는 Model 두 클래스가 있습니다. 모델은 사용자의 마우스 위치를 알아야하지만 '올바른'방법으로 결정할 수는 없습니다.

Model 모든 Entity는 내 GamePanel에 대한 참조를 유지하거나 마지막으로 알려진 마우스 위치를 캐시 정기적으로 GamePanel에서 업데이트를 받아야합니다. 모델을 만들 때 첫 번째 옵션을 사용하면 GamePanel에 대한 참조를 제공해야하며 두 번째 옵션을 사용하면 마지막 마우스 위치가 World.update() 메소드의 매개 변수로 전송됩니다.

이러한 솔루션 중 어느 것도 내가 좋아하지 않은 것처럼 보이기 때문에 내가 놓친 올바른 방법이 있는지 궁금합니다.

감사합니다. Ben.

+0

좋은 질문입니다. +1. –

+0

그래서 마우스 위치가 가끔 Observers 나 Event Listeners를 사용해야하는 경우 대부분의 업데이트에서 마우스 위치가 필요하면 모델을 폴링 할 수 있도록 패널에 대한 참조를 제공한다는 의견이 일치한다고 생각하십니까? –

답변

3

제 의견으로는 클래스가 상호 작용하는 방식에 달려 있습니다. Model 클래스의 엔티티를 트리거하는 마우스 위치가 변경 되었습니까? 또는 Model 클래스가 GamePanel과 독립적이며 마우스 위치의 현재 값에서만 작동합니까?

나중에 그리고 그 경우 jeff가 나에게 말한 것에 동의합니다. GamePanel의 핸들을 만들 때 GamePanel의 핸들을 Model 클래스에 전달하고 필요할 때마다 모든 엔터티가 핸들을 사용하여 마우스 위치에 액세스하도록합니다. 그렇게하면 업데이트 된 마우스 위치가 항상 사용됩니다.

전의 경우 마우스 위치 값이 변경되면 Observers를 사용하여 Model 클래스에 알리는 것이 좋습니다. 그런 다음 Model 클래스는 동일한 디자인을 사용할 수 있습니다. 즉, Model 클래스가 GamePanel 클래스에서 항상 핸들을 갖도록하고 GamePanel에서 현재 값에 액세스 할 수 있습니다.

귀하의 질문에 대한 답변을 정리하면 GamePanel이 마우스 위치 값을 보유하고 GamePanel 인스턴스를 사용하여 다른 클래스가 해당 정보에 액세스 할 수있게하는 것이 논리적이고 OO 개념을 준수한다고 생각합니다.

감사합니다. 로한.

2

항상 현재 좌표를 GamePanel의 공개 속성으로 설정하여 엔터티/모델이 여기에서 간단하게 액세스 할 수 있습니다. 현재 마우스 위치를 폴링하려면

1

, 당신은 당신이 원하는 시간에 이벤트 발송 쓰레드에서이 코드 snipplet를 실행할 수 있습니다 :

Point pt = MouseInfo.getPointerInfo().getLocation(); 
Point cpt = GamePanel.getLocationOnScreen(); 
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y); 

그리고 확인해 마우스의 상대적 위치가 포함되어 있습니다.

키보드/마우스/입력에 상관없이 JInput을 볼 수도 있습니다.

+0

MouseInfo since 1.5 – akarnokd

3

일반적인 해결책은 이벤트를 발생시키는 것입니다. 이 경우 GamePanel은 새 마우스 위치 모델에 관심이있는 (이벤트에 가입 된) 객체 (Entity)를 알리는 이벤트를 시작합니다.

이렇게하면 GamePanel은 알릴 엔티티를 명시 적으로 알 필요가 없으며 엔티티는 GamePanel 인스턴스를 유지할 필요가 없습니다.

내 충고 : 이벤트 수신기에서 읽습니다. (Java.util)

+0

Java.util의 의미는 무엇입니까? 마우스 이벤트 및 리스너는 java.awt.event 패키지에 있습니다. – akarnokd

+1

둘 다 맞습니다. java.awt.event.MouseListener는 java.util.EventListener (http://java.sun.com/javase/6/docs/api/java/util/EventListener.html)를 상속합니다. – Nelson

+0

나는 OP가 awt 나 swing을 사용하지 않는다고 상상했기 때문에 util을 지적했다. – NomeN

1

모델은 항상 마우스의 위치를 ​​알아야합니까? IE : 업데이트 할 때마다 또는 특정 시점에서만 마우스 위치가 필요합니까?

언제든지 업데이트 할 때마다 필요한 경우 문서화 된 솔루션이나 여기에있는 모든 솔루션은 단색이어야합니다.

특정 지점에서만 필요하면 꼭 잡으십시오. (IE : 게임이 마우스 클릭에 응답하면 클릭시 무언가를하십시오.) 의미 이벤트 리스너에 대해 읽어보십시오.

행운을 빈다. 희망이 도움이됩니다.

+0

설문 조사 방식을 사용할 수있는 경우가 하나 있습니다. 마우스를 드래그 (예 : 촬영 및 회전) 할 때 마우스 드래그 이벤트와 싸우고 싶지 않은 경우, – akarnokd