Skip to content

Commit

Permalink
Сделал появление окна настройки анимации по нажатию на спрайт; Создал…
Browse files Browse the repository at this point in the history
… класс настроек анимации Animator
  • Loading branch information
Leo506 committed Jan 28, 2022
1 parent 64e09b8 commit 1861427
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 19 deletions.
3 changes: 3 additions & 0 deletions animation.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ namespace animation
// Возвращает кол-во спрайтов в анимации
const int NumberOfSprites() const { return m_numberOfSprites; }

// Возвращает скорость анимации
const float AnimSpeed() const { return m_animSpeed; }

// Обновить анимацию
void Update(int delta);

Expand Down
81 changes: 81 additions & 0 deletions animator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#include <SFML/Graphics.hpp>
#include "imgui.h"
#include "imgui-SFML.h"
#include "animator.h"

namespace animation
{
Animator::Animator(sf::RenderWindow* const window, AnimationClip* clip)
{
m_window = window;
m_clip = clip;
m_animationIsSet = true;
m_speed = clip->AnimSpeed();
m_path = "";
m_rect = sf::IntRect(0,0,0,0);
m_countOfSprites = clip->NumberOfSprites();
ImGui::SFML::Init(*m_window);
}

Animator::Animator(sf::RenderWindow* const window)
{
m_window = window;
m_clip = NULL;
m_animationIsSet = false;
m_speed = 0;
m_path = "";
m_rect = sf::IntRect(0,0,0,0);
m_countOfSprites = 0;
ImGui::SFML::Init(*m_window);
}

Animator::~Animator()
{
ImGui::SFML::Shutdown();
}

void Animator::ProcessEvent(const sf::Event& event)
{
ImGui::SFML::ProcessEvent(event);
}

void Animator::Render()
{
if (m_window != NULL && m_clip != NULL)
ImGui::SFML::Render(*m_window);
}

void Animator::SetAnimClip(AnimationClip* clip)
{
m_clip = clip;
m_animationIsSet = true;
m_speed = clip->AnimSpeed();
m_path = "";
m_rect = sf::IntRect(0,0,0,0);
m_countOfSprites = clip->NumberOfSprites();
ImGui::SFML::Init(*m_window);
}

void Animator::Update(const sf::Time& deltaTime)
{
if (m_window != NULL && m_clip != NULL)
{
ImGui::SFML::Update(*m_window, deltaTime);

ImGui::Begin("Animation Controller");

ImGui::Text("Speed of animation");
if (ImGui::DragFloat("Speed", &m_speed, 0.1f, 0.0f, 5.0f))
m_clip->SetAnimSpeed(m_speed);

if (ImGui::Button("Pause"))
m_clip->Pause(true);

if (ImGui::Button("Unpause"))
m_clip->Pause(false);

ImGui::End();
}

}
}
48 changes: 48 additions & 0 deletions animator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#ifndef ANIMATOR_H_INCLUDED
#define ANIMATOR_H_INCLUDED

#include <SFML/Graphics.hpp>
#include "animation.h"

namespace animation
{
class Animator
{
private:
sf::RenderWindow *m_window; // Игровое окно, к которому будет привязан UI инструмента
AnimationClip *m_clip; // Анимация, над которой ведётся работа
float m_speed; // Скорость анимации
std::string m_path; // Путь к файлу со спрайтами
sf::IntRect m_rect; // Размеры и координаты первого спрайта
int m_countOfSprites; // Кол-во спрайтов в анимации
bool m_animationIsSet; // Установлена ли анимация?

public:
// Конструктор аниматора
// window - игровое окно, к которому будет привязан UI инструмента
// clip - анимация, над которой ведётся работа
Animator(sf::RenderWindow* const window, AnimationClip *clip);

Animator(sf::RenderWindow* const window);

// ImGui работает с выделением памяти, поэтому нужен явный декструктор
~Animator();

// Обработчик событий
void ProcessEvent(const sf::Event &event);

// Рендер UI
void Render();

// Установка новой анимации
void SetAnimClip(AnimationClip *clip);

// Обновление аниматора
void Update(const sf::Time& deltaTime);

const bool IsSet() const { return m_animationIsSet; }

};
}

#endif // ANIMATOR_H_INCLUDED
2 changes: 1 addition & 1 deletion imgui.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Size=405,127
Collapsed=0

[Window][Animation Controller]
Pos=332,45
Pos=311,86
Size=324,151
Collapsed=0

60 changes: 42 additions & 18 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "animation.h"
#include "imgui.h"
#include "imgui-SFML.h"
#include "animator.h"


int main()
Expand All @@ -14,7 +15,7 @@ int main()

float speed = 1;

sf::Sprite sprite1;
sf::Sprite sprite1, sprite2;

// Создание анимации 1-ым способом
sf::IntRect rect1(0, 0, 32, 32);
Expand All @@ -23,47 +24,70 @@ int main()
clip1.SetAnimTime(70 * (i+1), i);
clip1.SetAnimSpeed(2);

// Создание анимации 2-ым способом
animation::AnimationClip clip2(&sprite2);
clip2.SetNumberOfSprites(4);
sf::Texture texture;
for (int i = 0; i < 4; i++)
{
if (!clip2.SetAnimTime(70 * (i+1), i))
{
std::cout << "Error on create anim clip\n";
return -1;
}
sf::IntRect rect2(0 + 32 * i, 32, 32, 32);
texture.loadFromFile("Assets/Sprites/2.png", rect2);
clip2.SetTexture(texture, i);
clip2.SetAnimTime(70 * (i + 1), i);
}
std::cout << "Anim time is setted\n";
//sprite.setScale(3.0f, 3.0f);
//sprite.setPosition(400 - sprite.getGlobalBounds().width / 2, 300 - sprite.getGlobalBounds().height / 2);

sprite1.setScale(3.0f, 3.0f);
sprite2.setScale(3.0f, 3.0f);

sprite1.setPosition(100, 252);
sprite2.setPosition(604, 252);

animation::Animator animator(&window);

sf::Clock deltaClock;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
ImGui::SFML::ProcessEvent(event);
animator.ProcessEvent(event);
if (event.type == sf::Event::Closed)
window.close();
}

sf::Time dt = deltaClock.restart();

ImGui::SFML::Update(window, dt);
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
sf::Vector2i mousePos(sf::Mouse::getPosition(window).x, sf::Mouse::getPosition(window).y);
if (sprite1.getGlobalBounds().contains(mousePos.x, mousePos.y))
{
animator.SetAnimClip(&clip1);
}
else if (sprite2.getGlobalBounds().contains(mousePos.x, mousePos.y))
animator.SetAnimClip(&clip2);
}

ImGui::Begin("Animation Controller");
sf::Time dt = deltaClock.restart();

ImGui::Text("Speed of animation");
ImGui::SliderFloat("speed", &speed, 0.0f, 5.0f);
if (ImGui::Button("Set speed"))
clip1.SetAnimSpeed(speed);
if (ImGui::Button("Pause"))
clip1.Pause(true);
if (ImGui::Button("Unpause"))
clip1.Pause(false);
ImGui::End();
animator.Update(dt);

clip1.Update(dt.asMilliseconds());
clip2.Update(dt.asMilliseconds());

window.clear();
window.draw(sprite1);
ImGui::SFML::Render(window);
window.draw(sprite2);
animator.Render();
window.display();

}

ImGui::SFML::Shutdown();

return 0;
}

0 comments on commit 1861427

Please sign in to comment.