如何设置if语句来为sprite设置动画?

时间:2014-03-10 04:15:15

标签: c++ visual-studio-2010 opengl sdl

如何在每一帧之后设置一个if语句,精灵显示下一帧然后是下一帧,然后一旦它经过所有帧就结束了?

我尝试使用if语句,它从来没有为我工作,有人可以举个例子吗?

编辑:

在对代码的需求之后,我决定添加一个样本。

int frame4 = 1;

if(frame4 = 1)
{
WalkDownFrame1(); //Renders frame 4
}
else if(frame4 = 2)
{
WalkDownFrame2(); //Renders frame 2
}
else if(frame4 = 3)
{
WalkDownFrame3(); //Renders frame 3
}
else if(frame4 = 4)
{
WalkDownFrame4(); //Renders frame 4
}
else if(frame4 = 5)
{
frame4 = 1;
}
frame4++;

无论我应用什么修改,它都会卡在一帧上。

4 个答案:

答案 0 :(得分:0)

我假设你的意思是如果条件为真,则动画发生,如果条件为假,则停止,在这种情况下它看起来像

/*Rest of your model transformation code*/
if(shouldbeanimating){
   /*animation code*/
}else{
/*default state or nothing if you want the model to 
freeze at that point in the animation*/
}

然后,每当程序停止动画时,你只需将其设置为false

答案 1 :(得分:0)

嗯,你需要知道你的动画有多少帧。然后你继续绘制帧。如果您点击最后一帧,则返回第一帧或停止。 这是一个可以帮助您的链接。如果它的SDL或任何其他lib无关紧要,方法总是相同的。 http://lazyfoo.net/SDL_tutorials/lesson20/index.php

作为一个例子

while(isAnimating)
{
   framecounter++;
   isAnimating = (framecounter < MAX_FRAMES);
}

答案 2 :(得分:0)

他们有很多解决方案。你可以做一个Sprite类并添加一个属性_tick,将你的Texture存储到一个容器中,就像std :: vector一样。我会给你一个简短的提示。你输入一个方法tick()来增加你的刻度数。你设置了一个属性nbFrames,它包含当前精灵的帧数。

int tick;
int nbFrames; //equivalent of textures.size()
std::vector<SDL_Texture*> textures;
SDL_Texture *idle_frame;
bool moving;
int x;
int y;


Sprite::Sprite()
{
  _tick = 0;
  //init your textures
  moving = false;
  x = 0;
  y = 0;
}

int _tick;

void Sprite::tick(void)
{
    // Consider that _tick can reach the Max Value of int32
   _tick++;
}

void Sprite::render(void)
{
   SDL_Texture *texture;

   if(moving)
   {
      int fr_index = _tick % nbFrames;
      texture = textures[fr_index];
   } 
   else
   {
      texture = idle_frame;
   }

   //then you do your render code with SDL_RenderCopy, or OpenGL code
   //.
   //..
}

仍然缺少一些其他的东西要处理,但这是对你的解决方案的暗示。

答案 3 :(得分:0)

您是否可能只是在if语句中进行分配而不进行测试?或者你只是错过了在这里打字?

因为如果你的代码是if(frame = 0),那么它应该是(frame == 0)。