2011-10-19 45 views
2

我一直在C++/SDL/OpenGL中进行2D平台游戏的动画工作,我和我的团队达到了需要确定播放器的每个动画(走路,跑步等)需要一个不同的帧速率用于我们的概念,但是我使用游戏编程一体机作为流畅动画的示例,并且在书中建议有限制移动的变量和帧的变化。在C++/SDL/OpenGL中使用平滑动画时遇到的问题

为了澄清我的意思是我在我的Sprite类,这些参数:

std::vector<Vector2f> delayMovementSprite; 
std::vector<int> frameDelayPerAnimation; 
GLfloat countX, countY; 

凡载体delayMovementSprite包含了型动物动画和countX增量在每帧中的所有值,直到它等于或大于大在向量delayMovementSprite中对应的值。

事情是这样的:

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; 
    } 
} 

而对于我有一个类动画它处理以下信息框:

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的通用定时器中目前使用的。

如果有人需要更多信息,请不要犹豫。

+0

你有什么最小的动画帧率? – crazyjul

+0

最小的动画帧速率适用于步行运动,速度为15 FPS。 –

+0

如果你想要光滑的东西,这有点小。最低为25 fps – crazyjul

回答

0

初看Animation::animate看起来不正确。让我解释一下:假设你有一个固定的显示帧速率(对于一个基于sprite的游戏来说,这会保持),你需要一个从帧计数器到精灵帧的线性映射。如果你画这个,这是一条线。在这种情况下,通过离散采样网格。无论何时,如果你想保留一个增量式的方案,只要有人认为“偏差线性取样”就应该认为“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