关于创建贴图失败(新人提问)
sdl吧
全部回复
仅看楼主
level 5
今天试写了个sdl的简单程序,其中用了个CreateTextureFromSurface(),可是Texture死活创建不了,其实就是一个非常小、非常简单的程序,实在看不出有啥错。
我先简单描述下这个小程序的套路,首先声明窗口、渲染器、表面、贴图的几个空指针,然后创建窗口、渲染器,再用IMG_Load建了个表面,经程序反馈信息,这个表面是创建成功的,然后就用这个表面来生成贴图,然而就在这一步跪了……,根据反馈,这个贴图的值是NULL的(老是NULL),也就是创建失败~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~有没有大神知道,像这种情况,有哪些可能会导致贴图创建失败,求科普,求解答(翻了很多资料,还是没搞清楚,只好求助)
2017年04月16日 09点04分 1
level 5
#include "SDL.h"
#include "SDL_image.h"
#include "stdio.h"
SDL_Window *win = NULL;
SDL_Renderer *ren = NULL;
SDL_Texture *tex = NULL;
SDL_Surface *sur = NULL;
SDL_Event event;
SDL_Rect src={34,0,34,48};
SDL_Rect dst={50,50,34,48};
char quit = 0;
char stop = 1;
int flag = 0;
2017年04月16日 12点04分 3
level 5
void Destroy(void)
{
SDL_FreeSurface(sur);
SDL_DestroyTexture(tex);
SDL_DestroyWindow(win);
SDL_DestroyRenderer(ren);
IMG_Quit();
SDL_Quit();
}
int Init(SDL_Window *window,SDL_Renderer *renderer)
{
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
return -1;
IMG_Init(IMG_INIT_PNG);
window = SDL_CreateWindow("GAME",300,300,200,200,SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
if((window == NULL) || (renderer == NULL))
return -1;
return 0;
}
2017年04月16日 12点04分 4
level 5
int CheckKey(void)
{
while(quit == 0)
{
while(SDL_PollEvent(&event) != 0)
{
if(event.type == SDL_KEYDOWN)
{
switch(event.key.keysym.sym)
{
case SDLK_UP:{dst.y-=5;flag = 1;stop = 0;break;}
case SDLK_DOWN:{dst.y+=5;flag = 2;stop = 0;break;}
case SDLK_LEFT:{dst.x-=5;flag = 3;stop = 0;break;}
case SDLK_RIGHT:{dst.x+=5;flag = 4;stop = 0;break;}
case SDLK_ESCAPE:{quit = 1;break;}
default:break;
}
}
if(event.type == SDL_KEYUP)
{
stop = 0;
}
}
}
return 0;
}
2017年04月16日 12点04分 5
level 5
int main(int args,char *argv[])
{
if(Init(win,ren) != 0)
return -1;
//WINsur = SDL_GetWindowSurface(win);
sur = IMG_Load("001.png");
//NEWsur = SDL_ConvertSurface(sur,WINsur->format,0);
tex = SDL_CreateTextureFromSurface(ren,sur);
if(sur == NULL)
{
printf("Surface Create failed!");
SDL_Delay(3000);
return -1;
}
if(tex == 0)//主要问题在这里
{
printf("Texture Create failed!");
SDL_Delay(3000);
return -1;
}
2017年04月16日 12点04分 6
问题在这个地方,为方便大神检查,我一口气把代码都贴上来了
2017年04月16日 12点04分
level 5
win = SDL_GetKeyboardFocus();
CheckKey();
int j;
if(flag == 1 && stop == 0)
{
src.y = 144;
for(j = 0;j<3;j++)
{
SDL_RenderClear(ren);
SDL_RenderCopy(ren,tex,&src,&dst);
SDL_RenderPresent(ren);
SDL_Delay(200);
src.x += 34;
}
src.x = 34;
}
if(flag == 2 && stop == 0)
{
src.y = 0;
for(j = 0;j<3;j++)
{
SDL_RenderClear(ren);
SDL_RenderCopy(ren,tex,&src,&dst);
SDL_RenderPresent(ren);
SDL_Delay(1000);
src.x += 34;
}
src.x = 34;
}
if(flag == 3 && stop == 0)
{
src.y = 48;
for(j = 0;j<3;j++)
{
SDL_RenderClear(ren);
SDL_RenderCopy(ren,tex,&src,&dst);
SDL_RenderPresent(ren);
SDL_Delay(200);
src.x += 34;
}
src.x = 34;
}
if(flag == 4 && stop == 0)
{
src.y = 96;
for(j = 0;j<3;j++)
{
SDL_RenderClear(ren);
SDL_RenderCopy(ren,tex,&src,&dst);
SDL_RenderPresent(ren);
SDL_Delay(200);
src.x += 34;
}
src.x = 34;
}
Destroy();
return 0;
}
2017年04月16日 12点04分 7
level 5
就这么个程序,出问题的地方已注出
2017年04月16日 12点04分 8
level 13
surface不是空,SDL_CreateTexture却创建失败,
你在tex == 0
{
//这里添加
printf("%s", SDL_GetError());
}
看具体是什么错误
2017年04月16日 13点04分 10
错误是:invalid renderer
2017年04月16日 14点04分
level 5
还真是renderer有问题,好吧,搞了半天是自己自以为是了,这个Init函数不能这样写,c语言基础不扎实,真是麻烦各位了
2017年04月16日 15点04分 11
level 5
int Init(void)
{
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
return -1;
IMG_Init(IMG_INIT_PNG);
win = SDL_CreateWindow("GAME",300,300,200,200,SDL_WINDOW_SHOWN);
ren = SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED);
if((win == NULL) || (ren == NULL))
return -1;
return 0;
}
2017年04月16日 15点04分 12
确实 改成这样就没问题了
2017年04月16日 15点04分
level 13
win 和ren是指针,默认指向空或者无效区间,应该是init(&win,&ren)去获取指针的地址,如果这个不好理解的话就用全局变量吧
2017年04月16日 23点04分 13
嗯,确实容易迷糊,我一顺手就这样写了,结果纠结半天,愣是没看出来
2017年04月17日 03点04分
2017年04月17日 05点04分
1