简体   繁体   English

如何在C ++中使指针向量的大小?

[英]How do I make the size of a vector of pointers in c++?

I am trying to make a vector of Enemy pointers. 我正在尝试使敌人指针成为矢量。 Each pointer should generate and draw an enemy. 每个指针都应生成并绘制一个敌人。 I want to increase the number of enemies that will appear on screen using input. 我想增加使用输入会出现在屏幕上的敌人数量。 I want to start with five enemies, and increase by one enemy each time the 'S' key is pressed. 我想从五个敌人开始,每按一次“ S”键增加一个敌人。 I am having a problem where I can not allocate the number of enemies that I want. 我有一个问题,我无法分配我想要的敌人数量。 All other classes work as intended. 所有其他类均按预期工作。 Here is the code: 这是代码:

GameSample.h 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 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();
}

Since m_Enemy is a vector of pointers ( std::vector<GameObject*> ), you should do m_Enemy.push_back(nullptr); 由于m_Enemy是指针的向量( std::vector<GameObject*> ),因此您应该执行m_Enemy.push_back(nullptr); in the constructor. 在构造函数中。 In the Update function, increment NumEnemies does not add another element to m_Enemy . Update函数中,递增NumEnemies不会向m_Enemy添加另一个元素。 You need to push another element to m_Enemy, or m_Enemy.push_back(new GameObject(...)); 您需要将另一个元素推送到m_Enemy或m_Enemy.push_back(new GameObject(...)); after the line NumEnemies++; NumEnemies++;NumEnemies++; .

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM