敌人的逻辑|子弹重置

时间:2013-07-08 23:01:26

标签: c++ events sfml

首先,我想说我还很缺乏经验,我上周才开始编程。

我正在开发我的第一个游戏(和C ++应用程序),我遇到了一个问题,并且没有设法解决它,我开始放弃了。

我可以正确地产生敌人,但现在我希望他们每个人每秒射击一次。我正在使用的代码如下:

for (int i = 0; i < 200; i++)
        {
            if (enemy_basic[i].getPositionY() >= -100 && enemy_basic[i].getPositionY() <= 900)
            {
                if (enemyBasicLaserNumber[i] < 200 && enemyLaserTimer[i].getElapsedTime().asSeconds() > 1) 
                {
                    enemy_laser[enemyBasicLaserNumber[i]].setPosition(enemy_basic[i].getPositionX(), enemy_basic[i].getPositionY());
                    enemyLaserTimer[i].restart();
                    enemyBasicLaserNumber[i]++;
                    cout << enemyBasicLaserNumber[i] << endl;
                }

                if (enemyBasicLaserNumber[i] >= 199) enemyBasicLaserNumber[enemyBasicNumber] = 0;
            }
        }

现在,我知道某处出现了问题,因为一旦屏幕上出现多个敌人,子弹就会不断重置给敌人(只要它只有1个敌人,它就能完美地运行),我仍然没有'我设法弄清楚需要改变什么,或者我是否需要以完全不同的方式做到这一点。

如果有人能指出我正确的方向或以某种方式帮助我,我将非常感激!

1 个答案:

答案 0 :(得分:0)

您应该以更合适的面向对象的方式构建代码。您可以创建一个包含虚函数更新的基类Entity。它还应包含实体的引用/指针父级。

class SceneManager
{
public:
    SceneManager();
    virtual ~SceneManager();

    //put your own parameters
    Bullet& createBullet(/* */);

private:
    //a list of pointers for polymorphism
    boost::ptr_list<Entity> entities_;
};

class Entity
{
public:
    Entity(SceneManager& smgr);
    virtual ~Entity();

    virtual void update(const float timedelta) = 0;
private:
    const int id_;
    static int count_ = 0;
protected:
    SceneManager& smgr_;

    //local scale, rotation
    Transform transform_;

    //position
    Vector3d position_;

    //the model,sprite representation
    char drawable_;
};

class Enemy:public Entity
{
public:
    Enemy(SceneManager& smgr);
    virtual ~Enemy();

    virtual void update(const float timedelta);
    void shoot();
};

class Bullet:public Entity
{
public:
    Bullet(SceneManager& smgr);
    virtual ~Bullet();

    virtual void update(const float timedelta);
};

void Enemy::update(const float timedelta)
{
    //shooting each second
    static float shootDelay = 1;

    static Timer timer;

    //check if timer has started
    if(!timer.started)
        timer.start();

    //if the timer has reached the desired delay
    if(timer.elapsed() > shootDelay)
    {
        shoot();
        timer.restart();
    }
}

void Enemy::shoot()
{
    //create the bullet via the scenemanager
    smgr_.createBullet(/******/);
}

此代码只是符号代码,您必须使用现有的库来实际实现该结构。这种编码方式主要用于Irrlicht和Ogre3D图形引擎,但也可以应用于游戏引擎的核心逻辑。