2017-11-09 6 views
0

私は敵のポインターのベクトルを作ろうとしています。各ポインタは、敵を生成して描画する必要があります。私は入力を使用して画面に表示される敵の数を増やしたいと思います。私は5人の敵から始め、「S」キーが押されるたびに1人の敵によって増加したい。私は私が望む敵の数を割り当てることができない問題を抱えています。他のすべてのクラスは意図どおりに動作します。ここでは、コードされていますm_Enemyはポインタのベクトル(std::vector<GameObject*>)であるのでC++でポインターのベクトルのサイズを作成するにはどうすればよいですか?

GameSample.h

#ifndef __GameSample_H__ 
#define __GameSample_H__ 

#include <vector> 

//#pragma warning(disable : 4200) 

class ShaderProgram; 
class Mesh; 
class GameObject; 
class Player; 
const int StartEnemies = 5; 
class GameSample : public GameCore 
{ 
    //int NumEnemies; 
protected: 


    ShaderProgram* m_pShader; 
    Mesh* m_PlayerMesh; 
    Mesh* m_EnemyMesh; 
    Mesh* m_TargetMesh; 
    GameObject* m_Player; 
    //GameObject* m_Enemy[StartEnemies]; 
    GameObject* m_Target; 
    std::vector<GameObject*> m_Enemy; 

    int NumEnemies; 

public: 
    GameSample(Framework* pFramework); 
    virtual ~GameSample(); 

    virtual void OnSurfaceChanged(int width, int height); 
    virtual void LoadContent(); 

    virtual void Update(float deltatime); 
    virtual void Draw(); 

    virtual void OnEvent(Events& event); 
}; 

#endif //__GameSample_H__ 

GameSample.cpp

#include "GamePCH.h" 

GameSample::GameSample(Framework* pFramework) 
: GameCore(pFramework) 
{ 
    m_pShader = 0; 
    m_PlayerMesh = 0; 
    m_EnemyMesh = 0; 
    m_TargetMesh = 0; 
    m_Player = 0; 
    m_Target = 0; 
    NumEnemies = StartEnemies; 

    for (int i = 0; i < NumEnemies; i++) 
    { 
     m_Enemy.push_back(i); //Error "'void std::vector<GameObject*,std::allocator<_Ty>>::push_back(_Ty &&)':cannot convert argument 1 from 'int' to 'GameObject*const &'" 
     m_Enemy[i] = 0; 
    } 


    srand(time_t(NULL)); 
} 

GameSample::~GameSample() 
{  
    // Release the VBO. 
    //glDeleteBuffers(1, &m_VBO); 

    delete m_pShader; 
    delete m_PlayerMesh; 
    delete m_EnemyMesh; 
    delete m_TargetMesh; 
    delete m_Player; 
    delete m_Target; 

    for (int i = 0; i < NumEnemies; i++) 
    { 
     delete m_Enemy[i]; 
    } 
} 

void GameSample::OnSurfaceChanged(int width, int height) 
{ 
    // Set OpenGL to draw to the entire window. 
    glViewport(0, 0, width, height); 
} 

void GameSample::LoadContent() 
{ 
    // Turn on depth buffer testing. 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    // Turn on alpha blending. 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    // Create our shaders. 
    m_pShader = new ShaderProgram("Data/Shaders/color.vert", "Data/Shaders/color.frag"); 

    m_PlayerMesh = new Mesh(); 
    m_PlayerMesh->SetShader(m_pShader); 
    m_PlayerMesh->GeneratePlayer(); 

    m_EnemyMesh = new Mesh(); 
    m_EnemyMesh->SetShader(m_pShader); 
    m_EnemyMesh->GenerateEnemy(); 

    m_TargetMesh = new Mesh(); 
    m_TargetMesh->SetShader(m_pShader); 
    m_TargetMesh->GenerateTarget(); 

    m_Player = new Player(this, m_PlayerMesh); 

    for (int i = 0; i < NumEnemies; i++) 
    { 
     m_Enemy[i] = new Enemy(this, m_EnemyMesh); 
    } 

    m_Target = new Target(this, m_TargetMesh); 

    // Check for errors. 
    CheckForGLErrors(); 
} 

void GameSample::Update(float deltatime) 
{ 
    if(m_pFramework->IsKeyDown('1')) 
    { 
     m_pFramework->SetWindowSize(600, 600); 
    } 

    m_Player->Update(deltatime); 

    if (m_pFramework->IsKeyDown('S')) 
    { 
     NumEnemies++; 
     for (int i = 0; i < NumEnemies; i++) 
     { 
      m_Enemy[i]->Update(deltatime); 
     } 
    } 
} 

void GameSample::Draw() 
{ 
    // Setup the values we will clear to, then actually clear the color and depth buffers. 
    glClearColor(0.0f, 0.0f, 0.4f, 0.0f); // (Red, Green, Blue, Alpha) - Dark blue 
    glClearDepth(1); // 1 is maximum depth 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    m_Player->Draw(); 
    for (int i = 0; i < NumEnemies; i++) 
    { 
     m_Enemy[i]->Draw(); 
    } 
    m_Target->Draw(); 

    // Check for errors. 
    CheckForGLErrors(); 
} 
+4

'm_Enemy.push_back(i);'は整数をプッシュバックしようとします。あなたは新しい「敵」を押し戻したい。 'm_Enemy.push_back(new Enemy()); 'のようなものです。 [強く 'std :: unique_ptr'のベクトルの使用を検討してください。](http://en.cppreference.com/w/cpp/memory/unique_ptr)メモリ管理をかなり簡単にします。 – user4581301

+2

'#define __GameSample_H__'この識別子は実装に予約されています。これを定義することにより、プログラムの動作は未定義です。 – user2079303

+0

ありがとうございます。それは働いたようだ。私はここからそれを理解できるはずです。 –

答えて

0

は、あなたは、コンストラクタでm_Enemy.push_back(nullptr);を行う必要があります。 Update関数では、インクリメントNumEnemiesは、m_Enemyに別の要素を追加しません。他の要素をm_Enemyにプッシュするか、の後にm_Enemy.push_back(new GameObject(...));をプッシュする必要があります。

関連する問題