SDL 实现雨滴屏保效果

/* 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;
}

原理是点快速移动时在人眼中的暂留,由点变成了线。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值