main.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include <stdio.h>
  2. #include <SDL.h>
  3. #include <SDL_image.h> //这里直接使用SDL_image库,可以加载如.jpg .png等各种格式的图片
  4. //使用OutputDebugString
  5. #include "atlbase.h"
  6. #include "atlstr.h"
  7. // 定义窗口宽高
  8. const int SCREEN_WIDTH = 640;
  9. const int SCREEN_HEIGHT = 480;
  10. SDL_Window *g_pWindow = NULL;
  11. SDL_Renderer *g_pRenderer = NULL;
  12. SDL_Texture *g_pTexture = NULL;
  13. //=========================================================
  14. //函数名称:Init
  15. //说明:完成SDL初始化、创建窗口等
  16. //=========================================================
  17. bool Init()
  18. {
  19. //(1)初始化所有SDL的各模块
  20. if (SDL_Init(SDL_INIT_VIDEO) < 0) //这里可以初始化SDL的各种模块,包括定时器,视频,音频、摇杆等
  21. //实际项目中一般只初始化要用到的模块即可;成功返回0
  22. //具体有哪些模块可以通过在SDL_INIT_VIDEO上点击右键-转到定义来查看
  23. {
  24. printf("Unable to Init SDL: %s", SDL_GetError()); //调用SDL_GetError()来查看失败原因
  25. return false;
  26. }
  27. //(2)使用SDL创建窗口
  28. g_pWindow = SDL_CreateWindow("Chapter 1: Hello World!", SDL_WINDOWPOS_CENTERED,
  29. SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
  30. if (g_pWindow == NULL)
  31. {
  32. printf("Unable to Create Window: %s", SDL_GetError());
  33. return false;
  34. }
  35. //(3)初始化渲染器(renderer),用于在窗口绘图
  36. g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
  37. if (g_pRenderer == NULL)
  38. {
  39. printf("Unable to Create Renderer: %s", SDL_GetError());
  40. return false;
  41. }
  42. return true;
  43. }
  44. //=========================================================
  45. //函数名称:LoadImage
  46. //说明:加载图片
  47. //=========================================================
  48. bool LoadImage(const char* filename)
  49. {
  50. const char *error;
  51. if (filename == NULL)
  52. {
  53. printf("LoadImage() error: filename is NULL!\n");
  54. return false;
  55. }
  56. SDL_Surface *pTempSurface = IMG_Load(filename); //加载启动图像(splash image)到SDL_Surface对象
  57. if (pTempSurface == NULL)
  58. {
  59. error = SDL_GetError();
  60. printf("Unable to load image! SDL Error: %s\n", SDL_GetError());
  61. return false;
  62. }
  63. g_pTexture = SDL_CreateTextureFromSurface(g_pRenderer, pTempSurface); //使用SDL_Surface对象创建纹理(texture)
  64. if (g_pTexture == NULL)
  65. {
  66. printf("Unable222 to create texture from surface! SDL Error: %s\n", SDL_GetError());
  67. return false;
  68. }
  69. SDL_FreeSurface(pTempSurface); //回收surface对象占用的内存空间
  70. return true;
  71. }
  72. //=========================================================
  73. //函数名称:Close
  74. //说明:销毁各对象
  75. //=========================================================
  76. void Close()
  77. {
  78. //销毁窗口对象
  79. SDL_DestroyWindow(g_pWindow);
  80. g_pWindow = NULL;
  81. //销毁渲染器对象
  82. SDL_DestroyRenderer(g_pRenderer);
  83. g_pRenderer = NULL;
  84. //销毁纹理对象
  85. SDL_DestroyTexture(g_pTexture);
  86. g_pTexture = NULL;
  87. //清除所有已初始化的子系统。在程序结束时调用。
  88. SDL_Quit();
  89. }
  90. //=========================================================
  91. //函数名称:main
  92. //说明:主函数
  93. //=========================================================
  94. int main(int argc, char* argv[]) //注意这里必须在main的括号内加上int argc, char* argv[]否则报错"LNK2019无法解析的外部符号 _SDL_main"
  95. {
  96. //Step1:初始化SDL
  97. if (!Init())
  98. {
  99. printf("Failed to Init!\n");
  100. return -1;
  101. }
  102. //Step2:加载图片
  103. if (!LoadImage("D:\\Work\\SDLHelloWorld\\Debug\\helloworld.jpg"))
  104. {
  105. printf("Failed to load media!\n");
  106. return -2;
  107. }
  108. SDL_SetRenderDrawColor(g_pRenderer, 255, 255, 255, 0); //设置渲染器的颜色,第一个参数传入渲染器对象
  109. //接下来依次是R、G、B值和Alpha值
  110. //Step3:绘制图片三板斧
  111. SDL_RenderClear(g_pRenderer); //使用某种绘图颜色来“清除”当前窗口
  112. SDL_RenderCopy(g_pRenderer, g_pTexture, NULL, NULL); //将纹理复制到渲染器中;最后两个参数的使用详见下一篇教程
  113. SDL_RenderPresent(g_pRenderer); //将渲染器中的内容在窗口中显示出来
  114. OutputDebugString("Failed to load media!\n");
  115. SDL_Delay(3000); //在程序结束之前延迟一段时间,以便观察窗口;实际项目中慎用!
  116. //Step4:释放内存资源并关闭SDL
  117. Close();
  118. return 0;
  119. }