显示一个白框而不是精灵(C++、SFML)

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

我最初将精灵纹理代码放在主 cpp 中并且它可以工作,在将其迁移到玩家类后我遇到了这个问题。

目前只有方向仍然是精灵,我想在开始对它们进行动画处理之前对其进行排序。

主要.cpp

#include <SFML/Graphics.hpp>
#include <iostream>
#include "Initialise.h"
#include"Player.h"

using namespace sf;


int main()
{
    sf::RenderWindow window(sf::VideoMode(1920, 1080, 32), "Game Demo", sf::Style::Default);

    sf::Texture txt_playerIdle;

    if (!txt_playerIdle.loadFromFile("[removed from post, is correct directory]")) {
        std::cout << "Error loading the image!" << std::endl;
    }

    Player player(1.f, 2.f, 0.f, txt_playerIdle);

    player.GetPlayerSprite().setTextureRect({ 0, 0, 32, 32 });

    const float f_FPS = 60.0f;
    bool b_redraw = true;

    sf::Clock clock;

    sf::Event event;

    while (window.isOpen())
    {
        if (clock.getElapsedTime().asSeconds() >= 1.0f / f_FPS)
        {
            b_redraw = true;
            clock.restart();
        }

        player.MovePlayer();

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
        {
            player.GetPlayerSprite().setTextureRect({ 0, 32, 32, 32 });
        }
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
        {
            player.GetPlayerSprite().setTextureRect({ 0, 96, 32, 32 });
        }
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
        {
            player.GetPlayerSprite().setTextureRect({ 0, 0, 32, 32 });
        }
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
        {
            player.GetPlayerSprite().setTextureRect({ 0, 64, 32, 32 });
        }

        if (b_redraw)
        {
            window.clear();
            window.draw(player.GetPlayerSprite());
            window.display();
            b_redraw = false;
        }
    }

    return 0;
}

播放器.cpp

#include "Player.h"


void Player::SetPlayerSpeed(float NewSpeed)
{
    PlayerSpeed = NewSpeed;
}

float Player::GetPlayerSpeed()
{
    return this->PlayerSpeed;
}

void Player::SetPlayerSprite(sf::Sprite sprite)
{
    PlayerSprite = sprite;
}

sf::Sprite& Player::GetPlayerSprite()
{
    return PlayerSprite;
}

void Player::MovePlayer()
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
    {
        PlayerSprite.setPosition(PlayerSprite.getPosition().x, PlayerSprite.getPosition().y - PlayerSpeed);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
    {
        PlayerSprite.setPosition(PlayerSprite.getPosition().x - PlayerSpeed, PlayerSprite.getPosition().y);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
        PlayerSprite.setPosition(PlayerSprite.getPosition().x, PlayerSprite.getPosition().y + PlayerSpeed);

    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
        PlayerSprite.setPosition(PlayerSprite.getPosition().x + PlayerSpeed, PlayerSprite.getPosition().y);
    }
}

玩家.h

#pragma once
#include "GameObject.h"

using namespace std;

class Player :public GameObject {
private:
    int PlayerHealth;
    int PlayerMaxHealth;
    float PlayerSpeed;
    sf::Texture PlayerTexture;
    sf::Sprite PlayerSprite;

public:

    void SetPlayerHealth(int NewPlayerHealth);
    int GetPlayerHealth();

    void SetPlayerMaxHealth(int NewPlayerMaxHealth);
    int GetPlayerMaxHealth();

    void SetPlayerSpeed(float NewPlayerSpeed);
    float GetPlayerSpeed();

    void SetPlayerSprite(sf::Sprite NewPlayerSprite);
    /*sf::Sprite GetPlayerSprite();*/
    sf::Sprite& GetPlayerSprite();
    void MovePlayer();

    Player(float speed, float scale, float rotation, sf::Texture texture)
    {
        this->SetScale(scale);
        this->SetRotation(rotation);
        PlayerSpeed = speed;
        PlayerTexture = texture;
        PlayerSprite.setTexture(texture);

    }


};

还有其他类,但没有一个与玩家精灵渲染相关

c++ sfml
1个回答
0
投票

根据 SFML FAQ,您需要保持精灵和纹理都处于活动状态。

在你的职能中

Player(float speed, float scale, float rotation, sf::Texture texture)
{
    PlayerTexture = texture;
    PlayerSprite.setTexture(texture);
}

您正在按值获取

sf::Texture
并将精灵绑定到此临时纹理,您应该将其绑定到存储在
Player

中的纹理
PlayerTexture = std::move(texture);
PlayerSprite.setTexture(PlayerTexture);
© www.soinside.com 2019 - 2024. All rights reserved.