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

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

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、核心特性