0

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

我目前正在开发我的第一个游戏(和 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;
            }
        }

现在,我知道某处有问题,因为一旦屏幕上有多个敌人,子弹就会不断重置回敌人(只要它只有一个敌人就可以完美地工作),我仍然没有设法找出需要更改的内容,或者我是否需要以完全不同的方式进行更改。

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

4

1 回答 1

0

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

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 图形引擎使用,但也可以应用于游戏引擎的核心逻辑。

于 2013-07-09T00:24:42.890 回答