C++ SML 2.5 / 实体管理

问题描述

我目前在一个学校项目中,我没有任何想法去做我真正想做的事情,因为我是一个初学者。首先,我使用的是 SFML 2.5,这就是问题所在。

问题。

我必须创建一个里面有鱼的水族馆。我遵循了网上的教程,最终创建了一个水族馆,其中有一个实体正在移动和检测碰撞,这要归功于 TileMap。问题是我必须在玩家每次点击时创建一个实体。我使用工厂和抽象实体来创建和绘制实体

我在互联网上看到,我们可以创建一个具有创建和销毁管理功能的实体池。我试过这样做,但结果不在这里。有人能帮我吗。不要犹豫,让我分享代码或信息。

除了池之外,还有其他方法可以生成相同的实体吗?

我的鱼实体

class Fish : public Character
{
public:
    Fish();
    ~Fish();
    Fish* getNext() const { return state_.next; }
    void setNext(Fish* next) { state_.next = next; }


    void move();
    bool inUse() const { return framesLeft_ > 0; }

private:
    int framesLeft_;
    union
    {
        // State when it's in use.
        struct
        {
            double x,y;
            double xVel,yVel;
        } live;

    // State when it's available.
    Fish* next;
    } state_;
};

我的池实体

    class FishPool
{
public:
explicit FishPool(void) :
    m_entities(new Fish[POOL_SIZE])
    m_firstAvailable(nullptr) {
    // Assign first available entity.
    m_firstAvailable = m_entities[0];

    // Assign each entity's next pointer.
    for (int i = 0; i < POOL_SIZE - 1; ++i) {
        m_entities[i].setNext(&m_entities[i + 1]);
    }

    // Terminate end of array.
    m_entities[POOL_SIZE - 1].setNext(nullptr);
}

~FishPool(void) {
    delete[] m_entities;
}

Fish* create(void) {
    // Check if pool is full.
    //assert(m_firstAvailable != nullptr);

    // Pull out the next available entity.
    Fish* e = m_firstAvailable;
    m_firstAvailable = e->getNext();

    // Init entity if needed...
    // ...

    return e;
}

void destroy(Fish* e) {
    // Reset entity data...
    // ...

    e->setNext(m_firstAvailable);
    m_firstAvailable = e;
}

private:
static const int POOL_SIZE = 100;
Fish m_entities[POOL_SIZE];
Fish m_firstAvailable;
};

我的循环游戏

// Boucle de jeu
while (window.isopen()) {
    while (window.pollEvent(event)) {
        if (event.type == sf::Event::Closed)
            window.close();
        

        /*switch (event.type) {
        case sf::Event::MouseButtonpressed:
            // Ajout d'un point fish
            scores.AddPoint(1); 
            // Ajout d'un point algues
            scores.AddPointAlg(1);
            // La creation de poisson

            if (!tileFish.move("images/fish.png",sf::Vector2u(32,32),fish.GetX(),fish.GetY()))
                return -1;
            break;
        case sf::Event::MouseButtonReleased:
            //
            break;
        }*/
        
    }
        
        sf::Time delta_time = sf::milliseconds(100);

        instance.Update();
        elapsed_time += r.restart();
        
        // Update/Refresh frequency
        float f = fps.getFps(instance);
        
        

        if (sf::Mouse::isButtonpressed(sf::Mouse::Left))
        {
            factory.Create("fish");
        }
        else {
            // We have enough time to spawn a sprite. ( may be for several ? )
            while (elapsed_time >= delta_time) {
                // Spawn your sprite
                // ...
                /*if (sf::Mouse::isButtonpressed(sf::Mouse::Left))
                {
                    if (!tileFish.create("images/fish.png",fish.GetY()))
                        return -1;
                }*/
                if (!tileFish.move(imageFish,fish.GetY()))
                    return -1;
                fish.move();
                //dory.move();
                // Substract the time consumed
                elapsed_time -= delta_time;
            }
        }

        

        window.clear();
        window.draw(tileMap);
        window.draw(tileFish);
        map.drawText(window,scores.Getscores(),scores.GetscoresAlg(),instance.GetStartedTime(),f);
        window.display();
    }
return -1;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)