2011-01-03 4 views
2

나는 대학 시절에 자바 게임을 한참 시작했다. 저의 전문 직업으로 상당한 휴식을 취한 후에, 저는 그것에 착수하여 코드가 얼마나 끔찍한지를 깨닫게되었습니다. 나는 기본적으로 동일한 클래스 파일에 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() 메서드에서 처리하고 새 스레드를 단순히 생성해야합니까? 나는 그것을 주 스레드에 보관하는 것을 선호한다. 감사.

답변

0

사용자가 단추를 클릭 할 때 자신의 실행 스레드에서 게임 논리를 실행해야합니다. 나는 당신의 이전 접근 방식을 while (wait)으로 이해하지 못한다. 게임 로직이 짝수 스레드가 startGame을 호출 할 때 실행을 멈추지 않기 때문에 짝수 스레드가 업데이트를하지 못하게하는 시간 소모적 인 계산을 수행했다면 문제가 여전히 발생한다.).

편집 :

그것은 당신이 GUI 업데이트 및 게임 로직이 실행 별도의 스레드에서 일어나고 있음을 붙여 넣은 코드에서 명확하지 않습니다 - 당신은 당신의 코드에서 그것을 설명 할 수 있습니다.

+0

오른쪽, 그리고 별도의 스레드에서 로직을 가지고 있지만 드로잉은 GUI를 실행하는 스레드에서 수행되어야합니다. while 루프에 대한 나의 접근 방식은 재생 버튼을 클릭 할 때까지 게임 세계에서 화면을 그리기를 중단하는 것이 었습니다. 당신은 이벤트 스레드가 실행을 멈추지 않는 것이 맞지만 이벤트 스레드를 _in_ 실행하면 아무 이벤트도 실행될 수 있습니다. – Wagan8r

+0

월드가 포함 된 컨테이너가 다시 그려지지 않도록해야하는 이유를 이해할 수 없습니까? –

+0

내가 실수 한 것 같습니다. 나는 메모리에서 위의 코드를 타이핑했고 현재 게임이 완전히 싱글 쓰레드임을 깨닫지 못했다. 이 때문에 GameFrame 클래스는 GUI와 게임 로직 및 활성 렌더링을 주도합니다. 별도의 스레드에서 실행하면 여전히 게임 플레이를 시작하는 문제가 있습니다. GUI에서 게임 시뮬레이션에 이르기까지 내가 해결할 수없는 진보입니다. 시뮬레이션을 시작하려면 어떻게합니까? – Wagan8r

1

Slick 2D (많은 멋진 자료가 담긴 가벼운 OpenGL 2D 게임 개발 프레임 워크) 또는 Nifty-GUI으로 이동하십시오.

Slick도 몇 가지 예제와 튜토리얼을 가지고 있으며 배우기 쉽습니다. 예를 들어 StateBasedGame은 게임 메뉴 (게임 메뉴, 설정 메뉴, 게임 내 옵션, 게임 중 멈춤/이력서 등)

관련 문제