如何在每一帧之后设置一个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++;
无论我应用什么修改,它都会卡在一帧上。
答案 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)。