我目前正在学习SDL。这是我想要了解的程序。
(我删除了很多代码,比如事件轮询,以缩短它。)
SDL_Surface* backbuffer = NULL;
bool ProgramIsRunning();
void DrawPixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b);
int main(int argc, char* args[])
{
SDL_Init(SDL_INIT_EVERYTHING);
backbuffer = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);
SDL_WM_SetCaption("Pixel Plot", NULL);
while(true)
{
for(double i = 0; i < 100; i++)
{
DrawPixel(backbuffer, rand() % 800, rand() % 600,
rand() % 255, rand() % 255, rand() % 255);
}
SDL_Flip(backbuffer);
}
SDL_Quit();
}
void DrawPixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b)
{
if(x >= surface->w || y >= surface->h)
{
return;
}
Uint32 color = SDL_MapRGB(surface->format, r, g, b);
Uint32* buffer = (Uint32*)surface->pixels + y * surface->pitch / 4 + x;
(*buffer) = color;
}
问题在于我:
buffer = (Uint32*)surface->pixels + y * surface->pitch / 4 + x;
我读了这一行,把所有这些东西,评估它,把它转换成一个32位整数的指针,(一个包含所有东西评估的32位整数的内存地址),最后给出那个内存地址缓冲。
所以缓冲区现在指向一个包含32位整数的内存地址,对吧?
现在,真正让我感到困惑的是程序只是立即用Uint32颜色覆盖该值。
那么,那么将所有这些东西投射并将其存储在缓冲区中的重点是什么?
问题线甚至会对节目产生什么影响,因为没有节目就行不通?
答案 0 :(得分:0)
这一行:
Uint32* buffer = (Uint32*)surface->pixels + y * surface->pitch / 4 + x;
定义Uint32*
类型的变量,并为其指定上述表达式的值。表达式将surface->pixels
转换为Uint32*
并为其添加偏移量。因此buffer
指向surface->pixels
内的某个位置。
这一行:
(*buffer) = color;
取消引用buffer
并将color
分配给解除引用的指针。换句话说,color
的值位于内存位置buffer
指向的位置。 buffer
未被覆盖。 buffer
指向的是什么。