我正在学习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 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_image标头,链接,dll存在。可能是dll坏了吗?
我遗漏了程序的其余部分以保持简单。如果这还不够,我可以发布整个事情。
答案 0 :(得分:2)
每次调用shark
函数时,它都会加载另一个纹理副本。就像你拥有它一样,你将很快耗尽视频内存(除非你在每帧之后调用SDL_DestroyTexture
,你没有指出)。此时,您将无法再加载纹理。显然,这需要大约十五秒钟。
如果您要反复使用相同的图片,请在主循环之前加载一次。
答案 1 :(得分:0)
此行int((SDL_GetTicks()/ 100)%12);
SDL_GetTicks()返回自lib初始化(https://wiki.libsdl.org/SDL_GetTicks)以来经过的毫秒数。因此,自应用程序启动以来,您需要使用TOTAL AMOUNT OF TIME进行更新,而不是自上一帧开始以来的时间。
您应该记录最后一次的时间并使用上次更新后经过的时间来更新应用程序。
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:本杰明是对的,更新行正常。 仍然使用deltaTime是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的计数器(自启动动画以来已经过了多长时间)。
但无论如何,你的节目在那条线上没有任何问题。