鼠标点击后爆炸的sfml动画

时间:2016-05-14 14:26:11

标签: c++ animation sfml

我需要你的建议。我使用SFML并且我需要在mouseclick事件之后从spritesheet(例如64帧和每帧的40px宽度/高度)播放动画。我唯一的解决方案是:

if (event.type == sf::Event::MouseButtonPressed) {
                if (event.key.code == sf::Mouse::Left) {
                    float frame = 0;
                    float frameCount = 64;
                    float animSpeed = 0.005;
                    while (frame < frameCount) {
                        spriteAnimation->setTextureRect(sf::IntRect(int(frame)*w, 0, w, w));
                        frame += animSpeed;
                        window->draw(rect); // clear the area of displaying animation
                        window->draw(*spriteAnimation);
                        window->display();

                    }
                    ...

但是多次调用window-&gt; display()实际上并不好; 你能建议更好的变种吗?

1 个答案:

答案 0 :(得分:0)

不应将动画的所有代码都插入到事件块中,而应将其展开。

您的设计非常不灵活,因为如果您想要显示动画以外的任何内容,则必须在事件循环之外再次调用window->display()

通常在SFML中,您的游戏循环类似于以下内容:

initialize();
while(running)
{
    checkEvents();
    clear();
    update();
    display();
}

您不应在事件的if语句中执行所有计算并显示动画,而应设置bool或调用某种类型的doAnimation()函数。我在下面写了一个粗略的例子:

bool doAnimation = 0;
//declare frame, framespeed, etc
if (event.type == sf::Event::MouseButtonPressed) 
{
    if (event.key.code == sf::Mouse::Left) 
    {
        doAnimation = true; 
        //reset frame, framespeed, etc         
    }
}
clear();
if(doAnimation)
{
    sprite->setTexture(...);
    if(frame == endFrame)
    {
        doAnimation = 0;   
    }
    drawSprite();
}
window->display();

有很多方法可以解决您的问题。我的例子不如我想象的那么灵活,但根据你的程序的需要,它可能工作正常。如果你想进行下一步,将动画转移到某种类,那么从长远来看,这将使你的生活变得更加轻松。