【问题标题】:How do I set up an if statement to animate a sprite?如何设置 if 语句来为精灵设置动画?
【发布时间】:2014-03-10 04:15:14
【问题描述】:

我如何设置一个 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++;

无论我应用什么修改,它都停留在一个帧上。

【问题讨论】:

  • 如果不知道您已经完成了什么,我们将无法为您提供帮助。请张贴代码。
  • 循环可能会有所帮助。例如 while.
  • @PawełStawarz 完成并完成。
  • static int frame4 = 1; 所以下次调用函数时它会保持其值。

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


【解决方案1】:

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

/*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*/
}

那么每当程序应该停止你刚刚设置的动画时 shouldbeanimating 为 false

【讨论】:

    【解决方案2】:

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

    举个例子

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

    【讨论】:

      【解决方案3】:

      它们有很多解决方案。您可以创建一个 Sprite 类并添加一个属性 _tick,将您的纹理存储到一个容器中,例如 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
         //.
         //..
      }
      

      仍然缺少一些其他需要处理的事情,但这是您解决方案的提示。

      【讨论】:

      • 如果您想要更完整的解决方案,我可以给您一个指向我的 GitHub 存储库的一些源代码的链接。
      • 是的,请!我尝试实现您的数据,但它仍然只显示一帧。
      • github.com/jordsti/stiuniverse/tree/master/StiGame ,浏览这个文件夹,你会看到我写的一些处理精灵的类。
      【解决方案4】:

      您是否可能只是在 if 语句中分配而不是测试?还是您只是错过了在这里输入的内容?

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

      【讨论】:

      • 是的,我解决了,但是因为问了这么简单的问题而失去了提问的能力。
      猜你喜欢
      • 2010-11-10
      • 2011-02-10
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多