在SFML中制作动画形状?

时间:2018-03-12 11:09:06

标签: animation sfml

我只想为简单形状设置动画(例如,rect)。此动画仅在您按下确定的键时更改形状的颜色。

我无法找到这个简单目的的任何教程,这些在线教程都是关于精灵运动的所有内容。

通过创建一个名为' Transition'的班级来设法改变这种颜色。其中的一个函数名为' Transition :: update()',它只是改变了在这个类中创建的形状的颜色。代码很简单(认为没有必要把它放在这里)。 问题是这个动画我创造了它不是一个平滑的动画,只是在恰当的时刻改变颜色。

问题很明显:

  

我怎样才能让我的动画顺畅呢?

(不要在这里放大代码,只是快速建议一下)

1 个答案:

答案 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();
  }
}