SDL学习入门

2024-06-23 06:08
文章标签 学习 入门 sdl

本文主要是介绍SDL学习入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1、搭建开发平台
    (1)sudo apt-get install libsdl1.2-dev
        最基本的开发包
    (2)sudo apt-get install libsdl-image1.2-dev
        关于图像的开发包
    (3)sudo apt-get install libsdl-mixer1.2-dev
        关于音频的开发包
    (4)sudo apt-get install libsdl-ttf2.0-dev
        关于文字的开发包
    安装好以上四个开发包,开发平台算是搭建好了
    
2、最有代表性的简单程序,包括图像,文字,音乐,注释如下:
[cpp] view plain copy print ?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <SDL/SDL.h>  
  4. #include <SDL/SDL_image.h>  
  5. #include <SDL/SDL_mixer.h>  
  6. #include <SDL/SDL_ttf.h>  
  7.   
  8. static SDL_Surface* screen;//SDL窗口  
  9.   
  10. int main(int argc, char *argv[])  
  11. {  
  12.   
  13.     int quit = 0;  
  14.     SDL_Surface *text_sur;//文字容器  
  15.     SDL_Surface *background;//图像容器  
  16.     SDL_Event event;  
  17.     SDL_Color color;  
  18.     SDL_Rect srect, drect;  
  19.     Mix_Music *bgsound;  
  20.     TTF_Font *font;  
  21.       
  22.     //初始化SDL  
  23.     if (SDL_Init(SDL_INIT_VIDEO||SDL_INIT_AUDIO) < 0)  
  24.     {  
  25.         fprintf(stderr, "SDL init error:%s\n", SDL_GetError());  
  26.         exit(0);  
  27.     }  
  28.     atexit(SDL_Quit);//注册退出时调用的操作  
  29.       
  30.       
  31.     //设置SDL屏幕大小  
  32.     screen = SDL_SetVideoMode(600, 400, 24, SDL_HWSURFACE);  
  33.     if (screen == NULL)  
  34.     {  
  35.         fprintf(stderr, "Set video mode failure:%s\n", SDL_GetError());  
  36.         exit(0);  
  37.     }  
  38.       
  39.     //设置SDL窗口标题  
  40.     SDL_WM_SetCaption("test", NULL);  
  41.    
  42.     /*显示图像*/  
  43.     background = IMG_Load("background.jpg");//导入图像文件,并将图像放入文字容器  
  44.     srect.x = 0;  
  45.     srect.y = 0;  
  46.     srect.w = background->w;  
  47.     srect.h = background->h;  
  48.     drect = srect;//设置截取范围  
  49.     SDL_BlitSurface(background, &srect, screen, &drect);//将图像容器放入SDL窗口  
  50.   
  51.     /*显示文字*/  
  52.     //初始化TTF  
  53.     if (TTF_Init() < 0)  
  54.     {  
  55.         fprintf(stderr, "TTF init error:%s\n", SDL_GetError());  
  56.         return;  
  57.     }  
  58.       
  59.     font = TTF_OpenFont("test.ttf", 40);//导入字体文件  
  60.     color.r = 255;  
  61.     color.g = 0;  
  62.     color.b = 0;//设置文字颜色  
  63.     text_sur=TTF_RenderText_Solid(font, "Hello, Welcome to GAME!!", color);//将文字放入文字容器  
  64.       
  65.     srect.x = 0;  
  66.     srect.y = 0;  
  67.     srect.w = text_sur->w;  
  68.     srect.h = text_sur->h;  
  69.       
  70.     drect.x = (600 - text_sur->w) / 2;  
  71.     drect.y = (400 - text_sur->h) / 2;  
  72.     drect.w = text_sur->w;  
  73.     drect.h = text_sur->h;//设置截取范围  
  74.     SDL_BlitSurface(text_sur, &srect, screen, &drect);//将文字容器放入SDL窗口  
  75.       
  76.     SDL_UpdateRect(screen, 0, 0, 600, 400);//更新SDL窗口,让新添加的容器显示  
  77.   
  78.     /*播放声音*/  
  79.     Mix_OpenAudio(44100, AUDIO_S16, 2, 4096);//打开音频  
  80.     bgsound = Mix_LoadMUS("bgsound.mp3");//导入声音文件  
  81.     Mix_PlayMusic(bgsound, -1);//播放音频  
  82.     while (quit == 0)  
  83.     {  
  84.         while (SDL_PollEvent(&event))  
  85.         {  
  86.             switch (event.type)  
  87.             {  
  88.              case SDL_QUIT:  
  89.                 Mix_CloseAudio();//关闭音频  
  90.                 quit = 1;  
  91.                 break;  
  92.              default:  
  93.                 break;  
  94.             }  
  95.         }  
  96.         SDL_Delay(100);  
  97.     }  
  98.       
  99.     return 0;  
  100. }  
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_ttf.h>static SDL_Surface* screen;//SDL窗口int main(int argc, char *argv[])
{int quit = 0;SDL_Surface *text_sur;//文字容器SDL_Surface *background;//图像容器SDL_Event event;SDL_Color color;SDL_Rect srect, drect;Mix_Music *bgsound;TTF_Font *font;//初始化SDLif (SDL_Init(SDL_INIT_VIDEO||SDL_INIT_AUDIO) < 0){fprintf(stderr, "SDL init error:%s\n", SDL_GetError());exit(0);}atexit(SDL_Quit);//注册退出时调用的操作//设置SDL屏幕大小screen = SDL_SetVideoMode(600, 400, 24, SDL_HWSURFACE);if (screen == NULL){fprintf(stderr, "Set video mode failure:%s\n", SDL_GetError());exit(0);}//设置SDL窗口标题SDL_WM_SetCaption("test", NULL);/*显示图像*/background = IMG_Load("background.jpg");//导入图像文件,并将图像放入文字容器srect.x = 0;srect.y = 0;srect.w = background->w;srect.h = background->h;drect = srect;//设置截取范围SDL_BlitSurface(background, &srect, screen, &drect);//将图像容器放入SDL窗口/*显示文字*///初始化TTFif (TTF_Init() < 0){fprintf(stderr, "TTF init error:%s\n", SDL_GetError());return;}font = TTF_OpenFont("test.ttf", 40);//导入字体文件color.r = 255;color.g = 0;color.b = 0;//设置文字颜色text_sur=TTF_RenderText_Solid(font, "Hello, Welcome to GAME!!", color);//将文字放入文字容器srect.x = 0;srect.y = 0;srect.w = text_sur->w;srect.h = text_sur->h;drect.x = (600 - text_sur->w) / 2;drect.y = (400 - text_sur->h) / 2;drect.w = text_sur->w;drect.h = text_sur->h;//设置截取范围SDL_BlitSurface(text_sur, &srect, screen, &drect);//将文字容器放入SDL窗口SDL_UpdateRect(screen, 0, 0, 600, 400);//更新SDL窗口,让新添加的容器显示/*播放声音*/Mix_OpenAudio(44100, AUDIO_S16, 2, 4096);//打开音频bgsound = Mix_LoadMUS("bgsound.mp3");//导入声音文件Mix_PlayMusic(bgsound, -1);//播放音频while (quit == 0){while (SDL_PollEvent(&event)){switch (event.type){case SDL_QUIT:Mix_CloseAudio();//关闭音频quit = 1;break;default:break;}}SDL_Delay(100);}return 0;
}



