【问题标题】:Vector Subscript out of Range During Projectile Creation弹丸创建期间矢量下标超出范围
【发布时间】:2016-01-18 15:03:47
【问题描述】:

当我在游戏运行时尝试创建射弹时,会弹出两条 Microsoft Visual C++ 运行时库消息

Debug Assertion Failed! Program: C:\WINDOWS\SYSTEM32\MSVCP120D.dll
File: c:\program files (x86)\microsoft visual studio
12.0\vc\include\vector Line:1201 Expression: vector subscript out of range

Debug Assertion Failed!
Program: C:\SFML-2.3.2\SFML\Debug\SFML.exe
File: c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector
Line:1202
Expression: "Standard C++ Libraries Out of Range" && 0

然后是 Microsoft Visual Studio Express 2013 的消息:

SFML.exe 中 0x5B89A893 (msvcr120d.dll) 处的未处理异常: 无效参数被传递给认为无效的函数 参数致命。

当我按下空格键创建一个弹丸(绿色方块)时,就会发生这种情况。绿色方块出现在屏幕上应有的位置,然后立即弹出消息。此时使用当前代码的射弹应表现为绿色方形画笔,但会弹出此消息。这是我的源代码:

主要:

int main ( )

{
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;

//create the main window

sf::RenderWindow window(sf::VideoMode(640, 480), "SFML Demo");

sf::Event event;

sf::Vector2i source(1, 0);

//load texture

sf::Texture texturePlayer;

if (!texturePlayer.loadFromFile("images/player.png"))
    return EXIT_FAILURE;

//class object
class player Player1;
Player1.sprite.setTexture(texturePlayer);

//Projectile vector array
vector<projectile>::const_iterator iter;
vector<projectile> projectileArray;

//projectile object

class projectile projectile1;


while ( window.isOpen() )
{
    while (window.pollEvent(event))
    {
        if ( event.type == sf::Event::EventType::Closed )
            window.close();
    }
    window.clear();

    //fire missile (space bar)
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
    {
        projectile1.rect.setPosition(Player1.rect.getPosition());
        projectileArray.push_back(projectile1);
    }

    //Draw projectile
    for (iter = projectileArray.begin(); iter != projectileArray.end(); iter++)
    {
        window.draw(projectileArray[counter1].rect);
        counter1++;
    }


    //update player with rectangle collision detection
    Player1.update();  
    Player1.updateMovement();


    //window.draw(Player1.rect);
    window.draw(Player1.sprite);
    window.display();


 }

}

射弹.h

class projectile: public entity //继承自实体 { 公开:

float movementSpeed = 10;
int attackDamage = 5;

projectile();               //constructor
//void update();
//void updateMovement();
};

#endif

projectile.cpp

    projectile::projectile() {

rect.setSize(sf::Vector2f(10.0, 10.0));

rect.setFillColor(sf::Color::Green);

rect.setPosition(0, 0);

//sprite.setTextureRect(sf::IntRect(0, 0, 32, 32)); }

我该如何解决这个问题?非常感谢任何建议/帮助。提前致谢

【问题讨论】:

  • 成功了!非常感谢!
  • 我在 main 的开头初始化了计数器,但是使用该代码它现在可以工作了谢谢谢谢

标签: c++ visual-studio-2013 sfml


【解决方案1】:

在循环 Draw projectile 中,您必须使用或迭代器 for 来访问 projectileArray 中的元素,如下所示

for (iter = projectileArray.begin(); iter != projectileArray.end(); iter++)
{
    window.draw(iter->rect);
}

或在循环之前初始化counter1=0;,否则在主whilecounter1的第二次迭代中将不会指向向量projectileArray的开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多