나는 대학 시절에 자바 게임을 한참 시작했다. 저의 전문 직업으로 상당한 휴식을 취한 후에, 저는 그것에 착수하여 코드가 얼마나 끔찍한지를 깨닫게되었습니다. 나는 기본적으로 동일한 클래스 파일에 GUI와 게임 로직을 가진 "모 놀리 식 메인"을 가지고있었습니다. 내가하려고하는 것은 GUI를 더 작은 덩어리로 추상화하고 "구성 요소 화"하는 것입니다. 실행 된 클래스가 JFrame으로 확장되어 버튼을 클릭 할 때 패널을 추가/제거합니다. 전의. 각 패널 클래스 내에서 Java로 좋은 게임 메뉴를 구현하려면 어떻게해야합니까?
public class GameFrame extends JFrame{
private JPanel[] _panels = {new MainPanel(), new OptionsPanel(), new DifficultyPanel()};
private int _currentPanelIndex = 0;
public GameFrame(){
...
add(_panels[_currentPanelIndex]);
...
}
}
, 나는 버튼에 대한 개인
ActionListener를 있습니다. MainPanel
, 나는 싱글 GameFrame 인스턴스를 받고 있어요 및 등으로 현재 패널의 종류를 설정 : 내 수업에서 커플 링의 깊은 마음에 들지 class SinglePlayerButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
GameFrame instance = GameFrame.getInstance();
JPanel[] panels = instance.getPanels();
int currentPanelIndex = instance.getCurrentPanelIndex();
instance.remove(panels[currentPanelIndex]);
int newPanelIndex;
for(newPanelIndex = 0; newPanelIndex < panels.length; newPanelIndex++){
if(panels[newPanelIndex] instanceof DifficultyPanel){
break;
}
}
instance.add(panels[newPanelIndex]);
}
}
,하지만 난 그것으로 살 수 있습니다.
public void actionPerformed(ActionEvent e){
GameFrame.getInstance().startGame();
}
를이 내 게임은 자바 이벤트 스레드에서 실행될 수 있기 때문에, 이에 그러나, 진짜 문제는 게임에 나를 소요되는 마지막 버튼을 클릭하면, 내가 가질 수 있다는 것입니다 다른 이벤트의 처리를 금지합니다. 이전에, 내가 가진이 바쁜 동안 루프 :
...
while(waiting){
//Do nothing
}
remove(_panels[_currentPanelIndex]);
startGame();
...
...
public void actionPerformed(ActionEvent e){
waiting = false;
}
내 GameFrame 클래스를 할 수있는 가장 좋은 방법은 무엇입니까 내가 재생 버튼을 클릭 한 것을 알고? 서브 패널 중 하나에서 이벤트 또는 메시지를 보내고 시작할 것인지를 묻는 메시지를 보낼 수 있습니까? 그렇다면 게임을 이벤트 스레드에서 실행하지 못하게하려면 어떻게해야합니까? actionPerformed() 메서드에서 처리하고 새 스레드를 단순히 생성해야합니까? 나는 그것을 주 스레드에 보관하는 것을 선호한다. 감사.
오른쪽, 그리고 별도의 스레드에서 로직을 가지고 있지만 드로잉은 GUI를 실행하는 스레드에서 수행되어야합니다. while 루프에 대한 나의 접근 방식은 재생 버튼을 클릭 할 때까지 게임 세계에서 화면을 그리기를 중단하는 것이 었습니다. 당신은 이벤트 스레드가 실행을 멈추지 않는 것이 맞지만 이벤트 스레드를 _in_ 실행하면 아무 이벤트도 실행될 수 있습니다. – Wagan8r
월드가 포함 된 컨테이너가 다시 그려지지 않도록해야하는 이유를 이해할 수 없습니까? –
내가 실수 한 것 같습니다. 나는 메모리에서 위의 코드를 타이핑했고 현재 게임이 완전히 싱글 쓰레드임을 깨닫지 못했다. 이 때문에 GameFrame 클래스는 GUI와 게임 로직 및 활성 렌더링을 주도합니다. 별도의 스레드에서 실행하면 여전히 게임 플레이를 시작하는 문제가 있습니다. GUI에서 게임 시뮬레이션에 이르기까지 내가 해결할 수없는 진보입니다. 시뮬레이션을 시작하려면 어떻게합니까? – Wagan8r