Tôi đang tạo một trò chơi được thiết kế với mô hình thành phần thực thể sử dụng các hệ thống để giao tiếp giữa các thành phần như được giải thích ở đây . Tôi đã đạt đến điểm trong sự phát triển của mình rằng tôi cần thêm các trạng thái trò chơi (như tạm dừng, chơi, bắt đầu cấp độ, bắt đầu vòng, kết thúc trò chơi, v.v.), nhưng tôi không chắc làm thế nào để làm điều đó với khuôn khổ của mình. Tôi đã xem ví dụ mã này trên các trạng thái trò chơi mà mọi người dường như tham chiếu, nhưng tôi không nghĩ rằng nó phù hợp với khuôn khổ của tôi. Dường như mỗi bang xử lý bản vẽ và cập nhật riêng của mình. Khung công tác của tôi có SystemManager xử lý tất cả các cập nhật bằng hệ thống. Ví dụ: đây là lớp RenderingSystem của tôi:
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());
}
}
Ngoài ra tất cả các cập nhật trong trò chơi của tôi là theo sự kiện. Tôi không có một vòng lặp như của họ mà chỉ đơn giản là cập nhật mọi thứ cùng một lúc.
Tôi thích khung công tác của mình vì nó giúp dễ dàng thêm GameObject mới, nhưng không gặp vấn đề gì mà một số thiết kế dựa trên thành phần gặp phải khi giao tiếp giữa các thành phần. Tôi ghét phải tặc lưỡi chỉ để tạm dừng làm việc. Có cách nào để tôi có thể thêm trạng thái trò chơi vào trò chơi của mình mà không cần xóa thiết kế thành phần thực thể không? Ví dụ về trạng thái trò chơi có thực sự phù hợp với khuôn khổ của tôi không và tôi chỉ thiếu một cái gì đó?
EDIT: Tôi có thể đã không giải thích khuôn khổ của tôi đủ tốt. Các thành phần của tôi chỉ là dữ liệu. Nếu tôi viết mã bằng C ++, có lẽ chúng sẽ là cấu trúc. Đây là một ví dụ về một:
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;
}
}
Các thành phần của tôi không giao tiếp với nhau. Hệ thống xử lý giao tiếp liên thành phần. Hệ thống của tôi cũng không liên lạc với nhau. Chúng có chức năng riêng biệt và có thể dễ dàng được giữ riêng biệt. MovementSystem không cần biết RenderingSystem đang hiển thị gì để di chuyển các đối tượng trò chơi một cách chính xác; nó chỉ cần đặt đúng giá trị trên các thành phần, để khi RenderingSystem kết xuất các đối tượng trò chơi, nó có dữ liệu chính xác.
Trạng thái trò chơi không thể là một hệ thống, bởi vì nó cần phải tương tác với các hệ thống hơn là các thành phần. Đó không phải là thiết lập dữ liệu; nó xác định chức năng nào cần được gọi.
Một GameStateComponent sẽ không có ý nghĩa vì tất cả các đối tượng trò chơi đều có chung một trạng thái trò chơi. Các thành phần là những gì tạo nên các đối tượng và mỗi một khác nhau cho mỗi đối tượng khác nhau. Ví dụ, các đối tượng trò chơi không thể có cùng giới hạn. Chúng có thể có giới hạn chồng chéo, nhưng nếu chúng có chung BoundComponent, chúng thực sự là cùng một đối tượng. Hy vọng rằng, lời giải thích này làm cho khuôn khổ của tôi bớt khó hiểu.