代码文件写在下面。 当我尝试使用“Enemies.h”编译并运行项目时,我在 Enemy.cpp -> Enemy::Draw -> window.draw(healthText); 上遇到错误 如果我注释掉这一行,程序会运行,但精灵会显示为红色框(sprite.setColor(sf::Color::Red);),如果我删除这一行,则看不到任何内容。纹理敌人.png 未加载。 但我尝试仅渲染一个敌人(仅包括 Enemy.h,不包括 Enemies.h),然后一切正常,即纹理和文本显示在屏幕上,并且一切运行顺利。 我正在尝试在 microsoft Visual Studio 2022 社区中运行它。 我无法找到实际的问题。它在加载图片或文本时没有给出错误,但在此代码的其他任何地方都没有给出错误。你能帮忙吗?
主.cpp
#include <SFML/Graphics.hpp>
#include "Enemies.h"
int main()
{
sf::RenderWindow window(sf::VideoMode(1920, 1080), "SFML works!");
window.setVerticalSyncEnabled(true);
Enemies enemies;
sf::Clock clock;
sf::Int64 enemySpawnMeasure = 0;
while (window.isOpen())
{
sf::Time elapsed = clock.restart();
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
enemies.update(elapsed,enemySpawnMeasure);
window.clear();
enemies.draw(window);
window.display();
}
return 0;
}
敌人.h
#pragma once
#include "Enemy.h"
class Enemies
{
std::vector<Enemy> enemies;
int spawnRate;
public:
void draw(sf::RenderWindow& window);
void update(sf::Time& clockTime,sf::Int64& spawnMeasure);
};
敌人.cpp
#include "Enemies.h"
void Enemies::draw(sf::RenderWindow& window)
{
for (Enemy& enemy : enemies)
{
enemy.draw(window);
}
}
void Enemies::update(sf::Time& clockTime,sf::Int64& measure)
{
if(measure <= 1000000)
measure += clockTime.asMicroseconds();
else {
Enemy enemy(sf::Vector2f(rand() % 1920, rand() % 1080));
enemies.push_back(enemy);
measure = 0;
}
for (Enemy& enemy : enemies)
{
enemy.update(clockTime);
}
}
敌人.h
#pragma once
#include<SFML/Graphics.hpp>
class Enemy
{
sf::Vector2f position;
sf::Texture texture;
sf::Sprite sprite;
sf::Vector2f velocity;
int health;
sf::Text healthText;
sf::Font font;
public:
Enemy(sf::Vector2f position=sf::Vector2f(0.f,0.f), sf::Vector2f velocity = sf::Vector2f(1.f,1.f), int health = 100, int damage = 10, int score = 10);
void draw(sf::RenderWindow& window);
void update(sf::Time& clockTime);
};
敌人.cpp
#include "Enemy.h"
Enemy::Enemy(sf::Vector2f position, sf::Vector2f velocity, int health, int damage, int score)
{
this->position = position;
this->velocity = velocity;
this->health = health;
if (!texture.loadFromFile("./Assets/Images/enemy.png")) throw std::runtime_error("Enemy image not found.");
sprite.setColor(sf::Color::Red);
sprite.setTexture(texture);
sprite.setPosition(position);
if (!font.loadFromFile("./Assets/Fonts/RobotoMono-VariableFont_wght.ttf")) throw std::runtime_error("Font not found.");
healthText.setFont(font);
healthText.setString(std::to_string(health));
healthText.setPosition(position.x,position.y-10);
}
void Enemy::draw(sf::RenderWindow& window)
{
window.draw(sprite);
window.draw(healthText);
}
void Enemy::update(sf::Time& clockTime)
{
sprite.move(velocity * float(clockTime.asMicroseconds()/10000));
healthText.setPosition(sprite.getPosition().x, sprite.getPosition().y - 10);
}
我需要将所有敌人同时渲染在屏幕上。
当每个
enemy
被推回向量 enemies
时,您似乎正在失去资源。向后推会复制本地 enemy
对象。因此,原有的纹理和字体被破坏。
不要在每个 Enemy
实例中都包含 sf::Texture 和 sf::Font,而是尝试在 Enemies
类中管理此资源,仅加载它们一次。然后只需提供此资源的参考即可进行Enemy
构建。