/* SDL2.0 - Rain 3.0 */
#include <SDL.h>
#include <stdlib.h>
#define WINDOW_WIDTH 1920
#define WINDOW_HIGH 1024
#define POINT_NUM 1024
typedef struct Rain {
int x, y;
int r;
int speed;
} Spot;
void movSpot(Spot * spot, SDL_Texture * circle)
{
spot->y = spot->y + spot->speed;
if (spot->y > WINDOW_HIGH)
spot->y = 0;
}
void drawSpot(Spot * spot, SDL_Renderer * rend, SDL_Texture * circle)
{
SDL_Rect rect;
rect.x = spot->x;
rect.y = spot->y;
rect.w = spot->r;
rect.h = spot->r;
SDL_RenderCopy(rend, circle, NULL, &rect);
}
void initSpot(Spot * spot)
{
spot->x = rand() % WINDOW_WIDTH;
spot->y = rand() % WINDOW_HIGH;
spot->r = rand() % 3 + 1;
spot->speed = rand() % 4 + 2;
}
int main(int argc, char *argv[])
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
exit(1);
SDL_Window *window = SDL_CreateWindow("Rain 3.0", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
WINDOW_WIDTH, WINDOW_HIGH, SDL_WINDOW_FULLSCREEN_DESKTOP);
if (window == NULL)
exit(1);
SDL_Renderer * rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Surface * blackSurface = SDL_LoadBMP("point.bmp");
SDL_Surface * circleSurface = SDL_LoadBMP("circle.bmp");
SDL_SetColorKey(circleSurface, SDL_TRUE, SDL_MapRGB(circleSurface->format, 195, 195, 195));
SDL_Texture * black = SDL_CreateTextureFromSurface(rend, blackSurface);
SDL_Texture * circle = SDL_CreateTextureFromSurface(rend, circleSurface);
SDL_SetTextureBlendMode(circle, SDL_BLENDMODE_BLEND);
SDL_SetTextureBlendMode(black, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(black, 255);
SDL_SetTextureAlphaMod(circle, 255);
SDL_SetTextureColorMod(circle, 0, 164, 232);
SDL_Rect rectWindow;
rectWindow.x = 0;
rectWindow.y = 0;
rectWindow.w = WINDOW_WIDTH;
rectWindow.h = WINDOW_HIGH;
int i;
Spot spots[POINT_NUM];
for (i = 0; i < POINT_NUM; i++)
initSpot(&spots[i]);
int done = 0;
SDL_Event event;
while (!done)
{
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
done = 1;
else if (event.type == SDL_MOUSEBUTTONDOWN)
done = 1;
}
SDL_RenderClear(rend);
SDL_RenderCopy(rend, black, NULL, &rectWindow);
for (i = 0; i < POINT_NUM; i++)
{
drawSpot(&spots[i], rend, circle);
movSpot(&spots[i], circle);
}
SDL_RenderPresent(rend);
SDL_Delay(5);
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
原理是点快速移动时在人眼中的暂留,由点变成了线。