SDL2_gfx功能不起作用

时间:2015-10-16 16:10:08

标签: c sdl

我正在尝试使用带有SDL2_gfx库的SDL2在屏幕上绘制一些图形基元。但不知何故,SDL2_gfx函数似乎无法正常工作。以下代码应该在白色背景上绘制一个简单的绿色填充矩形

#include <SDL2/SDL.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define SCREENW 1366
#define SCREENH 768

SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;

bool init_SDL() {
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("SDL could not initialize! SDL Error: %s\n",SDL_GetError());
        return false;
    }
    window = SDL_CreateWindow("SDL_gfx_Test",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,SCREENW,SCREENH,SDL_WINDOW_SHOWN);
    if(window == NULL) {
        printf("Window could not be created! SDL Error: %s\n",SDL_GetError());
        return false;
    }
    renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
    if(renderer == NULL) {
        printf("Renderer could not be created! SDL Error: %s\n",SDL_GetError());
        return false;
    }
    if(SDL_SetRenderDrawColor(renderer,0xFF,0xFF,0xFF,0xFF) < 0) {
        printf("Renderer color could not be set! SDL Error: %s\n",SDL_GetError());
        return false;
    }
    return true;
}

void close_SDL() {
    SDL_DestroyRenderer(renderer);
    renderer = NULL;
    SDL_DestroyWindow(window);
    window = NULL;
    SDL_Quit();
}

int main(int argc,char *argv[]) {
    Sint16 topRightX = 100; 
    Sint16 topRightY = 100; 
    Sint16 bottomLeftX = 300;
    Sint16 bottomLeftY = 300; 
    Uint32 green = 0x00FF00FF;

    if(!init_SDL()) {
        exit(EXIT_FAILURE);
    }
    SDL_RenderClear(renderer);
    if(boxColor(renderer,topRightX,topRightY,bottomLeftX,bottomLeftY,green) < 0) {
       printf("Could not draw box to renderer!\n");
       exit(EXIT_FAILURE);
    }

    SDL_RenderPresent(renderer);
    SDL_Delay(3000);
    close_SDL();
    exit(EXIT_SUCCESS);
}

我使用命令

编译了代码
gcc -g3 -o sdl_gfx_test sdl_gfx_test.c `sdl2-config --cflags --libs` -lSDL2_gfx

在Ubuntu 14.04上

没有编译器错误或警告,也没有链接器错误。但是,屏幕上不显示绿色矩形。由于SDL_RenderClear(),仅显示白色背景。我检查了我的代码十几次,但我找不到任何缺陷。有谁知道为什么boxColor()不能完成他的工作?

1 个答案:

答案 0 :(得分:1)

根据the documentation,您的代码是正确的。但是,如果您按照指定的代码链接进行操作,则可以看到boxColor并未完全按照其说法执行操作:

int boxColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)
{
         Uint8 *c = (Uint8 *)&color; 
         return boxRGBA(renderer, x1, y1, x2, y2, c[0], c[1], c[2], c[3]);
}

在小端系统上,32位整数首先具有最低有效字节,因此使用颜色0xRRGGBBAAc[0]为AA,c[1]为BB,c[2]是GG,c[3]是RR。

您的程序实际上显示的是透明框。

您可以使用带有单独RGBA参数的函数来避免此问题。