如何修改此代码以使背景闪光具有不同的颜色?或类似的东西。当前,它以黑色背景和彩色线条打印。我想这可能与SDL_SetRenderDrawColour函数有关。
#include "neillsdl2.h"
void Neill_SDL_Init(SDL_Simplewin *sw)
{
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
ON_ERROR("Unable to initialize SDL");
}
sw->finished = 0;
sw->win= SDL_CreateWindow("SDL Window",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
WWIDTH, WHEIGHT,
SDL_WINDOW_SHOWN);
if(sw->win == NULL){
ON_ERROR("Unable to initialize SDL Window");
}
sw->renderer = SDL_CreateRenderer(sw->win, -1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
if(sw->renderer == NULL){
ON_ERROR("Unable to initialize SDL Renderer");
}
SDL_SetRenderDrawBlendMode(sw->renderer,SDL_BLENDMODE_BLEND);
/* Create texture for display */
sw->display = SDL_CreateTexture(sw->renderer, SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET, WWIDTH, WHEIGHT);
if(sw->display == NULL){
ON_ERROR("Unable to initialize SDL texture");
}
SDL_SetRenderTarget(sw->renderer, sw->display);
/* Clear screen, & set draw colour to black */
SDL_SetRenderDrawColor(sw->renderer, 0, 0, 0, 255);
SDL_RenderClear(sw->renderer);
}
/* Housekeeping to do with the render buffer & updating the screen */
void Neill_SDL_UpdateScreen(SDL_Simplewin *sw)
{
SDL_SetRenderTarget(sw->renderer, NULL);
SDL_RenderCopy(sw->renderer, sw->display, NULL, NULL);
SDL_RenderPresent(sw->renderer);
SDL_SetRenderTarget(sw->renderer, sw->display);
}
/* Gobble all events & ignore most */
void Neill_SDL_Events(SDL_Simplewin *sw)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch (event.type){
case SDL_QUIT:
case SDL_MOUSEBUTTONDOWN:
case SDL_KEYDOWN:
sw->finished = 1;
}
}
}
/* Trivial wrapper to avoid complexities of renderer & alpha channels */
void Neill_SDL_SetDrawColour(SDL_Simplewin *sw, Uint8 r, Uint8 g, Uint8 b)
{
SDL_SetRenderDrawColor(sw->renderer, r, g, b, SDL_ALPHA_OPAQUE);
}
/* Filled Circle centred at (cx,cy) of radius r, see :
http://content.gpwiki.org/index.php/SDL:Tutorials:Drawing_and_Filling_Circles */
void Neill_SDL_RenderFillCircle(SDL_Renderer *rend, int cx, int cy, int r)
{
double dy;
for (dy = 1; dy <= r; dy += 1.0) {
double dx = floor(sqrt((2.0 * r * dy) - (dy * dy)));
SDL_RenderDrawLine(rend, cx-dx, cy+r-dy, cx+dx, cy+r-dy);
SDL_RenderDrawLine(rend, cx-dx, cy-r+dy, cx+dx, cy-r+dy);
}
}
/* Circle centred at (cx,cy) of radius r, see :
http://content.gpwiki.org/index.php/SDL:Tutorials:Drawing_and_Filling_Circles */
void Neill_SDL_RenderDrawCircle(SDL_Renderer *rend, int cx, int cy, int r)
{
double dx, dy;
dx = floor(sqrt((2.0 * r ) ));
SDL_RenderDrawLine(rend, cx-dx, cy+r, cx+dx, cy+r);
SDL_RenderDrawLine(rend, cx-dx, cy-r, cx+dx, cy-r);
for (dy = 1; dy <= r; dy += 1.0) {
dx = floor(sqrt((2.0 * r * dy) - (dy * dy)));
SDL_RenderDrawPoint(rend, cx+dx, cy+r-dy);
SDL_RenderDrawPoint(rend, cx+dx, cy-r+dy);
SDL_RenderDrawPoint(rend, cx-dx, cy+r-dy);
SDL_RenderDrawPoint(rend, cx-dx, cy-r+dy);
}
}
void Neill_SDL_DrawString(SDL_Simplewin *sw, fntrow fontdata[FNTCHARS][FNTHEIGHT],
char *str, int ox, int oy)
{
int i=0;
unsigned char chr;
do{
chr = str[i++];
Neill_SDL_DrawChar(sw, fontdata, chr, ox+i*FNTWIDTH, oy);
}while(str[i]);
}
void Neill_SDL_DrawChar(SDL_Simplewin *sw,
fntrow fontdata[FNTCHARS][FNTHEIGHT],
unsigned char chr, int ox, int oy)
{
unsigned x, y;
for(y = 0; y < FNTHEIGHT; y++){
for(x = 0; x < FNTWIDTH; x++){
if(fontdata[chr-FNT1STCHAR][y] >> (FNTWIDTH - 1 - x) & 1){
Neill_SDL_SetDrawColour(sw, 255, 255, 255);
SDL_RenderDrawPoint(sw->renderer, x + ox, y+oy);
}
else{
Neill_SDL_SetDrawColour(sw, 0, 0, 0);
SDL_RenderDrawPoint(sw->renderer, x + ox, y+oy);
}
}
}
}
void Neill_SDL_ReadFont(fntrow fontdata[FNTCHARS][FNTHEIGHT], char *fname)
{
FILE *fp = fopen(fname, "rb");
size_t itms;
if(!fp){
fprintf(stderr, "Can't open Font file %s\n", fname);
exit(1);
}
itms = fread(fontdata, sizeof(fntrow), FNTCHARS*FNTHEIGHT, fp);
if(itms != FNTCHARS*FNTHEIGHT){
fprintf(stderr, "Can't read all Font file %s (%d) \n", fname, (int)itms);
exit(1);
}
fclose(fp);
}