কোনও সত্তা / উপাদান-ভিত্তিক সিস্টেমে গেমের রাজ্যগুলির কাঠামো কীভাবে করা যায়


11

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

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;
    }

}

আমার উপাদানগুলি একে অপরের সাথে যোগাযোগ করে না। সিস্টেমগুলি আন্ত-উপাদান যোগাযোগ পরিচালনা করে। আমার সিস্টেমগুলি একে অপরের সাথে যোগাযোগ করে না। তাদের পৃথক কার্যকারিতা রয়েছে এবং সহজেই পৃথক রাখা যায়। মুভমেন্টসিস্টেমটি গেমের অবজেক্টগুলি সঠিকভাবে সরানোর জন্য রেন্ডারিং সিস্টেমটি কী কী রেন্ডারিং করছে তা জানতে হবে না; এটির জন্য উপাদানগুলির জন্য সঠিক মানগুলি সেট করা দরকার, যাতে যখন রেন্ডারিং সিস্টেম গেমের সামগ্রীগুলিকে রেন্ডার করে, তখন এর সঠিক তথ্য থাকে।

গেম স্টেটটি কোনও সিস্টেম হতে পারে না, কারণ উপাদানগুলির চেয়ে সিস্টেমগুলির সাথে ইন্টারঅ্যাক্ট করা দরকার। এটি ডেটা সেট করছে না; এটি নির্ধারণ করছে যে কোন ফাংশনগুলি কল করা প্রয়োজন।

একটি গেমসেটস কম্পোনেন্টটি কোনও অর্থবোধ করতে পারে না কারণ সমস্ত গেমের অবজেক্টগুলি একটি গেমের অবস্থা ভাগ করে দেয়। উপাদানগুলি হ'ল বস্তুগুলি মেক আপ করে এবং প্রতিটি পৃথক বস্তুর জন্য প্রতিটি আলাদা। উদাহরণস্বরূপ, গেমের জিনিসগুলির একই সীমা থাকতে পারে না। তাদের ওভারল্যাপিংয়ের সীমানা থাকতে পারে তবে তারা যদি একটি বাউন্ডস কম্পোনেন্ট ভাগ করে নেয় তবে তারা সত্যই একই জিনিস। আশা করি, এই ব্যাখ্যাটি আমার কাঠামোটিকে কম বিভ্রান্ত করেছে।

উত্তর:


4

আমি স্বীকার করব যে আপনার পোস্ট করা লিঙ্কটি আমি পড়িনি। আপনার সম্পাদনা, এবং সরবরাহিত লিঙ্কটি পড়ার পরে, আমার অবস্থান পরিবর্তন হয়েছে। নীচে এটি প্রতিফলিত করে।


আমি জানি না যে আপনাকে গেমের অবস্থা সম্পর্কে চিরাচরিত অর্থে চিন্তা করা দরকার। উন্নয়নে আপনার পদক্ষেপ বিবেচনা করে প্রতিটি সিস্টেমের তাই নির্দিষ্ট যে তারা বস্তুত, হয় খেলা এর রাষ্ট্র ব্যবস্থাপনা।

একটি সত্তা সিস্টেমে, উপাদানগুলি কেবল ডেটা, তাই না? একটি রাষ্ট্র হয়। এর সর্বাধিক আকারে এটি কেবল একটি পতাকা। আপনি যদি নিজের রাজ্যগুলিকে উপাদানগুলিতে তৈরি করেন এবং আপনার সিস্টেমগুলিকে সেই উপাদানগুলির ডেটা গ্রাস করতে এবং সেগুলির মধ্যে অবস্থিত রাজ্যগুলির (প্রতিক্রিয়াগুলি) প্রতিক্রিয়া দেখান, তবে আপনি প্রতিটি সিস্টেমে নিজের রাজ্য পরিচালনা তৈরি করবেন।

দেখে মনে হচ্ছে ম্যানেজমেন্ট সিস্টেমগুলি যেমন অ্যাপহাব উদাহরণটি আপনার বিকাশের দৃষ্টান্তে খুব ভাল প্রয়োগ হয় না। এমন একটি সুপার-সিস্টেম তৈরি করা যা অন্য সিস্টেমগুলিকে আবদ্ধ করে তা লজিককে ডেটা থেকে পৃথক করার উদ্দেশ্যকে পরাস্ত করে।

স্পষ্টভাবে গেমটি হ্যান্ডেল না করা সম্পর্কে আমি কী বোঝাতে চাইছি এটি বুঝতে এটি আপনাকে সহায়তা করতে পারে:

http://paulgestwicki.blogspot.com/2012/03/components-and-systems-of-morgans-raid.html


আমার সম্পাদনা দেখুন। আমি যদি বিভ্রান্ত হচ্ছিলাম তবে দুঃখিত।
ইভা

নতুন আবিষ্কার এবং আপনার সম্পাদনাগুলি প্রতিফলিত করার জন্য আপডেট হয়েছে। আশা করি সত্তা সিস্টেমগুলি তৈরির আরও অভিজ্ঞতার সাথে কেউ চিমিয়ে যাবে, কারণ এটি এমন কোনও অঞ্চল নয় যা আমার অনেক অভিজ্ঞতা রয়েছে
সাইফার

গেমের অবস্থার পরিবর্তন হলে সিস্টেমগুলি অপসারণ এবং যোগ করার বিষয়ে কী? উদাহরণস্বরূপ, আপনি যখন গেমটি বিরতি দেন সম্ভবত আপনার মুভিশনসিস্টেম বা কলিজেনসিস্টেমের প্রয়োজন নেই তবে আপনি এখনও চান আপনার রেন্ডারসিস্টেমটি স্ক্রিনে স্টাফ আঁকতে পারে। সক্রিয় সিস্টেমগুলি কি কোনও গেম স্টেটের প্রতিনিধিত্ব করতে পারে?
আরজেনকিউই

0

রাজ্য এমন একটি মান যা কোনও বস্তুর জন্য প্রযোজ্য। গেমের অবস্থা, নাম অনুসারে, একটি 'গেম' অবজেক্টের অবস্থা হবে। এই গেমটি অবজেক্ট - বা সম্ভবত এটির একটি নির্দিষ্ট উপাদান - বর্তমান অবস্থার উপর নজর রাখবে এবং বর্তমান অবস্থার সুবিধার্থে প্রয়োজনীয় যা কিছু বস্তু তৈরি বা ধ্বংস করবে। যেহেতু আপনার উপাদানগুলি কেবলমাত্র ডেটা তাই এটি হ্যান্ডেল করার জন্য আপনার একটি নতুন সিস্টেমের প্রয়োজন হবে, যদিও এর সাথে সংযুক্ত উপাদানগুলির মধ্যে কেবল একটি উদাহরণ থাকতে পারে।

আপনি আপডেট কীভাবে প্রয়োগ করবেন তা পরিষ্কার না হয়ে আপনি কীভাবে বিরতি প্রয়োগ করবেন তা সম্পর্কে মন্তব্য করা শক্ত। আপডেট ইভেন্টগুলি প্রেরণকারী প্রক্রিয়াটি এটি না করার জন্য নির্বাচন করতে পারে, যদি গেমের অবজেক্ট বলে যে গেমটি বিরতি দেওয়া হয়েছে। গেমের অবজেক্ট আপডেট করার প্রক্রিয়াতে কীভাবে যোগাযোগ করে তা আপনার কাছে নিচে; সম্ভবত আপনার getRelevantObjectsকলটি আপডেটারকে গেম অবজেক্ট বা তার বিপরীতে অনুসন্ধান করার অনুমতি দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.