자바로 첫 게임을 만들었습니다. 게임은 독점입니다. 나는 턴 기반 구조 (플레이어 턴을 관리)를 모델링하기 위해 게임을 어떻게 디자인해야하는지 고심하고있다. 나는 인간이 제어하는 한 명의 AI 제어 선수와 한 명 또는 여러 명의 AI 통제 선수 모두가 게임을 할 수 있도록하고 싶다.회전 기반 게임 디자인 : 이벤트 중심 vs. 게임 루프
내 특정 문제는 게임 루프를 구현할지 여부를 모른다는 것입니다. 즉, 플레이어를 관리 할 수있는 루프와 모노 폴리 게임과 직접 관련된 변수를 의미합니다 (각 플레이어에게 턴에 다음 플레이어로 턴을 증가 시키거나 각 플레이어로부터 주사위를 굴린다. 나는 스크린의 프레임을 그리거나, 물리학을 업데이트하거나, 특정 시간에 AI를 업데이트하는 것과 관련이있는 "게임 루프"라는 용어의 더 낮은 수준의 의미를 언급하지는 않습니다.
- 는 이러한 게임 루프가없는 완전 이벤트 구동 프로그램을 구현, 또는
- 이 게임 루프 인 구현 :
나의 이해는 내가 필요로하는 것을 구현하려고 내 옵션 중 하나가 있다는 것입니다 백그라운드에서 장기간 실행되고 게임이 실행되는 동안 기본적으로 끝나지 않는 무언가. 이것은보다 절차적인 접근 방법이 될 것입니다.
이 문제를 처음 해결하기 시작했을 때, 게임 루프가 끝나지 않아서 실행중인 스레드를 완전히 소모했기 때문에 UI가 멈추는 문제가 발생했습니다 (매우 간단하게 만들었습니다. 루프는이를 설명합니다). 그래서 저는 게임 루프를 캡슐화하기 위해 SwingWorker
을 만들려고했습니다. UI의 정지 문제가 해결되었지만 잘못된 경로를 따라 가고 있는지 궁금해졌습니다.
일반적으로 웹에서의 대부분의 조언은 이벤트 기반의 모든 접근 방식을 선호하는 것으로 나타났습니다. 따라서 SwingWorker
을 사용하는 현재 구현은 잘못된 방향으로 나아갈 수 있습니다. 그러나이 특정 작업 (게임 루프가 없음을 의미)을 위해 완전히 이벤트 기반 시스템을 구현하는 방법을 완전히 파악할 수는 없습니다. 플레이어 회전을 관리하기 위해 어딘가에 루프가 있어야한다고 생각합니다. 여기
- 이 (내가 그들을 설명하고로)와 같은 턴 기반 게임에 적합한 게임 루프 있습니까 모노 폴리 - 특히 플레이어를 대기 서서 자신의 차례에 적합한 선수를 자극에 대한 , 한 번에 한 명의 플레이어 (그리고 차례를 구성하는 일련의 단계들의 순서를 대기).
- 플레이어 턴을 관리하기위한 순전히 이벤트 중심 시스템을 만드는 경우 각 플레이어를 반복하여 차례를 확인하고 게임이 끝날 때까지 반복을 유지하는 방법은 무엇입니까?
- 위에서 설명한 특정 문제를 해결하기 위해 게임 루프를 사용하는 경우 UI가 멈추는 것을 피하기 위해 자신의 스레드 (가능하면
SwingWorker
사용)에서 실행해야합니까? 내 상황은 자바에 따라 다르지만 자바가 아닌 상황에 대한 해답에 대해서도 관심이 있다고 생각한다.
현재 MVC 패턴을 사용하여 코드를 구성했습니다. 내 컨트롤러는 내 게임 루프 (실제 SwingWorker
스레드)가있는 곳입니다. 그것은 완전히 끝나지 않았지만 내가 "게임 루프"라고 부르는 것을 플레이어가 어떻게 처리 하는지를 설명하는 데 도움이됩니다.컨트롤러에서
SwingWorker
코드 :
swingWorker = new SwingWorker<Void, Model>() {
@Override
protected Void doInBackground() throws InterruptedException {
gameLoopRunning = true;
while (gameLoopRunning) {
//to do: use a timer instead of thread.sleep
Thread.sleep(1000);
//user turn prompt
if (model.getActivePlayer().isUserControlled()) {
boolean userRolled = false;
while(!userRolled) {
System.out.println("Roll the dice please...");
Thread.sleep(3000);
}
}
//bot turn prompt
else {
//insert code for bot rolling dice here
model.rollDice();
}
publish(model);
Thread.sleep(1000);
model.incrementPlayerTurn();
publish(model);
}
return null;
}
@Override
protected void process(List<Model> chunks) {
Model gameModel = chunks.get(chunks.size() - 1);
//hard-coded for 6 players
for (int i = 0; i < 6; i++) {
view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn());
}
view.getGamePanel().getDice().setDie1(model.getDie1());
view.getGamePanel().getDice().setDie2(model.getDie2());
}
};
swingWorker.execute();
모노 폴리은 체스와 크게 다르지 않습니다. 체스와 같이 규칙을 훨씬 쉽게 구현할 수 있기 때문에 모노 폴리은 체스와 크게 다르지 않습니다. 왜냐하면 각 이벤트가 어떤 상태에 영향을 미치므로 체스와 같은 것입니다. – arynaq
구현 방법에 관계없이 게임 플레이 CPU주기가 UI 스레드에서 수행되는 것을 원하지 않을 것입니다. – Tim
게임 상태 변화를 표현하기 위해 유한 상태 기계를 사용하는 것은 어떻습니까? 한번은 이벤트 기반의 UI 코드로 체커 게임을 개발하기 위해 원유를 사용했습니다. – SirDarius