2

私は 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 の一般的なタイマーを使用しています。

さらに詳しい情報が必要な場合は、遠慮なく質問してください。

4

1 に答える 1

0

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

于 2011-10-19T07:41:21.757 に答える