我有一个项目需要使用SDL在屏幕上绘制像素。我已经提供了一些代码:
int render_screen(SDL_Surface* screen)
{
pixel pixel_white;
pixel_white.r = (Uint8)0xff;
pixel_white.g = (Uint8)0xff;
pixel_white.b = (Uint8)0xff;
pixel_white.alpha = (Uint8)128;
SDL_LockSurface(screen);
/*do your rendering here*/
/*----------------------*/
SDL_UnlockSurface(screen);
/*flip buffers*/
SDL_Flip(screen);
clear_screen(screen);
return 0;
}
此功能:
void put_pixel(SDL_Surface* screen,int x,int y,pixel* p)
{
Uint32* p_screen = (Uint32*)screen->pixels;
p_screen += y*screen->w+x;
*p_screen = SDL_MapRGBA(screen->format,p->r,p->g,p->b,p->alpha);
}
这段代码中有很多东西我真的不明白。首先,我假设我的想法是我应该在render_screen函数中调用函数put_pixel,但是使用什么参数? put_pixel(SDL_Surface * screen,int x,int y,pixel * p)行似乎很复杂。如果x和y是函数draw参数,为什么它们会在函数indata中声明?我应该使用put_pixel(something,x,y,something2)命令调用put_pixel。如果我使用说x = 56和y = 567,那么当他们在胃肠炎中宣布时,他们不会重置为0吗?我应该把东西和东西放在什么地方才能使它发挥作用?
答案 0 :(得分:2)
尝试:
SDL_LockSurface(screen);
put_pixel(screen,56,567,&pixel_white);
SDL_UnlockSurface(screen);
正如已经提到过的,也许花时间学习更多的C语言。特别是,考虑到你的问题,你可以专注于函数参数和指针。
答案 1 :(得分:0)
形式参数SDL_Surface *screen
只是指向SDL_Surface结构的指针,在您的情况下,您可能会关注SDL_SetVideoMode()
返回的结构。
pixel *p
是指向像素类型结构的指针,如下所示。
typedef struct {
Uint8 r;
Uint8 g;
Uint8 b;
Uint8 alpha;
} pixel;
而不是使用screen-> w,建议使用pitch来计算基本指针的字节偏移量,这是表面扫描线的长度(以字节为单位)。
而不是
Uint32* p_screen = (Uint32*)screen->pixels;
p_screen += y*screen->w+x;
*p_screen = SDL_MapRGBA(screen->format,p->r,p->g,p->b,p->alpha);
尝试使用:
/* Get a pointer to the video surface's pixels in memory. */
Uint32 *pixels = (Uint32*) screen->pixels;
/* Calculate offset to the location we wish to write to */
int offset = (screen->pitch / sizeof(Uint32)) * y + x;
/* Compose RGBA values into correct format for video surface and copy to screen */
*(pixels + offset) = SDL_MapRGBA(screen->format, p->r, p->g, p->b, p->alpha);