【发布时间】:2017-03-26 12:39:40
【问题描述】:
我在一个名为 OpenClassrooms 的法语论坛上尝试过之后在这里发帖,但没有答案,我也在这里发帖。
所以我警告你,我是 C++ 和 SFML 的新手,所以可能有一万个错误,而且我读的书似乎是一本非常糟糕的书,所以我尝试用 Bjarne Stroustrup 的书来纠正它。
我的问题如下:
当我按下 Enter 或 Space 时,我会创建弹丸(同一个键盘上有两个玩家)。每次按下它,我都会为新的射弹创建一个射弹的 sprite 副本,并将其放入 std::vector<sf::Sprite>。问题是当我启动游戏时,如果两个玩家同时按下他们的射击键(Enter 和 Space)(我的意思是,只要第一个弹丸可见),游戏就会崩溃并显示Segmentation Fault (core dumped)。为了解决这个问题,我创建了两个精灵(每个玩家一个),并影响他们的射弹。问题是当他们的攻击速度很大时,他们可以在第一个消失之前发射第二个射弹,所以碰撞会有问题,因为有两次相同的精灵......而第一个不起作用。所以,为了解决这个问题,我想使用一个 std::vector。顺便说一句,我不会尝试只为两个玩家解决这个问题,我计划添加更多,所以我需要一些适用于 1000 名玩家的东西,例如(当然我不会对 1000 名玩家这样做,但如果它适用于该数量,它也适用于 5 名玩家)。
为了创建我的射弹,我使用了对 Sprite 对象的引用,这要归功于我的类 Game 中的一个方法。此引用是对 std::vector 中的精灵的引用。我还意识到,如果我们发射第一个弹丸,等待它消失,然后让两个玩家射击,它可以正常工作(有时,它有时也会崩溃)......我不明白为什么,但主要是当我启动它崩溃的游戏。
这是我的代码:
std::vector<sf::Sprite> sprites;
int main()
{
Game game;
sf::ContextSettings settings;
settings.antialiasingLevel = 8;
sf::RenderWindow window(sf::VideoMode(1600, 900), "Bombardes", sf::Style::Default, settings);
sf::Texture text;
if (!text.loadFromFile("resources/projectile.png")) {
logg.error("Could not create texture for projectile. Aborting.");
}
Bombard bomb(50, 150, &game, &pSprite, &movement2); // player class
Bombard bomb2(1550, 850, &game, &pSprite2, &movement);
std::vector<std::shared_ptr<Projectile>> p;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
switch (event.type) {
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
if (event.key.code == sf::Keyboard::Return) { // Player 2
auto current2 = std::chrono::steady_clock::now();
auto elapsed2 = std::chrono::duration_cast<std::chrono::milliseconds>(current2 - last2);
if (elapsed2.count() >= 1000 / bomb2.getAttackSpeed()) { // Time the frequency of shots
last2 = std::chrono::steady_clock::now();
if (bomb2.getAmmo() > 0) { // Check if there's still ammo
sprites.push_back(sf::Sprite(text)); // New sprite in vector
p.push_back(std::make_shared<Projectile>(bomb2.getPos().getX(), bomb2.getPos().getY(), &sprites[sprites.size()-1], &game, bomb2.getProjectileMovement(), bomb2.getPenetration(),
bomb2.getSpeed())); // Create the projectile
bomb2.fire(); // Remove an ammo
}
}
}
else if (event.key.code == sf::Keyboard::Space) { // Player 1
auto current = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(current - last);
if (elapsed.count() >= 1000 / bomb.getAttackSpeed()) {
last = std::chrono::steady_clock::now();
if (bomb.getAmmo() > 0) {
sprites.push_back(sf::Sprite(text));
p.push_back(std::make_shared<Projectile>(bomb.getPos().getX(), bomb.getPos().getY(), &sprites[sprites.size()-1], &game, bomb.getProjectileMovement(), bomb.getPenetration(), bomb.getSpeed()));
bomb.fire();
}
}
}
break;
}
}
}
return 0;
}
当然,我删除了一些部分,我不会复制粘贴我的整个代码,还有一些无用的东西。如果你觉得你需要我的课程(Projectile、Game、Entity、Bombard),我会发布它们。
我想它可以帮助您查看 Projectile 的构造函数:
Projectile::Projectile(int posX, int posY, sf::Sprite *sprite, Game *game, sf::Vector2f direction, double penetration, double speed) {
/** @brief Full constructor.
@param int posX : The X position on the map.
@param int posY : The Y position on the map.
@param sf::Sprite *sprite : A pointer to the sprite.
@param Game *game : A pointer to the game.
@param sf::Vector2f direction : The direction in which the projectile will move. */ }
感谢您的帮助!
【问题讨论】: