射弹创建期间矢量下标超出范围
Vector Subscript out of Range During Projectile Creation
当我尝试在我的游戏 运行
中创建射弹时,会弹出两条 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 的消息:
Unhandled exception at 0x5B89A893 (msvcr120d.dll) in SFML.exe: An
invalid parameter was passed to a function that considers invalid
parameters fatal.
当我按下 space 栏来创建弹丸(绿色方块)时,就会发生这种情况。绿色方块出现在屏幕上它应该出现的位置,然后消息立即弹出。此时使用当前代码的射弹应该表现为绿色方形画笔,但会弹出此消息。这是我的源代码:
主要内容:
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();
}
}
projectile.h
class projectile: public entity //继承自entity
{
public:
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)); }
我该如何解决这个问题?任何 advice/help 非常感谢。提前致谢
在循环中 Draw projectile
您必须像这样使用或迭代器访问 projectileArray
中的元素
for (iter = projectileArray.begin(); iter != projectileArray.end(); iter++)
{
window.draw(iter->rect);
}
或在循环之前初始化 counter1=0;
否则在 main while
的第二次迭代中 counter1
将不会指向向量 projectileArray
.
的开始
当我尝试在我的游戏 运行
中创建射弹时,会弹出两条 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 的消息:
Unhandled exception at 0x5B89A893 (msvcr120d.dll) in SFML.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.
当我按下 space 栏来创建弹丸(绿色方块)时,就会发生这种情况。绿色方块出现在屏幕上它应该出现的位置,然后消息立即弹出。此时使用当前代码的射弹应该表现为绿色方形画笔,但会弹出此消息。这是我的源代码:
主要内容:
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();
}
}
projectile.h
class projectile: public entity //继承自entity { public:
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)); }
我该如何解决这个问题?任何 advice/help 非常感谢。提前致谢
在循环中 Draw projectile
您必须像这样使用或迭代器访问 projectileArray
中的元素
for (iter = projectileArray.begin(); iter != projectileArray.end(); iter++)
{
window.draw(iter->rect);
}
或在循环之前初始化 counter1=0;
否则在 main while
的第二次迭代中 counter1
将不会指向向量 projectileArray
.