SDL 图像在 15 秒后消失
SDL image disappears after 15 seconds
我正在学习 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 header 包含,链接,dll 存在。可能是 dll 坏了?
为了简单起见,我省略了程序的其余部分。如果这还不够,我可以 post 全部。
这一行 int ( (SDL_GetTicks() / 100) % 12);
SDL_GetTicks() returns 自 lib 初始化以来经过的毫秒数 (https://wiki.libsdl.org/SDL_GetTicks)。因此,您更新的是自应用程序启动以来的总时间,而不是自上一帧以来的时间。
您应该记录上次时间并使用自上次更新以来经过的时间来更新应用程序。
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:Benjamin 是对的,更新行工作正常。
仍然使用 deltaTime 是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的时间计数器(自开始动画以来)。
但是无论如何,您的程序的那一行没有任何问题。
每次调用 shark
函数时,它都会加载另一个纹理副本。在一个循环中,就像你拥有它一样,你将 运行 很快用完视频内存(除非你在每一帧之后调用 SDL_DestroyTexture
,你没有指出)。此时,您将无法再加载纹理。显然这对你来说大约需要十五秒。
如果您要反复使用同一张图片,那么只需在主循环之前加载一次即可。
我正在学习 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 header 包含,链接,dll 存在。可能是 dll 坏了?
为了简单起见,我省略了程序的其余部分。如果这还不够,我可以 post 全部。
这一行 int ( (SDL_GetTicks() / 100) % 12);
SDL_GetTicks() returns 自 lib 初始化以来经过的毫秒数 (https://wiki.libsdl.org/SDL_GetTicks)。因此,您更新的是自应用程序启动以来的总时间,而不是自上一帧以来的时间。
您应该记录上次时间并使用自上次更新以来经过的时间来更新应用程序。
Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously
update( deltaTime );
shark();
render();
编辑:Benjamin 是对的,更新行工作正常。 仍然使用 deltaTime 是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的时间计数器(自开始动画以来)。
但是无论如何,您的程序的那一行没有任何问题。
每次调用 shark
函数时,它都会加载另一个纹理副本。在一个循环中,就像你拥有它一样,你将 运行 很快用完视频内存(除非你在每一帧之后调用 SDL_DestroyTexture
,你没有指出)。此时,您将无法再加载纹理。显然这对你来说大约需要十五秒。
如果您要反复使用同一张图片,那么只需在主循环之前加载一次即可。