• SDL多线程显示更新窗口


    //初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色
    #include <iostream>
    extern "C"
    {
    #include <SDL.h>
    }
    
    //Refresh Event
    #define REFRESH_EVENT	(SDL_USEREVENT + 1)
    #define BREAK_EVENT		(SDL_USEREVENT + 2)
    
    bool thread_exit = false;
    
    int threadFunc(void *opaque)
    {
    	thread_exit = false;
    	while (!thread_exit)
    	{
    		SDL_Event event;
    		event.type = REFRESH_EVENT;
    		SDL_PushEvent(&event);
    		SDL_Delay(40);
    	}
    	thread_exit = true;
    	//Break  
    	SDL_Event event;
    	event.type = BREAK_EVENT;
    	//发送一个事件
    	SDL_PushEvent(&event);
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	SDL_Window *windowScreen = NULL;	//窗口
    	SDL_Surface *windowSurface = NULL;//窗口表面
    	SDL_Thread *refresh_thread;		//SDL线程
    	SDL_Event event;					//SDL事件
    	
    	//初始化SDL2
    	if (SDL_Init(SDL_INIT_VIDEO) == -1)
    	{
    		std::cout << SDL_GetError() << std::endl;
    		return -1;
    	}
    
    	/* 创建窗口
    	*第一个参数是窗口的标题
    	*第二、三个参数指明了窗口的位置信息
    	*第四、五个参数是窗口的大小(宽、高)
    	*第六个参数是窗口的状态
    	*SDL_WINDOW_SHOWN--显示窗口
    	*SDL_WINDOW_BORDERLESS--显示无边框窗口
    	*/
    	windowScreen = SDL_CreateWindow("title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 240, 400, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
    	if (!windowScreen)
    	{
    		std::cout << SDL_GetError() << std::endl;
    		return -1;
    	}
    	
    	//创建线程
    	refresh_thread = SDL_CreateThread(threadFunc, NULL, NULL);
    	if (refresh_thread == NULL)
    	{
    		std::cout << SDL_GetError() << std::endl;
    		return -1;
    	}
    
    	//事件(消息)循环
    	while (true)
    	{
    		//等待一个事件(类似于WIN32里的GetMessage)
    		SDL_WaitEvent(&event);
    		if (event.type == REFRESH_EVENT)
    		{
    			/*填充窗口
    			*第一个参数是填充的目标表面
    			*第二个是填充的矩形区域(NULL则表示默认全部填充)
    			*第三个参数是填充矩形用的颜色
    			*/
    			SDL_FillRect(windowSurface, NULL, SDL_MapRGB(windowSurface->format, 0xFF, 0x00, 0x00));
    			
    			//将窗口表面加载到窗口
    			SDL_UpdateWindowSurface(windowScreen);
    		}
    		else if (event.type == SDL_QUIT)
    		{
    			thread_exit = true;
    		}
    		else if (event.type == SDL_WINDOWEVENT)
    		{
    			// 获取窗口的表面
    			windowSurface = SDL_GetWindowSurface(windowScreen);
    			if (!windowSurface)
    			{
    				std::cout << SDL_GetError() << std::endl;
    				return -1;
    			}
    		}
    		else if (event.type == BREAK_EVENT)
    		{
    			break;
    		}
    	}
    
    	SDL_FreeSurface(windowSurface);
    	SDL_DestroyWindow(windowScreen);
    	SDL_Quit();
    	return 0;
    }
    
    
    
    
    /*配置
    1.VC++目录 include lib dll
    2.链接器->输入->附加依赖项 SDL2.lib SDL2main.lib
    3.链接器->系统->子系统  窗口 (/SUBSYSTEM:WINDOWS)  控制台 (/SUBSYSTEM:CONSOLE)
    4.C++->代码生成->运行库 /MD
    编译
    cl /MD /c c.cpp
    链接
    link /SUBSYSTEM:CONSOLE c.obj SDL2.lib SDL2main.lib
    */
    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    高速排序
    [小米] 并查集
    Mysql5.7新特性
    双链表删除/插入节点
    【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
    Repractise基础篇:Web应用开发七日谈
    [leetcode] Palindrome Number(不使用额外空间)
    SpringFox 初体验
    用RegularJS开发小程序 — mpregular解析
    MySQL Group Replication数据安全性保障
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834650.html
Copyright © 2020-2023  润新知