我只想为简单形状设置动画(例如,rect)。此动画仅在您按下确定的键时更改形状的颜色。
我无法找到这个简单目的的任何教程,这些在线教程都是关于精灵运动的所有内容。
我通过创建一个名为' Transition'的班级来设法改变这种颜色。其中的一个函数名为' Transition :: update()',它只是改变了在这个类中创建的形状的颜色。代码很简单(认为没有必要把它放在这里)。 问题是这个动画我创造了它不是一个平滑的动画,只是在恰当的时刻改变颜色。
问题很明显:
我怎样才能让我的动画顺畅呢?
(不要在这里放大代码,只是快速建议一下)
答案 0 :(得分:0)
基本上你需要引入存储颜色转换的变量,你需要控制每帧的时间。让我给你一个快速而非常基本的例子,让你明白这个想法。原谅我的风格......
#include <SFML/Graphics.hpp>
int main(){
sf::RenderWindow renderWindow(sf::VideoMode(800, 600), "Color Animation");
sf::Clock clock;
sf::Event event;
// Change to start the animation
// Red and blue to store the color transition
// Duration to control animation speed
int change = 0;
int red = 255;
int blue = 0;
float duration = float();
// Set a basic red circle as the starting shape
sf::Color color = sf::Color::Red;
sf::CircleShape circle(150);
circle.setFillColor(color);
while (renderWindow.isOpen()){
// How much time since last loop?
sf::Time dt = clock.restart();
duration += dt.asSeconds();
while (renderWindow.pollEvent(event)){
//Handle events here
if (event.type == sf::Event::EventType::Closed)
renderWindow.close();
//Respond to key pressed events
if (event.type == sf::Event::EventType::KeyPressed){
if (event.key.code == sf::Keyboard::C){
// C key pressed, start animation
change = 1;
}
}
}
// Animation started and animation duration per frame (0.01f) reached
// Change color by 1
if (change == 1 && duration > 0.01f){
red -= 1;
blue += 1;
if (red > 0){
// Reset frame time and set new color for circle
duration = 0;
color = sf::Color(red, 0, blue);
circle.setFillColor(color);
} else {
// Stop animation
change = 0;
}
}
// Clear render window and draw circle
renderWindow.clear(sf::Color::Black);
renderWindow.draw(circle);
renderWindow.display();
}
}