2016-05-14 16 views
0

あなたのアドバイスが必要です。私はSFMLを使用していますので、mouseclickイベント後にスプライトシートからアニメーションを再生する必要があります(fe。64フレームと40ピクセル幅/各フレームの高さ)。私が来ている唯一の解決策は以下のとおりです。sfmlアニメーション後の爆発アニメーション

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(); 

        } 
        ... 

しかし、ウィンドウ - >ディスプレイ()何度も呼び出すことは本当に良いではありません。 あなたはより良いバリエーションを提案できますか?

+0

ゲームの最後にdisplay window()を呼び出すと、そのループが最適です –

答えて

0

アニメーション用のすべてのコードをイベントブロックにジャムするのではなく、それを広げてください。あなたは今まであなたがもう一度あなたのイベントループの外をwindow->display()を呼び出すために持ってしようとしているアニメーション以外のものを表示したい場合は、ここ

あなたのデザインは、その中には非常に柔軟性がありません。代わりに、あなたはブール値を設定したり、doAnimation()関数を呼び出す必要があるすべての計算を実行し、イベントのif文の中、あなたのアニメーションに表示されるので

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

:あなたのゲームループは以下のように同様に進みSFMLに一般

ある種の私は以下のような大まかな例を書いた:

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(); 

あなたの問題を解決する方法はたくさんあります。私の例は、理想的ではないと思うより柔軟性が低いですが、プログラムの必要性に応じてうまくいくかもしれません。次のステップを踏み出したいのであれば、アニメーションをある種のクラスに動かすと、長期的にはあなたの人生はずっと楽になります。

関連する問題