gpt4 book ai didi

c++ - SFML - 尝试从 vector 绘制 Sprite 时程序崩溃

转载 作者:行者123 更新时间:2023-11-28 06:52:23 24 4
gpt4 key购买 nike

我正在编写这个相对简单的程序,以便在按下空格键时从移动的角色发射一个小弹丸。

程序编译没有任何错误(在代码块中)并运行直到按下空格键。该程序没有发射射弹,而是立即崩溃。

我想我已经能够将崩溃隔离到我将射弹绘制到屏幕的那一行(ln. 83)。我只是在之前和之后的行中使用了 cout 语句,而第二个语句没有显示。

for (int ii = 0; ii < inMotion.size(); ii++)
{
window.draw(inMotion[ii].bulletSprite);
}

我相信我的所有代码都是解决这个问题所必需的,所以我已经发布了所有代码。

#include <iostream>
#include <SFML/Graphics.hpp>
#include <string.h>
#include <math.h>
#include <vector>

using namespace std;
class Projectile
{
public:
Projectile(int, string);
void moveBullet();
sf::Sprite bulletSprite;
private:
sf::Texture bulletTexture;
int speed;
string bulletTextureString;
};

Projectile::Projectile(int s, string t)
{
speed = s;
bulletTextureString = t;
if(!bulletTexture.loadFromFile((bulletTextureString).c_str()))
{
cout << "error";
}
bulletSprite.setTexture(bulletTexture);
}
void Projectile::moveBullet()
{
bulletSprite.move(speed, 0);
}

class thePlayer
{
public:
void Fire(sf::Time);
void Walk();
void Draw(sf::RenderWindow&);
void Create(string);
sf::Time lastShot;
private:
vector<Projectile> inMotion;
sf::Texture playerTexture;
sf::Sprite playerSprite;
string playerTextureString;
int moveSpeed = 5;

};

void thePlayer::Create(string s)
{
playerTextureString = s;

if(!playerTexture.loadFromFile((playerTextureString).c_str()))
{
cout << "error";
}
playerSprite.setTexture(playerTexture);
}
void thePlayer::Fire(sf::Time time)
{
sf::Time shotDelay = sf::milliseconds(100);
if(time - lastShot >= shotDelay)
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
{
Projectile bullet(15, "fireball.png");
bullet.bulletSprite.setPosition(playerSprite.getPosition());
inMotion.push_back(bullet);
}
}
for(int ii = 0; ii < inMotion.size(); ii++)
{
inMotion[ii].moveBullet();
}
}
void thePlayer::Draw(sf::RenderWindow& window)
{
for (int ii = 0; ii < inMotion.size(); ii++)
{
window.draw(inMotion[ii].bulletSprite);
}
window.draw(playerSprite);
}
void thePlayer::Walk()//awsd standart movement
{
int x = 0;
int y = 0;
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
x-= moveSpeed;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
x+= moveSpeed;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
y-= moveSpeed;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
y+= moveSpeed;
}
playerSprite.move(x, y);
}

class Game
{
public:
void Update(sf::RenderWindow&, sf::Time);
void Start(sf::Time);
sf::Clock clock;
thePlayer player;

private:

};

void Game::Start(sf::Time time)
{
player.Create("block.png");
player.lastShot = time;
}
void Game::Update(sf::RenderWindow& window, sf::Time time)
{
player.Fire(time);
player.Walk();
player.Draw(window);
}

int main()
{
sf::RenderWindow window(sf::VideoMode(1000, 1000), "Menu");
window.setFramerateLimit(60);
Game theGame;
sf::Clock clock;
sf::Time startTime = clock.restart();
theGame.Start(startTime);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}

window.clear(sf::Color::White);
sf::Time elapsed = clock.getElapsedTime();
theGame.Update(window, elapsed);
window.display();
}
return 0;
}

非常感谢您的帮助。

编辑:我尝试使用调试器,但无法解决任何问题。指向一篇关于代码块调试的好文章的链接会很棒。

最佳答案

我自己解决了这个问题。我发现我必须通过指针引用 Bullet 类,并确保纹理也是公开的。我也错误地使用了构造函数,并摆脱了它们。

我的近似解决方案是这样的......

void thePlayer::Fire(sf::Time time)
{
sf::Time shotDelay = sf::milliseconds(100);
if(time - lastShot >= shotDelay)
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
{
Projectile *bullet = new Bullet;
bullet->bulletSprite.setPosition(playerSprite.getPosition());
inMotion.push_back(bullet);
}
}
for(int ii = 0; ii < inMotion.size(); ii++)
{
inMotion[ii]->moveBullet();
}

还必须更改类中的 vector 声明

//...
vector<Bullet*> Bullets;
//...

再次感谢尝试回答的人。

关于c++ - SFML - 尝试从 vector 绘制 Sprite 时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23717167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com