我最初将精灵纹理代码放在主 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);
}
};
还有其他类,但没有一个与玩家精灵渲染相关
根据 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);