C++ 敌人的逻辑|子弹重置

C++ 敌人的逻辑|子弹重置,c++,events,sfml,C++,Events,Sfml,首先,我想说我还是很没经验,我上星期才开始编程 我目前正在开发我的第一个游戏(和C++应用程序),我遇到了一个问题,还没有解决它,我开始放弃了。 我可以正确地繁殖敌人,但现在我希望他们每秒钟都射击一次。我使用的代码如下所示: for (int i = 0; i < 200; i++) { if (enemy_basic[i].getPositionY() >= -100 && enemy_basic[i].getPosition

首先,我想说我还是很没经验,我上星期才开始编程

我目前正在开发我的第一个游戏(和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;
            }
        }
for(int i=0;i<200;i++)
{
if(敌方基础[i].getPositionY()>=-100&&敌方基础[i].getPositionY()1)
{
敌方激光[enemyBasicLaserNumber[i].setPosition(敌方基本[i].getPositionX(),敌方基本[i].getPositionY());
enemyLaserTimer[i]。重新启动();
灌肠碱基编号[i]++;

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

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(/******/);
}
类场景管理器
{
公众:
场景管理器();
虚拟场景管理器();
//把你自己的参数
Bullet和createBullet(/**/);
私人:
//多态性的指针列表
boost::ptr_列出实体;
};
类实体
{
公众:
实体(场景管理员和smgr);
虚拟实体();
虚拟无效更新(常量浮点时间增量)=0;
私人:
const int id_;
静态整数计数=0;
受保护的:
场景管理器和smgr;
//局部尺度、旋转
变换;
//位置
矢量三维位置;
//模型、精灵表示法
炭素可提取;
};
阶级敌人:公共实体
{
公众:
敌人(场景管理员和smgr);
虚拟~敌人();
虚拟无效更新(常量浮点时间增量);
空射();
};
类项目符号:公共实体
{
公众:
Bullet(场景管理器和smgr);
虚拟~Bullet();
虚拟无效更新(常量浮点时间增量);
};
无效敌人::更新(常量浮点时间增量)
{
//每秒射击
静态浮点数延迟=1;
静态定时器;
//检查计时器是否已启动
如果(!timer.started)
timer.start();
//如果计时器已达到所需的延迟
if(timer.appeased()>shootDelay)
{
射击();
timer.restart();
}
}
无效敌人:射击
{
//通过场景管理器创建项目符号
创建项目符号(/********/);
}

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

是的,我知道有一种比现在更好的方法来构造代码,但我不知道哪些资源对学习有好处。我应该找关于OOP的书籍、教程,还是只看一个开源游戏?如果你能给我指出正确的方向,那就太好了,谢谢!