C++SFML精灵没有绘制,但是没有出现错误

C++ SFML Sprite not drawing, however no errors occur

本文关键字:错误 精灵 绘制 C++SFML      更新时间:2023-10-16

我一直试图在C++SFML中使用类来制作精灵显示。然而,当我编译并运行程序时,什么都没有出现:也没有错误。

(主要发生的唯一一件事是创建了一个"游戏"对象)

Game.h

    #ifndef GAME_H
    #define GAME_H
    #include <SFML/Graphics.hpp>
    #include "Player.h"
    
    
    class Game
    {
        public:
            Game();
        private:
            //Variables
            sf::RenderWindow _mainWindow;
            enum _gameState { Playing, Paused, Splash, Menu };
    
            //Methods
            void gameLoop();
    };
    
    #endif // GAME_H

Game.cpp

#include "Game.h"
#include "Player.h"
Game::Game() {
    //Variables
    _mainWindow.create(sf::VideoMode(960, 640), "Game", sf::Style::Titlebar | sf::Style::Close);
    _mainWindow.setFramerateLimit(60);
   //Start Game Loop
    gameLoop();
}
void Game::gameLoop() {
    Player player;
    while(_mainWindow.isOpen()) {
        sf::Event ev;
        while(_mainWindow.pollEvent(ev)) {
            if(ev.type == sf::Event::Closed)
                _mainWindow.close();
            if(ev.type == sf::Event::KeyPressed) {
                if(ev.key.code == sf::Keyboard::Escape)
                    _mainWindow.close();
            }
        }

        //Draw Stuff
        _mainWindow.clear(sf::Color::White);
        player.drawSprite(_mainWindow);
        _mainWindow.display();
    }
}

Player.h

#ifndef PLAYER_H
#define PLAYER_H
#include <SFML/Graphics.hpp>
#include <iostream>

class Player
{
    public:
        Player();
        void drawSprite(sf::RenderWindow& window);
    private:
        bool loadSprite();
        sf::Texture _playerTexture;
        sf::Sprite _playerSprite;
};
#endif // PLAYER_H

Player.cpp

#include "Player.h"
#include "Game.h"

Player::Player()
{
    if(!Player::loadSprite()){
        return;
    }
}
bool Player::loadSprite() {
    sf::Texture _playerTexture;
    if(!_playerTexture.loadFromFile("img/darkguy.png", sf::IntRect(32,32,32,32))) {
        std::cout << "Failed to load player image" << std::endl;
        return false;
    } else {
        sf::Sprite _playerSprite;
        _playerSprite.setTexture(_playerTexture);
    }
    return true;
}
void Player::drawSprite(sf::RenderWindow& window) {
    //sprite.setTextureRect(sf::IntRect(10, 10, 32, 32));
    window.draw(_playerSprite);
    std::cout << "Sprite Drawn Successfully" << std::endl;
}

您在此处声明一个新的本地_playerPrite:

} else {
    sf::Sprite _playerSprite;
    _playerSprite.setTexture(_playerTexture);
}

相反,使用现有的类成员:

} else {
    _playerSprite.setTexture(_playerTexture);
}

您可能也想删除此代码的第一行,同样的问题:

bool Player::loadSprite() 
{
    sf::Texture _playerTexture; // <--- local redeclaration

根据我的记忆:纹理必须是类的成员;当你使用它时,它必须存在。在你的代码中,_playerTexture在loadSprite()的末尾被销毁。_playerPrite也有同样的问题。


编辑:

您不必在方法中重新声明类的成员:

bool Player::loadSprite() {
    sf::Texture _playerTexture;
    if(!_playerTexture.loadFromFile("img/darkguy.png", sf::IntRect(32,32,32,32))) {
        std::cout << "Failed to load player image" << std::endl;
        return false;
    } else {
        sf::Sprite _playerSprite;
        _playerSprite.setTexture(_playerTexture);
    }
    return true;
}

应为:

bool Player::loadSprite() {
    if(!_playerTexture.loadFromFile("img/darkguy.png", sf::IntRect(32,32,32,32))) {
        std::cout << "Failed to load player image" << std::endl;
        return false;
    } else {
        _playerSprite.setTexture(_playerTexture);
    }
    return true;
}

(附言:你的代码不尊重SRP(单一责任原则),玩家不必显示自己。)

您正在绘制但没有显示进行的精灵

void Player::drawSprite(sf::RenderWindow& window) {
//sprite.setTextureRect(sf::IntRect(10, 10, 32, 32));
window.draw(_playerSprite);
std::cout << "Sprite Drawn Successfully" << std::endl;
//this is the display function
window.display()
}