私は C++/SDL/OpenGL で 2D プラットフォーマー ゲームのアニメーションに取り組んでおり、私のチームと私は、プレーヤーのすべてのアニメーション (ウォーキング、ランニングなど) に異なるフレームレートが必要であることを確立する必要があるところまで来ました。私たちのコンセプトではありますが、滑らかなアニメーションの例として Game Programming All In One をガイドラインとして使用し、本ではフレームの動きと変化を制限する変数を推奨しています。
意味を明確にするために、Sprite クラスに次のパラメーターがあります。
std::vector< Vector2f > delayMovementSprite;
std::vector< int > frameDelayPerAnimation;
GLfloat countX, countY;
ベクトル delayMovementSprite には、さまざまなアニメーションのすべての値が含まれ、ベクトル delayMovementSprite に対応する値以上になるまでフレームごとに countX が増加します。
このようなもの:
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;
}
}
フレームには、次の情報を処理するクラス Animation があります。
Uint32 frameRate, oldTime;
int frameDelay;
int frameCount;
そして、アニメーション化する関数では、Sprite の 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 の一般的なタイマーを使用しています。
さらに詳しい情報が必要な場合は、遠慮なく質問してください。