我需要你的建议。我使用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()实际上并不好; 你能建议更好的变种吗?
答案 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();
有很多方法可以解决您的问题。我的例子不如我想象的那么灵活,但根据你的程序的需要,它可能工作正常。如果你想进行下一步,将动画转移到某种类,那么从长远来看,这将使你的生活变得更加轻松。