0

ちょっとしたゲームのために(実際には実験のために)アリとコロニーを管理する必要があります。

ゲーム内のすべてのエンティティ (アリ、コロニー、食べ物など) を定義する Element クラスがあります。

他のすべてのクラスは、このクラスから派生します。

私の問題 :

すべてのエンティティを管理するクラスがあります。プレイヤーは自分が望むものを選択できます。選択したエンティティが保存されます : 選択Element* selection;したエンティティが Ant の場合、プレイヤーはそれを移動できます。しかし、selection 変数は Element ポインターであるためmove()、当然、Ant クラスにあるメソッドを呼び出すことはできません。

私がテストすると考えるもの:

true または false を返すElement メソッドを実装しisMovable()、選択範囲が移動可能な場合は、それを Ant にキャストしますか? 何が正解なのかわからない。

私の移動方法:

void Manager::movementEvent(sf::Vector2i mPosition)
{
    sf::Vector2f mousePosition = sf::Vector2f((float)mPosition.x, (float)mPosition.y);
    if(this->selection) {
        // I need to move the selected Ant
    }
}

ご協力ありがとうございました !!

編集

ここで私の実際のデザイン:

class Element {
private:
    sf::Vector2f position;
    int width, height;
public:
    Element();
    Element(sf::Vector2f position, int width, int height);
    Element(const Element & element);
    virtual ~Element();
};

class Colony: public Element {
private:
    int capacity;
    Queen *queen;

public:
    Colony();
    Colony(sf::Vector2f position, int width, int height, int capacity, Queen &queen);
    Colony(Colony const & colony);
    virtual ~Colony();

    Colony& operator=(Colony const& colony);
};

class Ant: public Element
{
private:
    sf::Vector2f destination;
    int number, age, speed;

public:
    Ant();
    Ant(sf::Vector2f position, int number, int age, int width, int height, int speed);
    Ant(const Ant & ant);
    virtual ~Ant();

    Ant& operator=(Ant const& ant);
};

class Manager {
private:
    std::vector<Element*> ants;
    std::vector<Element*> colonies;
    Element* selection;
    std::vector<Ant*> movement;
public:
    Manager();
    virtual ~Manager();

    std::vector<Element*> getAnts();
    std::vector<Element*> getColonies();

    void addAnt(Ant* ant);
    void addColony(Colony* colony);

    void removeAnt(Ant* ant);
    void removeColony(Colony* colony);

    void draw(sf::RenderWindow * window);
    void drawElement(sf::RenderWindow * window, std::vector<Element*> vector);

    void selectionEvent(sf::Vector2i mousePosition);
    bool checkSelection(sf::Vector2f mousePosition, std::vector<Element*> vector);

    void movementEvent(sf::Vector2i mousePosition);
};
4

3 に答える 3

1

これは、間違った問題を解決しているように思えます。やキャストなどのフラグを使用して動作させることはできisMovableますが、コードが混乱して頭痛の種になる可能性があります。
おそらくあなたの問題は実際には

「すべてのエンティティを管理するクラスがあります」

それらがまったく関連していない場合は、おそらくエンティティとの Is-A 関係を表現するべきではありません。種類ごとに異なる容器を用意した方がすっきりするかもしれません。ユーザーが望むアクションを「実体」とどう結びつけるかは別問題です。

于 2013-07-16T14:40:51.947 に答える