2011-10-19 5 views
2

私はC++/SDL/OpenGLの2Dプラットフォームゲームのアニメーションに取り組んでいました。私のチームと私は、プレイヤーのすべてのアニメーション(ウォーキング、ランニングなど)は、私たちのコンセプトには異なるフレームレートが必要ですが、スムーズなアニメーションの例としてGame Programming All In Oneのガイドラインを使用し、ブックの推奨には動きを制限する変数がありますフレームの変更。私は私が私のSpriteクラスでこれらのパラメータを持っている意味を明確にするためにC++/SDL/OpenGLにおけるスムーズアニメーションのトラブル

それは同等かそれ以上になるまでベクトルdelayMovementSpriteはすべてのフレームに貴様のアニメーションやcountX増分のすべての値が含まれてい
std::vector<Vector2f> delayMovementSprite; 
std::vector<int> frameDelayPerAnimation; 
GLfloat countX, countY; 

値は、ベクトルdelayMovementSpriteに対応します。

このような何か:多くのような

Uint32 frameRate, oldTime; 
int frameDelay; 
int frameCount; 

そして、私は次の操作を行いアニメーション化機能では、:

void Sprite::movePosXWithSpeed() 
{ 
    playerMoveInX = false || playerMoveInX; 

    countX++; 
    if (countX > delayMovementSprite.at(getCurrentState()).x) 
    { 
    countX = 0; 
    if (handlerAnimation->getAnimationDirection() == SpriteData::RIGHT) 
    { 
     if (position.x + getSpeedX() + width < 6368.f) 
     { 
     position.x += getSpeedX(); 
     playerMoveInX = true; 
     return; 
     } 
    } 

    else if (position.x + getSpeedX() + width > 0) 
    { 
     position.x += getSpeedX(); 
     playerMoveInX = true; 
     return; 
    } 
    playerMoveInX = false; 
    } 
} 

そして、私は、以下の情報を処理するクラスのアニメーションを持っているフレームのスプライトのMoveX:

int Animation::animate() 
{ 
    if(oldTime + frameRate > SDL_GetTicks()) 
    { 
    return -1; 
    } 

    oldTime += frameRate; 
    frameCount++; 

    if (frameCount > frameDelay) 
    { 
    animationAlreadyEnd = false; 
    frameCount = 0; 
    currentFrame += incrementFrame; 

    if(currentFrame > maxFrames) 
    { 
     animationAlreadyEnd = true; 
     currentFrame = returnFrame; 
    } 
    } 

    return currentFrame; 
} 

私はすべてを実行しており、すべてが実行されています明らかに問題はありませんが、ゲームのいくつかの点では、アニメーションは他の点では滑らかに見えません。

"ゲームプレイ"のビデオを残して、みんなが私の意図を理解できるようにします。

http://www.youtube.com/watch?v=uoxKEYzwkcQ

私は現在、ゲームの実行中に60 FPSでの一般的なタイマーを使用。

さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

+0

あなたのアニメーションフレームレートはどれくらいですか? – crazyjul

+0

最小のアニメーションフレームレートは歩行動作用で、15 FPSです。 –

+0

スムーズにしたい場合は、少し小さいです。 25fpsが最小です – crazyjul

答えて

0

最初に見てAnimation::animateが正しく表示されません。私に説明させてください:あなたが固定ディスプレイフレームレート(これが保持するスプライトベースのゲームの場合)を仮定すると、フレームカウンタからスプライトフレームへの線形マッピングが必要です。これをグラフ化すると、これは線です。この場合、離散サンプリンググリッド上に1つあります。 「ディスクリートラインサンプリング」を考えるときはいつも、「Bresenham」と考える必要があります。実際には、インクリメンタルスキームを維持したい場合は、Bresenhamのアルゴリズムを使用してアニメーションを進めることができます。他の可能性は、単純にアフィン方程式f_anim = framerate_anim/framerate_game * (framecounter_game - startframe_animation)を評価することでした。

+0

したがって、正しく理解すれば、次のフレームを表示するタイミングを計算するためにフレームレートモードを使用することを意味しますか? –

+0

@ oscar.rpr:いいえ、私は、一定の表示フレームレートを維持し、Bresenhamのアルゴリズム(http://en.wikipedia。)で上昇軸をインクリメントするのと同じスキームを使用してアニメーションフレームカウントをインクリメントすることを意味します。org/wiki/Bresenham%27s_line_algorithm)アニメーション曲線を "ラスタライズ"していると考えてください(T->位置図)。 – datenwolf

関連する問題