C++ SDL图像在15秒后消失
我正在学习SDL,我有一个令人沮丧的问题。代码如下 即使有一个循环使程序保持活动状态,但当我加载图像并将源矩形的x值更改为动画时,加载的图像在15秒后消失。静态图像不会发生这种情况。只有动画。我肯定有一件简单的事情我错过了,但我看不见C++ SDL图像在15秒后消失,c++,visual-studio,sdl,C++,Visual Studio,Sdl,我正在学习SDL,我有一个令人沮丧的问题。代码如下 即使有一个循环使程序保持活动状态,但当我加载图像并将源矩形的x值更改为动画时,加载的图像在15秒后消失。静态图像不会发生这种情况。只有动画。我肯定有一件简单的事情我错过了,但我看不见 void update(){ rect1.x = 62 * int ( (SDL_GetTicks() / 100) % 12); /* 62 is the width of a frame, 12 is the number of frames
void update(){
rect1.x = 62 * int ( (SDL_GetTicks() / 100) % 12);
/* 62 is the width of a frame, 12 is the number of frames */
}
void shark(){
surface = IMG_Load("s1.png");
if (surface != 0){
texture = SDL_CreateTextureFromSurface(renderer,surface);
SDL_FreeSurface(surface);
}
rect1.y = 0;
rect1.h = 90;
rect1.w = 60;
rect2.x = 0;
rect2.y = 0;
rect2.h = rect1.h+30; // enlarging the image
rect2.w = rect1.w+30;
SDL_RenderCopy(renderer,texture,&rect1,&rect2);
}
void render(){
SDL_SetRenderDrawColor(renderer, 0, 0, 100, 150);
SDL_RenderPresent(renderer);
SDL_RenderClear(renderer);
}
大体上
update();
shark();
render();
包含SDL_图像头,已链接,存在dll。可能是dll坏了吗
为了保持简单,我省略了程序的其余部分。如果这还不够的话,我可以发布整个内容。这行int((SDL_GetTicks()/100)%12)
SDL_GetTicks()返回自库初始化()以来经过的毫秒数。因此,您使用的是自应用程序启动以来的总时间,而不是自上一帧以来的时间
您应该记录上次更新的次数,并根据上次更新后经过的时间更新应用程序
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:Benjamin是对的,更新行工作正常。
仍然使用deltaTime是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的计数器,以指示已过的时间(自启动动画以来)
但是无论如何,你的程序的那一行没有什么问题。这一行int((SDL_GetTicks()/100)%12)
SDL_GetTicks()返回自库初始化()以来经过的毫秒数。因此,您使用的是自应用程序启动以来的总时间,而不是自上一帧以来的时间
您应该记录上次更新的次数,并根据上次更新后经过的时间更新应用程序
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:Benjamin是对的,更新行工作正常。
仍然使用deltaTime是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的计数器,以指示已过的时间(自启动动画以来)
但是无论如何,你的程序的那一行没有什么问题。这一行int((SDL_GetTicks()/100)%12)
SDL_GetTicks()返回自库初始化()以来经过的毫秒数。因此,您使用的是自应用程序启动以来的总时间,而不是自上一帧以来的时间
您应该记录上次更新的次数,并根据上次更新后经过的时间更新应用程序
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:Benjamin是对的,更新行工作正常。
仍然使用deltaTime是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的计数器,以指示已过的时间(自启动动画以来)
但是无论如何,你的程序的那一行没有什么问题。这一行int((SDL_GetTicks()/100)%12)
SDL_GetTicks()返回自库初始化()以来经过的毫秒数。因此,您使用的是自应用程序启动以来的总时间,而不是自上一帧以来的时间
您应该记录上次更新的次数,并根据上次更新后经过的时间更新应用程序
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:Benjamin是对的,更新行工作正常。
仍然使用deltaTime是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的计数器,以指示已过的时间(自启动动画以来)
但是你的程序的那一行无论如何都没有问题。每次调用
shark
函数时,它都会加载纹理的另一个副本。有了这样的循环,视频内存很快就会用完(除非在每一帧之后调用SDL\u destronTexture
,而您没有指出这一点)。此时,您将无法再加载纹理。显然,这需要你15秒左右的时间
如果要反复使用同一图像,只需在主循环之前加载一次即可。每次调用
shark
函数时,它都会加载纹理的另一个副本。有了这样的循环,视频内存很快就会用完(除非在每一帧之后调用SDL\u destronTexture
,而您没有指出这一点)。此时,您将无法再加载纹理。显然,这需要你15秒左右的时间
如果要反复使用同一图像,只需在主循环之前加载一次即可。每次调用
shark
函数时,它都会加载纹理的另一个副本。有了这样的循环,视频内存很快就会用完(除非在每一帧之后调用SDL\u destronTexture
,而您没有指出这一点)。此时,您将无法再加载纹理。显然,这需要你15秒左右的时间
如果要反复使用同一图像,只需在主循环之前加载一次即可。每次调用
shark
函数时,它都会加载纹理的另一个副本。有了这样的循环,视频内存很快就会用完(除非在每一帧之后调用SDL\u destronTexture
,而您没有指出这一点)。此时,您将无法再加载纹理。显然,这需要你15秒左右的时间
如果要反复使用同一图像,只需在主循环之前加载一次即可。至少显示整个循环。至少显示整个循环。至少显示整个循环。至少显示整个循环。至少显示整个循环。我明白你的意思,但奇怪的是,它在固定时间后停止工作。查看Benjamin的ans