1

我有一个项目,我需要使用 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 是函数绘制参数,为什么它们会在函数 indata 中声明?我应该使用命令 put_pixel(something,x,y,something2) 调用 put_pixel。如果我使用 x=56 和 y=567,当在 parentesis 中声明时它们不是重置为 0 吗?我应该放什么东西和东西2来使它工作?

4

2 回答 2

3

尝试:

SDL_LockSurface(screen);
put_pixel(screen,56,567,&pixel_white);
SDL_UnlockSurface(screen);

正如已经提到的,也许花点时间多学习一点 C 语言。特别是,考虑到您的问题,您可能会专注于函数参数和指针。

于 2013-09-21T19:16:45.223 回答
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);     
于 2015-04-09T09:52:03.207 回答