使用C中的SDL在屏幕上绘制像素

时间:2013-09-21 19:08:49

标签: c sdl

我有一个项目需要使用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吗?我应该把东西和东西放在什么地方才能使它发挥作用?

2 个答案:

答案 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);