আমি সত্তা-কম্পোনেন্ট দৃষ্টান্ত যে ব্যবহারসমূহ সিস্টেম উপাদান মধ্যে যোগাযোগ করতে যেমন ব্যাখ্যা করেছেন সঙ্গে পরিকল্পিত একটি খেলা তৈরি করছি এখানে । আমি আমার বিকাশের এই পর্যায়ে পৌঁছে গেছি যে আমাকে গেমের স্টেটগুলি যুক্ত করতে হবে (যেমন বিরতি দেওয়া, খেলানো, স্তর শুরু করা, রাউন্ড শুরু, গেম ওভার ইত্যাদি) তবে আমি কীভাবে এটি আমার কাঠামোর সাথে কীভাবে করব তা নিশ্চিত নই। আমি এই কোডটির উদাহরণটি গেমের রাজ্যে দেখেছি যা প্রত্যেকেই রেফারেন্স করেছে বলে মনে হয় তবে আমি মনে করি না এটি আমার কাঠামোর সাথে খাপ খায়। মনে হচ্ছে প্রতিটি রাজ্যের নিজস্ব অঙ্কন এবং আপডেট করা পরিচালনা করছে। আমার কাঠামোর একটি সিস্টেম ম্যানেজার রয়েছে যা সিস্টেমগুলি ব্যবহার করে সমস্ত আপডেটিং পরিচালনা করে। উদাহরণস্বরূপ, এখানে আমার রেন্ডারিং সিস্টেম ক্লাস:
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());
}
}
এছাড়াও আমার গেমের সমস্ত আপডেটিং ইভেন্ট-চালিত। আমার মতো লুপ নেই যা কেবল একই সময়ে সমস্ত কিছু আপডেট করে।
আমি আমার কাঠামোটি পছন্দ করি কারণ এটি নতুন গেমঅবজেক্টগুলি যুক্ত করা সহজ করে তোলে, তবে উপাদানগুলির মধ্যে যোগাযোগ করার সময় কিছু উপাদান-ভিত্তিক ডিজাইনের মুখোমুখি সমস্যা হয় না। আমি কাজ করতে বিরতি পেতে এটি চক ঘৃণা করব। সত্তা-উপাদান ডিজাইনটি না সরিয়ে আমি কীভাবে আমার গেমটিতে গেমের রাজ্য যুক্ত করতে পারি? গেমের রাজ্যের উদাহরণটি কি আসলে আমার কাঠামোর সাথে খাপ খায় এবং আমি কেবল কিছু মিস করছি?
সম্পাদনা: আমি আমার কাঠামোটি যথেষ্ট পরিমাণে ব্যাখ্যা করতে পারি না। আমার উপাদানগুলি কেবল ডেটা। যদি আমি সি ++ এ কোডিং করতাম তবে তারা সম্ভবত স্ট্রোকস হতে পারে। এর একটি উদাহরণ এখানে:
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;
}
}
আমার উপাদানগুলি একে অপরের সাথে যোগাযোগ করে না। সিস্টেমগুলি আন্ত-উপাদান যোগাযোগ পরিচালনা করে। আমার সিস্টেমগুলি একে অপরের সাথে যোগাযোগ করে না। তাদের পৃথক কার্যকারিতা রয়েছে এবং সহজেই পৃথক রাখা যায়। মুভমেন্টসিস্টেমটি গেমের অবজেক্টগুলি সঠিকভাবে সরানোর জন্য রেন্ডারিং সিস্টেমটি কী কী রেন্ডারিং করছে তা জানতে হবে না; এটির জন্য উপাদানগুলির জন্য সঠিক মানগুলি সেট করা দরকার, যাতে যখন রেন্ডারিং সিস্টেম গেমের সামগ্রীগুলিকে রেন্ডার করে, তখন এর সঠিক তথ্য থাকে।
গেম স্টেটটি কোনও সিস্টেম হতে পারে না, কারণ উপাদানগুলির চেয়ে সিস্টেমগুলির সাথে ইন্টারঅ্যাক্ট করা দরকার। এটি ডেটা সেট করছে না; এটি নির্ধারণ করছে যে কোন ফাংশনগুলি কল করা প্রয়োজন।
একটি গেমসেটস কম্পোনেন্টটি কোনও অর্থবোধ করতে পারে না কারণ সমস্ত গেমের অবজেক্টগুলি একটি গেমের অবস্থা ভাগ করে দেয়। উপাদানগুলি হ'ল বস্তুগুলি মেক আপ করে এবং প্রতিটি পৃথক বস্তুর জন্য প্রতিটি আলাদা। উদাহরণস্বরূপ, গেমের জিনিসগুলির একই সীমা থাকতে পারে না। তাদের ওভারল্যাপিংয়ের সীমানা থাকতে পারে তবে তারা যদি একটি বাউন্ডস কম্পোনেন্ট ভাগ করে নেয় তবে তারা সত্যই একই জিনিস। আশা করি, এই ব্যাখ্যাটি আমার কাঠামোটিকে কম বিভ্রান্ত করেছে।