2015-10-15 106 views
0

我需要创建一个窗口,并用一种​​颜色填充其所有像素。这不应该太难,但一个小时左右后,我仍然无法正常工作。这是我的代码,因为它看起来现在:SDL2像素操作

#include <SDL2/SDL.h> 

int main(int argc, char** argv) 
{ 
    enum { 
     WIDTH = 640, 
     HEIGHT = 480 
    }; 
    SDL_Window* window = SDL_CreateWindow(
     "SDL test", 
     SDL_WINDOWPOS_CENTERED, 
     SDL_WINDOWPOS_CENTERED, 
     WIDTH, 
     HEIGHT, 
     SDL_WINDOW_SHOWN 
    ); 
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    SDL_Texture* texture = SDL_CreateTexture(renderer, 
     SDL_PIXELFORMAT_RGBA8888, 
     SDL_TEXTUREACCESS_STREAMING, 
     WIDTH, 
     HEIGHT 
    ); 
    SDL_Surface* surface = SDL_CreateRGBSurface(
     0, 
     WIDTH, 
     HEIGHT, 
     32, 
     0x00000000, 
     0x00000000, 
     0x00000000, 
     0xff000000 
    ); 
    Uint32 gray = SDL_MapRGBA(surface->format, 0x1E, 0x1E, 0x1E, 0xFF); 
    Uint32 red = SDL_MapRGBA(surface->format, 0xFA, 0x32, 0x32, 0xFF); 

    int i, j; 
    Uint32* pixels32 = (Uint32*) surface->pixels; 
    for (i = 0; i < HEIGHT; ++i) 
    { 
     for (j = 0; j < WIDTH; ++j) 
     { 
      pixels32[i * WIDTH + j] = j%10 ? gray : red; 
     } 
    } 
    SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch); 

    SDL_RenderPresent(renderer); 

    int quit = 0; 
    SDL_Event event; 
    while (!quit) 
    { 
     while (SDL_PollEvent(&event) != 0) 
     { 
      if (event.type == SDL_QUIT) 
       quit = 1; 
     } 
    } 
    SDL_FreeSurface(surface); 
    SDL_DestroyRenderer(renderer); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 

    return 0; 
} 

但它显示一个白色的窗口。我究竟做错了什么?

+1

当您处于程序的关闭阶段时,为什么要“SDL_RenderPresent”? – 2015-10-15 20:42:50

+0

@Rhymoid哦,这是一个错误,当我想移动'SDL_FreeSurface'函数时,我也移动了它。现在我看到一个黑色的窗户,太棒了。 – klenium

+1

至少它是不同的颜色。现在,您是否尝试过使用['SDL_RenderCopy'](https://wiki.libsdl.org/SDL_RenderCopy)(或其-Ex变体)实际上将纹理图案贴到表面上? – 2015-10-15 22:52:10

回答

0

您创建了一个纹理,但尚未绘制。为了将其绘制在表面上,您仍然需要拨打SDL_RenderCopy