2013-07-08 35 views
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; 
      } 
     } 

現在,我知道有一些錯誤在那裏的某個地方,因爲子彈繼續得到只要有屏幕上的多個敵人重置回敵人(如只要它只有一個敵人,它就完美無缺),而且我仍然無法弄清楚需要改變什麼,或者如果我需要以完全不同的方式做到這一點。

如果有人能指引我朝着正確的方向或以某種方式幫助我,我會非常感激!

回答

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圖形引擎特別使用這種編碼方式,但也可以應用於遊戲引擎的核心邏輯。

+0

是的,我知道有更好的方式來構建我的代碼,而不是現在的方式,但我不知道哪些資源適合學習。我應該在尋找書籍,面向對象的教程,還是隻看開源遊戲?如果你能指出我正確的方向,那會很酷,謝謝! – user2558804