问题:gcc main.c -o main编译时可能会出现如下错误:
[cpp] view plain copy print ?
  1. main.c:(.text+0x19): undefined reference to `SDL_Init'  
  2. main.c:(.text+0x22): undefined reference to `SDL_GetError'  
  3. main.c:(.text+0x50): undefined reference to `SDL_Quit'  
  4. main.c:(.text+0x79): undefined reference to `SDL_SetVideoMode'  
  5. main.c:(.text+0x8c): undefined reference to `SDL_GetError'  
  6. main.c:(.text+0xc7): undefined reference to `SDL_WM_SetCaption'  
  7. main.c:(.text+0xd3): undefined reference to `IMG_Load'  
  8. main.c:(.text+0x132): undefined reference to `SDL_UpperBlit'  
  9. main.c:(.text+0x137): undefined reference to `TTF_Init'  
  10. main.c:(.text+0x140): undefined reference to `SDL_GetError'  
  11. main.c:(.text+0x174): undefined reference to `TTF_OpenFont'  
  12. main.c:(.text+0x1a3): undefined reference to `TTF_RenderText_Solid'  
  13. main.c:(.text+0x24c): undefined reference to `SDL_UpperBlit'  
  14. main.c:(.text+0x279): undefined reference to `SDL_UpdateRect'  
  15. main.c:(.text+0x29d): undefined reference to `Mix_OpenAudio'  
  16. main.c:(.text+0x2a9): undefined reference to `Mix_LoadMUS'  
  17. main.c:(.text+0x2c1): undefined reference to `Mix_PlayMusic'  
  18. main.c:(.text+0x2d5): undefined reference to `Mix_CloseAudio'  
  19. main.c:(.text+0x2ec): undefined reference to `SDL_PollEvent'  
  20. main.c:(.text+0x2fc): undefined reference to `SDL_Delay'  
  21. collect2: ld returned 1 exit status  
main.c:(.text+0x19): undefined reference to `SDL_Init'
main.c:(.text+0x22): undefined reference to `SDL_GetError'
main.c:(.text+0x50): undefined reference to `SDL_Quit'
main.c:(.text+0x79): undefined reference to `SDL_SetVideoMode'
main.c:(.text+0x8c): undefined reference to `SDL_GetError'
main.c:(.text+0xc7): undefined reference to `SDL_WM_SetCaption'
main.c:(.text+0xd3): undefined reference to `IMG_Load'
main.c:(.text+0x132): undefined reference to `SDL_UpperBlit'
main.c:(.text+0x137): undefined reference to `TTF_Init'
main.c:(.text+0x140): undefined reference to `SDL_GetError'
main.c:(.text+0x174): undefined reference to `TTF_OpenFont'
main.c:(.text+0x1a3): undefined reference to `TTF_RenderText_Solid'
main.c:(.text+0x24c): undefined reference to `SDL_UpperBlit'
main.c:(.text+0x279): undefined reference to `SDL_UpdateRect'
main.c:(.text+0x29d): undefined reference to `Mix_OpenAudio'
main.c:(.text+0x2a9): undefined reference to `Mix_LoadMUS'
main.c:(.text+0x2c1): undefined reference to `Mix_PlayMusic'
main.c:(.text+0x2d5): undefined reference to `Mix_CloseAudio'
main.c:(.text+0x2ec): undefined reference to `SDL_PollEvent'
main.c:(.text+0x2fc): undefined reference to `SDL_Delay'
collect2: ld returned 1 exit status
原因:那是因为该程序用到四个静态库,分别为:
(1)SDL
(2)SDL_image
(3)SDL_ttf
(4)SDL_mixer
需用-l参数连起来才能编译得过,如:gcc main.c -lSDL -lSDL_image -lSDL_ttf -lSDL_mixer -o main

这篇关于SDL学习入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086337

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP