渲染多个精灵会出现意外错误

问题描述 投票:0回答:1

代码文件写在下面。 当我尝试使用“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);
}

我需要将所有敌人同时渲染在屏幕上。

file class visual-c++ sfml
1个回答
0
投票

当每个

enemy
被推回向量
enemies
时,您似乎正在失去资源。向后推会复制本地
enemy
对象。因此,原有的纹理和字体被破坏。 不要在每个
Enemy
实例中都包含 sf::Texture 和 sf::Font,而是尝试在
Enemies
类中管理此资源,仅加载它们一次。然后只需提供此资源的参考即可进行
Enemy
构建。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.