여기에 설명 된대로 시스템을 사용하여 구성 요소간에 통신하는 엔티티 구성 요소 패러다임으로 설계된 게임을 만들고 있습니다 . 개발 단계에서 게임 상태 (일시 중지, 재생, 레벨 시작, 라운드 시작, 게임 오버 등)를 추가해야하는 시점에 도달했지만 내 프레임 워크로 어떻게해야하는지 잘 모르겠습니다. 모든 사람들이 참조하는 게임 상태 에서이 코드 예제를 살펴 보았지만 내 프레임 워크에 맞지 않는다고 생각합니다. 각 주에서 자체 도면과 업데이트를 처리하는 것으로 보입니다. 내 프레임 워크에는 시스템을 사용하여 모든 업데이트를 처리하는 SystemManager가 있습니다. 예를 들어, 다음은 RenderingSystem 클래스입니다.
public class RenderingSystem extends GameSystem {
private GameView gameView_;
/**
* Constructor
* Creates a new RenderingSystem.
* @param gameManager The game manager. Used to get the game components.
*/
public RenderingSystem(GameManager gameManager) {
super(gameManager);
}
/**
* Method: registerGameView
* Registers gameView into the RenderingSystem.
* @param gameView The game view registered.
*/
public void registerGameView(GameView gameView) {
gameView_ = gameView;
}
/**
* Method: triggerRender
* Adds a repaint call to the event queue for the dirty rectangle.
*/
public void triggerRender() {
Rectangle dirtyRect = new Rectangle();
for (GameObject object : getRenderableObjects()) {
GraphicsComponent graphicsComponent =
object.getComponent(GraphicsComponent.class);
dirtyRect.add(graphicsComponent.getDirtyRect());
}
gameView_.repaint(dirtyRect);
}
/**
* Method: renderGameView
* Renders the game objects onto the game view.
* @param g The graphics object that draws the game objects.
*/
public void renderGameView(Graphics g) {
for (GameObject object : getRenderableObjects()) {
GraphicsComponent graphicsComponent =
object.getComponent(GraphicsComponent.class);
if (!graphicsComponent.isVisible()) continue;
GraphicsComponent.Shape shape = graphicsComponent.getShape();
BoundsComponent boundsComponent =
object.getComponent(BoundsComponent.class);
Rectangle bounds = boundsComponent.getBounds();
g.setColor(graphicsComponent.getColor());
if (shape == GraphicsComponent.Shape.RECTANGULAR) {
g.fill3DRect(bounds.x, bounds.y, bounds.width, bounds.height,
true);
} else if (shape == GraphicsComponent.Shape.CIRCULAR) {
g.fillOval(bounds.x, bounds.y, bounds.width, bounds.height);
}
}
}
/**
* Method: getRenderableObjects
* @return The renderable game objects.
*/
private HashSet<GameObject> getRenderableObjects() {
return gameManager.getGameObjectManager().getRelevantObjects(
getClass());
}
}
또한 내 게임의 모든 업데이트는 이벤트 중심입니다. 나는 단순히 모든 것을 동시에 업데이트하는 루프와 같은 루프를 가지고 있지 않습니다.
새 게임 오브젝트를 쉽게 추가 할 수 있기 때문에 프레임 워크가 마음에 들지만 구성 요소 간 통신시 일부 구성 요소 기반 디자인에서 발생하는 문제는 없습니다. 나는 일을 잠시 멈추기 위해 척하는 것을 싫어합니다. 엔터티 구성 요소 디자인을 제거하지 않고 게임에 게임 상태를 추가 할 수있는 방법이 있습니까? 게임 상태 예제가 실제로 내 프레임 워크에 맞고 뭔가 빠졌습니까?
편집 : 내 프레임 워크를 충분히 설명하지 않았을 수 있습니다. 내 구성 요소는 단지 데이터입니다. C ++로 코딩했다면 아마도 구조체 일 것입니다. 다음은 하나의 예입니다.
public class BoundsComponent implements GameComponent {
/**
* The position of the game object.
*/
private Point pos_;
/**
* The size of the game object.
*/
private Dimension size_;
/**
* Constructor
* Creates a new BoundsComponent for a game object with initial position
* initialPos and initial size initialSize. The position and size combine
* to make up the bounds.
* @param initialPos The initial position of the game object.
* @param initialSize The initial size of the game object.
*/
public BoundsComponent(Point initialPos, Dimension initialSize) {
pos_ = initialPos;
size_ = initialSize;
}
/**
* Method: getBounds
* @return The bounds of the game object.
*/
public Rectangle getBounds() {
return new Rectangle(pos_, size_);
}
/**
* Method: setPos
* Sets the position of the game object to newPos.
* @param newPos The value to which the position of the game object is
* set.
*/
public void setPos(Point newPos) {
pos_ = newPos;
}
}
구성 요소가 서로 통신하지 않습니다. 시스템은 구성 요소 간 통신을 처리합니다. 내 시스템도 서로 통신하지 않습니다. 별도의 기능이 있으며 쉽게 분리 할 수 있습니다. MovementSystem은 게임 오브젝트를 올바르게 이동시키기 위해 RenderingSystem이 무엇을 렌더링하는지 알 필요가 없습니다. RenderingSystem이 게임 오브젝트를 렌더링 할 때 정확한 데이터를 갖도록 컴포넌트에 올바른 값을 설정하기 만하면됩니다.
게임 상태는 구성 요소가 아닌 시스템과 상호 작용해야하기 때문에 시스템이 될 수 없습니다. 데이터를 설정하지 않습니다. 어떤 함수를 호출해야하는지 결정합니다.
모든 게임 오브젝트가 하나의 게임 상태를 공유하기 때문에 GameStateComponent는 의미가 없습니다. 구성 요소는 개체를 구성하는 요소이며 각 개체마다 다릅니다. 예를 들어 게임 오브젝트는 같은 범위를 가질 수 없습니다. 겹치는 범위를 가질 수 있지만 BoundsComponent를 공유하면 실제로 동일한 객체입니다. 이 설명이 프레임 워크를 덜 혼란스럽게 만들었기를 바랍니다.