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的书籍、教程,还是只看一个开源游戏?如果你能给我指出正确的方向,那就太好了,谢谢!