Witam, stworzyłem klasę, która odpowiada za animację postaci. Teraz próbuję zaimplementować to, że postać będzie zmieniać kierunek tekstury w zależności, w którą stronę idzie. Postać się ładuje, kiedy wciskam przycisk D wszystko działa ok, ale w momencie naciśnięcie przycisku A tekstura się nie zmienia i dodatkowo cały czas miga(pojawia się i znika). Robiłem wszystko na wzór tego poradnika do animacji w SFML dostosowując kod pod moją własną klasę. Dlaczego ta tekstura się psuję ?
main.cpp
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Animation.h"
int main()
{
sf::RenderWindow window(sf::VideoMode(1280, 720), "Animations");
window.setVerticalSyncEnabled(true);
sf::Texture playerTexture;
if (!playerTexture.loadFromFile("Ninja.png"));
sf::Sprite player;
player.setTexture(playerTexture);
Animation myAnimation(&playerTexture, sf::Vector2u(0, 0), sf::Vector2u(10, 7), 130.0f);
player.setTextureRect(myAnimation.textureRect);
sf::Clock deltaClock;
sf::Clock animationClock;
while (window.isOpen())
{
float deltaTime = deltaClock.restart().asMilliseconds();
sf::Event event;
while (window.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
if (event.key.code == sf::Keyboard::Escape)
window.close();
break;
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) || sf::Keyboard::isKeyPressed(sf::Keyboard::A)
|| sf::Keyboard::isKeyPressed(sf::Keyboard::W) || sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
player.move(0.0f, -0.5f * deltaTime);
myAnimation.Update(3, animationClock);
player.setTextureRect(myAnimation.textureRect);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
player.move(0.0f, 0.5f * deltaTime);
myAnimation.Update(0, animationClock);
player.setTextureRect(myAnimation.textureRect);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
player.move(-0.5f * deltaTime, 0.0);
myAnimation.Update(2, animationClock, false);
player.setTextureRect(myAnimation.textureRect);
//player.setPosition(player.getPosition().x + oneSprite, player.getPosition().y);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
player.move(0.5f * deltaTime, 0.0);
myAnimation.Update(2, animationClock, true);
player.setTextureRect(myAnimation.textureRect);
//player.setPosition(player.getPosition().x + oneSprite, player.getPosition().y);
}
}
else
{
myAnimation.Update(0, animationClock);
player.setTextureRect(myAnimation.textureRect);
}
window.clear();
window.draw(player);
window.display();
}
return 0;
}
Animation.h
#pragma once
#include <SFML/Graphics.hpp>
class Animation
{
public:
Animation(sf::Texture* texture, sf::Vector2u defaultPosition, sf::Vector2u rowsAndColumns, float timeElapsed);
void Update(int row, sf::Clock &timeElapsed);
void Update(int row, sf::Clock& timeElapsed, bool faceRight);
sf::IntRect textureRect;
bool faceRight;
private:
sf::Vector2u textureSize;
sf::Vector2u defaultPos;
float currentImage;
float switchTime;
};
Animation.cpp
#include "Animation.h"
Animation::Animation(sf::Texture* texture, sf::Vector2u defaultPosition, sf::Vector2u rowsAndColumns, float timeElapsed)
{
this->switchTime = timeElapsed;
this->defaultPos = defaultPosition;
this->textureSize.x = texture->getSize().x / rowsAndColumns.x;
this->textureSize.y = texture->getSize().y / rowsAndColumns.y;
this->textureRect = sf::IntRect(defaultPosition.x * textureSize.x, defaultPosition.y * textureSize.y, textureSize.x, textureSize.y);
}
void Animation::Update(int row, sf::Clock& timeElapsed)
{
textureRect.top = row * textureSize.y;
this->currentImage = textureRect.top;
if (timeElapsed.getElapsedTime().asMilliseconds() > switchTime)
{
if (textureRect.left >= textureSize.x)
textureRect.left = 0;
else
textureRect.left += textureSize.x;
timeElapsed.restart();
}
}
void Animation::Update(int row, sf::Clock& timeElapsed, bool faceRight)
{
textureRect.top = row * textureSize.y;
this->faceRight = faceRight;
this->currentImage = textureRect.top / textureSize.x;
if (timeElapsed.getElapsedTime().asMilliseconds() > switchTime)
{
if (textureRect.left >= textureSize.x)
textureRect.left = 0;
else if (faceRight)
{
textureRect.left += textureSize.x;
textureRect.width = abs(textureRect.width);
}
else if (!faceRight)
{
textureRect.left += abs(textureSize.x * 2.0f);
textureRect.width = -abs(textureRect.width);
}
timeElapsed.restart();
}
}