| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #include <stdio.h>
- #include <SDL.h>
- #include <SDL_image.h> //这里直接使用SDL_image库,可以加载如.jpg .png等各种格式的图片
- //使用OutputDebugString
- #include "atlbase.h"
- #include "atlstr.h"
- // 定义窗口宽高
- const int SCREEN_WIDTH = 640;
- const int SCREEN_HEIGHT = 480;
- SDL_Window *g_pWindow = NULL;
- SDL_Renderer *g_pRenderer = NULL;
- SDL_Texture *g_pTexture = NULL;
- //=========================================================
- //函数名称:Init
- //说明:完成SDL初始化、创建窗口等
- //=========================================================
- bool Init()
- {
- //(1)初始化所有SDL的各模块
- if (SDL_Init(SDL_INIT_VIDEO) < 0) //这里可以初始化SDL的各种模块,包括定时器,视频,音频、摇杆等
- //实际项目中一般只初始化要用到的模块即可;成功返回0
- //具体有哪些模块可以通过在SDL_INIT_VIDEO上点击右键-转到定义来查看
- {
- printf("Unable to Init SDL: %s", SDL_GetError()); //调用SDL_GetError()来查看失败原因
- return false;
- }
- //(2)使用SDL创建窗口
- g_pWindow = SDL_CreateWindow("Chapter 1: Hello World!", SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
- if (g_pWindow == NULL)
- {
- printf("Unable to Create Window: %s", SDL_GetError());
- return false;
- }
- //(3)初始化渲染器(renderer),用于在窗口绘图
- g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
- if (g_pRenderer == NULL)
- {
- printf("Unable to Create Renderer: %s", SDL_GetError());
- return false;
- }
- return true;
- }
- //=========================================================
- //函数名称:LoadImage
- //说明:加载图片
- //=========================================================
- bool LoadImage(const char* filename)
- {
- const char *error;
- if (filename == NULL)
- {
- printf("LoadImage() error: filename is NULL!\n");
- return false;
- }
- SDL_Surface *pTempSurface = IMG_Load(filename); //加载启动图像(splash image)到SDL_Surface对象
- if (pTempSurface == NULL)
- {
- error = SDL_GetError();
- printf("Unable to load image! SDL Error: %s\n", SDL_GetError());
- return false;
- }
- g_pTexture = SDL_CreateTextureFromSurface(g_pRenderer, pTempSurface); //使用SDL_Surface对象创建纹理(texture)
- if (g_pTexture == NULL)
- {
- printf("Unable222 to create texture from surface! SDL Error: %s\n", SDL_GetError());
- return false;
- }
- SDL_FreeSurface(pTempSurface); //回收surface对象占用的内存空间
- return true;
- }
- //=========================================================
- //函数名称:Close
- //说明:销毁各对象
- //=========================================================
- void Close()
- {
- //销毁窗口对象
- SDL_DestroyWindow(g_pWindow);
- g_pWindow = NULL;
- //销毁渲染器对象
- SDL_DestroyRenderer(g_pRenderer);
- g_pRenderer = NULL;
- //销毁纹理对象
- SDL_DestroyTexture(g_pTexture);
- g_pTexture = NULL;
- //清除所有已初始化的子系统。在程序结束时调用。
- SDL_Quit();
- }
- //=========================================================
- //函数名称:main
- //说明:主函数
- //=========================================================
- int main(int argc, char* argv[]) //注意这里必须在main的括号内加上int argc, char* argv[]否则报错"LNK2019无法解析的外部符号 _SDL_main"
- {
- //Step1:初始化SDL
- if (!Init())
- {
- printf("Failed to Init!\n");
- return -1;
- }
- //Step2:加载图片
- if (!LoadImage("D:\\Work\\SDLHelloWorld\\Debug\\helloworld.jpg"))
- {
- printf("Failed to load media!\n");
- return -2;
- }
- SDL_SetRenderDrawColor(g_pRenderer, 255, 255, 255, 0); //设置渲染器的颜色,第一个参数传入渲染器对象
- //接下来依次是R、G、B值和Alpha值
- //Step3:绘制图片三板斧
- SDL_RenderClear(g_pRenderer); //使用某种绘图颜色来“清除”当前窗口
- SDL_RenderCopy(g_pRenderer, g_pTexture, NULL, NULL); //将纹理复制到渲染器中;最后两个参数的使用详见下一篇教程
- SDL_RenderPresent(g_pRenderer); //将渲染器中的内容在窗口中显示出来
- OutputDebugString("Failed to load media!\n");
- SDL_Delay(3000); //在程序结束之前延迟一段时间,以便观察窗口;实际项目中慎用!
- //Step4:释放内存资源并关闭SDL
- Close();
- return 0;
- }
|