SDL2 教程中心
文章平均质量分 53
SDL2 多媒体库入门教程
编程之路从0到1
这个作者很懒,什么都没留下…
展开
-
SDL编程入门(31)滚动背景
滚动背景通常在游戏中,你可能想要一个无限或循环的背景。使用滚动背景,你可以循环一个永远持续下去的背景。比如说,如果我们想在一个无限的背景上围绕一个点移动:我们要做的就是将背景的两次迭代彼此相邻渲染,并将它们每帧移动一点。 当背景完全移开时,你可以重新设置运动://The dot that will move around on the screenclass Dot{ public: //The dimensions of the dot static翻译 2021-01-04 15:41:18 · 640 阅读 · 0 评论 -
SDL编程入门(30)滚动
滚动到目前为止,我们只涉及屏幕大小的平面。有了滚动功能,你可以通过渲染与摄影机相关的所有内容来浏览任何大小的平面。滚动的基本原理是,你有一个矩形,它的功能是一个摄像机:然后你只渲染摄像机里的东西,通常涉及渲染相对于摄像机的事物或仅显示摄像机内部的对象的一部分。//平面的尺寸const int LEVEL_WIDTH = 1280;const int LEVEL_HEIGHT = 960;//屏幕尺寸常量const int SCREEN_WIDTH = 640;const int SC翻译 2021-01-04 15:36:28 · 573 阅读 · 0 评论 -
SDL编程入门(29)圆形碰撞检测
圆形碰撞检测除了矩形碰撞框,圆是最常见的碰撞器形式。在这里,我们将检查两个圆以及一个圆和一个框之间的碰撞。检查两个圆之间的碰撞很容易。 你要做的就是检查每个圆心之间的距离是否小于其半径的总和(半径是半径的倍数)。对于框/圆碰撞,必须在碰撞框上找到最接近圆心的点。 如果该点小于圆的半径,则发生碰撞。//一个圆结构体struct Circle{ int x, y; int r;};SDL有一个内置的矩形结构,但我们必须自己制作一个有位置和半径的圆形结构。//The dot t翻译 2020-12-30 02:47:26 · 812 阅读 · 0 评论 -
SDL编程入门(28)每像素碰撞检测
每像素碰撞检测一旦你知道如何检查两个矩形之间的碰撞,你可以检查任何两个图像之间的碰撞,因为所有的图像都是由矩形构成的。在电子游戏中,所有的东西都可以用矩形来做,甚至这个点:没看到?我们把它放大:还没看到?那现在呢?:图像由正方形的像素组成,正方形的像素为矩形。 要进行每个像素的碰撞检测,我们要做的就是让每个对象都有一组碰撞框,并检查一组碰撞框与另一组碰撞框的碰撞,如下所示://在屏幕上移动的点class Dot{ public: //The dimensions翻译 2020-12-30 02:45:52 · 793 阅读 · 0 评论 -
SDL编程入门(27)碰撞检测
碰撞检测在游戏中,你经常需要判断两个物体是否相互撞击。对于简单的游戏来说,通常用边界框碰撞检测来完成。碰撞框是检查两个对象之间碰撞的标准方法。当两个多边形没有分开时,它们就会发生碰撞。这里我们有两个没有碰撞的盒子。如你所见,它们的x投影在底部,y投影在左边:在这里,你可以看到这些盒子沿着y轴相撞,但它们在x轴上是分开的:这里的盒子在X轴上是相撞的,但在Y轴上是分开的:当任何一个轴上没有分离时,就会发生碰撞:这种形式的碰撞检测,我们试图找到一个物体分离的轴,称为分离轴测试。如果没有分离轴,那么翻译 2020-12-30 02:44:16 · 1295 阅读 · 0 评论 -
SDL编程入门(26)运动
运动现在我们知道了如何渲染、处理输入和处理时间,我们现在知道了我们需要在屏幕上移动东西的一切。在这里,我们将做一个基本的程序与一个点移动。//The dot that will move around on the screenclass Dot{ public: //点的尺寸 static const int DOT_WIDTH = 20; static const int DOT_HEIGHT = 20; //点的最大轴速翻译 2020-12-30 02:42:18 · 619 阅读 · 0 评论 -
SDL编程入门(25)限制帧率
限制帧率我们可以用SDL定时器做的另一件事是手动限制帧率。在这里,我们将禁用vsync,并保持最高帧率。//屏幕尺寸常量const int SCREEN_WIDTH = 640;const int SCREEN_HEIGHT = 480;const int SCREEN_FPS = 60;const int SCREEN_TICKS_PER_FRAME = 1000 / SCREEN_FPS;在这个演示中,我们将正常渲染我们的帧,但在帧的最后,我们将等待,直到帧时间完成。例如这里,当你想以6翻译 2020-12-30 02:39:54 · 1646 阅读 · 0 评论 -
SDL编程入门(24)计算帧率
计算帧率现在我们知道了如何用SDL制作定时器,是时候把它用起来了。我们将使用定时器来测量fps。//Main loop flagbool quit = false;//Event handlerSDL_Event e;//将文字颜色设置为黑色SDL_Color textColor = { 0, 0, 0, 255 };//每秒钟定时器的帧数LTimer fpsTimer;//内存中的文本流std::stringstream timeText;//开始计算每秒的帧数int翻译 2020-12-30 02:37:38 · 1063 阅读 · 0 评论 -
SDL编程入门(23)高级定时器
高级定时器现在我们已经做了一个用SDL做的基本计时器,是时候做一个可以启动/停止/暂停的计时器了。//The application time based timerclass LTimer{ public: //Initializes variables LTimer(); //各种时钟操作 void start(); void stop(); void pause(); vo翻译 2020-12-22 05:37:43 · 937 阅读 · 0 评论 -
SDL编程入门(22)定时
定时任何类型的游戏API的另一个重要部分是处理时间的能力。在本教程中,我们将制作一个我们可以重新启动的计时器。//Using SDL, SDL_image, SDL_ttf, standard IO, strings, and string streams#include <SDL.h>#include <SDL_image.h>#include <SDL_ttf.h>#include <stdio.h>#include <string&g翻译 2020-12-22 05:35:25 · 550 阅读 · 0 评论 -
SDL编程入门(21)音效和音乐
音效和音乐到目前为止,我们只是在处理视频和输入。大多数游戏制作都需要某种声音,这里我们将使用SDL_mixer为我们播放音频。//Using SDL, SDL_image, SDL_mixer, standard IO, and strings#include <SDL.h>#include <SDL_image.h>#include <SDL_mixer.h>#include <stdio.h>#include <string>翻译 2020-12-22 05:33:23 · 1101 阅读 · 0 评论 -
SDL编程入门(20)触力反馈
触力反馈我们知道了如何用SDL使用操纵杆,现在我们可以使用新的触觉API来使控制器震动。//带有触力反馈的游戏控制器1处理程序SDL_Joystick* gGameController = NULL;SDL_Haptic* gControllerHaptic = NULL;触觉设备是一种能提供某种物理反馈的东西。在本例中,它使控制器发出隆隆声。触觉设备的数据类型直观地命名为SDL_haptic。//Initialize SDLif( SDL_Init( SDL_INIT_VIDEO | SD翻译 2020-10-19 14:56:53 · 543 阅读 · 0 评论 -
SDL编程入门(19)游戏手柄和操纵杆
游戏手柄和操纵杆就像鼠标输入和键盘输入一样,SDL也有能力读取来自操纵杆/游戏手柄/游戏控制器的输入。在本教程中,我们将根据操纵杆的输入使箭头旋转。//模拟手柄死区const int JOYSTICK_DEAD_ZONE = 8000;SDL处理游戏控制器上的模拟杆的方式是,它将其位置转换为-32768和32767之间的数字。这意味着一个轻敲可以报告一个1000+的位置。我们想忽略轻敲,所以我们想创建一个死区,在这个死区中,来自操纵杆的输入被忽略。这就是我们定义这个常数的原因,我们稍后会看到它是如翻译 2020-10-19 14:54:20 · 2209 阅读 · 0 评论 -
SDL编程入门(18)按键状态
按键状态正如我们在鼠标输入教程中看到的那样,除了使用事件之外,还有其他方法可以获得输入设备(鼠标、键盘等)的状态。在本教程中,我们将使用按键状态而不是事件来重新制作键盘输入教程。//Main loop flagbool quit = false;//Event handlerSDL_Event e;//Current rendered textureLTexture* currentTexture = NULL;在进入主循环之前,我们声明一个纹理指针来跟踪我们要渲染到屏幕上的纹理。/翻译 2020-10-19 14:51:21 · 1565 阅读 · 1 评论 -
SDL编程入门(17)鼠标事件
鼠标事件和按键一样,SDL也有事件结构来处理鼠标事件,如鼠标运动、鼠标按钮按下和鼠标按钮释放。在本教程中,我们将制作一堆可以与之交互的按钮。//按钮常量const int BUTTON_WIDTH = 300;const int BUTTON_HEIGHT = 200;const int TOTAL_BUTTONS = 4;enum LButtonSprite{ BUTTON_SPRITE_MOUSE_OUT = 0, BUTTON_SPRITE_MOUSE_OVER_MO翻译 2020-10-09 17:01:44 · 1393 阅读 · 0 评论 -
SDL编程入门(16)TrueType字体
TrueType字体使用SDL渲染文本的一种方法是使用扩展库SDL_ttf。SDL_ttf允许你从TrueType字体中创建图像,我们将在这里使用它从字体文本中创建纹理。// 使用SDL、SDL_image、SDL_ttf、标准IO、math和string#include <SDL.h>#include <SDL_image.h>#include <SDL_ttf.h>#include <stdio.h>#include <string&g翻译 2020-10-09 16:58:44 · 695 阅读 · 0 评论 -
SDL编程入门(15)旋转和翻转
旋转和翻转SDL2的硬件加速纹理渲染还能给我们提供图像快速翻转和旋转的能力。在本教程中,我们将利用这一点使一个箭头纹理旋转和翻转。//Texture wrapper classclass LTexture{ public: //Initializes variables LTexture(); //Deallocates memory ~LTexture(); //Loads image at specif翻译 2020-10-09 16:54:02 · 1178 阅读 · 0 评论 -
SDL编程入门(14)动画精灵和VSync
动画精灵和VSync动画简而言之就是展示一个又一个的图像来制造运动的假象。在这里我们将展示不同的精灵来制作一个简笔画的动画。假设我们有以下动画帧(这清楚地表明我不是动画师):而且每隔十分之一秒就显示一个,我们会得到这个动画:由于SDL 2中的图像是典型的SDL_Textures,所以在SDL中的动画是一个接一个地显示纹理的不同部分(或不同的整体纹理)。//走路动画const int WALKING_ANIMATION_FRAMES = 4;SDL_Rect gSpriteClips[ WALK翻译 2020-09-20 02:14:48 · 673 阅读 · 0 评论 -
SDL编程入门(13)透明度混合
得益于新的硬件加速渲染,SDL2.0中的透明度变得更快。这里我们将使用alpha调制(它的工作原理很像颜色调制)来控制纹理的透明度。//Texture wrapper classclass LTexture{ public: //Initializes variables LTexture(); //Deallocates memory ~LTexture(); //Loads image at specifi翻译 2020-09-20 02:12:14 · 965 阅读 · 0 评论 -
SDL编程入门(12)色彩调制
色彩调制颜色调制可以让你改变渲染纹理的颜色。在这里,我们将使用各种颜色来调制一个纹理。//Texture wrapper classclass LTexture{ public: //Initializes variables LTexture(); //Deallocates memory ~LTexture(); //Loads image at specified path bool l翻译 2020-09-20 02:09:28 · 1128 阅读 · 0 评论 -
SDL编程入门(11)裁剪渲染和精灵表
裁剪渲染和精灵表有时你只想渲染纹理的一部分。 很多时候,游戏喜欢将多个图像保留在同一张精灵表上,而不是拥有一堆纹理。 使用剪辑渲染,我们可以定义要渲染的纹理的一部分,而不是渲染整个对象。//Texture wrapper classclass LTexture{ public: //Initializes variables LTexture(); //Deallocates memory ~LTexture();翻译 2020-09-20 02:07:32 · 574 阅读 · 0 评论 -
SDL编程入门(10)Color Key
Color Key当在屏幕上渲染多个图像时,通常需要让图像具有透明背景。幸运的是,SDL提供了一种使用颜色键控的简单方法来实现这一点。//纹理包装类class LTexture{ public: //初始化 LTexture(); //释放 ~LTexture(); //在指定路径上加载图像 bool loadFromFile( std::string path ); //释翻译 2020-09-19 02:59:07 · 886 阅读 · 0 评论 -
SDL编程入门(9)视口
视口有些时候,你只想渲染屏幕的一部分,比如最小地图。使用视口你可以控制你在屏幕上的渲染位置。 //左上角视口 SDL_Rect topLeftViewport; topLeftViewport.x = 0; topLeftViewport.y = 0; topLeftViewport.w = SCREEN_WIDTH / 2;翻译 2020-09-19 02:56:38 · 455 阅读 · 0 评论 -
SDL编程入门(8)几何图形渲染
几何图形渲染除了新的纹理API,SDL还有新的基元渲染调用作为其渲染API的一部分。因此,如果你需要渲染一些基本的形状,而你又不想为它们创建额外的图形,SDL可以为你省力。bool loadMedia(){ //加载成功标志 bool success = true; //没有任何东西可加载 return success;}所以在我们的媒体加载功能中可以看到,我们没有加载媒体。SDL的基元渲染允许您在不加载特殊图形的情况下渲染形状。 //W翻译 2020-09-19 02:54:49 · 1310 阅读 · 1 评论 -
SDL编程入门(7)纹理加载和渲染
纹理加载和渲染SDL2 的一个主要新功能是纹理渲染 API。这为您提供了快速、灵活的基于硬件的渲染。在本教程中,我们将使用这种新的渲染技术。//将单个图像作为纹理加载SDL_Texture* loadTexture( std::string path );//我们要渲染的窗口SDL_Window* gWindow = NULL;//窗口渲染器SDL_Renderer* gRenderer = NULL;//当前显示的纹理SDL_Texture* gTexture = NULL;S翻译 2020-09-18 17:51:40 · 1183 阅读 · 0 评论 -
SDL编程入门(6)扩展库SDL_image
扩展库 SDL_imageSDL扩展库允许你做一些事情,比如加载BMP以外的图像文件,渲染TTF字体,以及播放音乐。您可以设置SDL_image来加载PNG文件,这可以为您节省大量的磁盘空间。在本教程中,我们将介绍如何安装SDL_image。SDL本身是一个扩展库,因为它增加了游戏和媒体功能,而这些功能并不是你的C++编译器的标准配置。当你设置扩展库的时候,你会发现它和单独安装SDL几乎是一样的。我们将特别安装SDL_image,但如果你能安装该扩展库,你应该能够安装任何一个扩展库。您需要做的第一件事翻译 2020-09-18 17:25:51 · 2602 阅读 · 0 评论 -
SDL编程入门(5)Surface 优化和软拉伸
Surface 优化和软拉伸到现在为止,我们一直都是将我们的图像原始地融合在一起。因为我们只显示一张图片,所以这并不重要。当你在做游戏的时候,原始图像会导致不必要的减速。我们将把它们转换为优化的格式来加快它们的速度。SDL2还为SDL表面提供了一个新的功能,叫做软拉伸,它允许你将图像按比例放大到不同的尺寸进行blit。在本教程中,我们将把一张只有屏幕一半大小的图像拉伸到全尺寸。SDL_Surface* loadSurface( std::string path ){ //最终优化后的图像 SDL_翻译 2020-09-18 17:05:36 · 1399 阅读 · 0 评论 -
SDL编程入门(4)按键操作
按键操作点X关闭出窗口只是SDL能够处理的事件之一。另一种在游戏中大量使用的输入方式是键盘。在本教程中,我们将根据您所按的键来使不同的图像出现。//按键表面常量enum KeyPressSurfaces{ KEY_PRESS_SURFACE_DEFAULT, KEY_PRESS_SURFACE_UP, KEY_PRESS_SURFACE_DOWN, KEY_PRESS_SURFACE_LEFT, KEY_PRESS_SURFACE_RIGHT, KEY翻译 2020-09-18 16:46:45 · 1250 阅读 · 0 评论 -
SDL编程入门(3)事件驱动编程
事件驱动编程除了在屏幕上放置图像外,游戏还要求您处理用户的输入。你可以通过SDL使用事件处理系统来实现这一点。//主循环标志bool quit = false;//事件处理程序SDL_Event e;在我们的代码中,在SDL被初始化并加载媒体后(如前面教程中提到的),我们声明一个退出标志,以跟踪用户是否已经退出。由于此时我们刚刚启动应用程序,所以很明显它被初始化为false。我们还声明一个SDL_Event union。一个SDL事件就是一些类似于按键按下、鼠标移动、操纵杆按钮按下等。在这翻译 2020-09-18 16:06:53 · 555 阅读 · 0 评论 -
SDL编程入门(2)在屏幕上显示图像
在屏幕上显示图像现在你已经打开了一个窗口,让我们在上面放一张图片。注意:从现在开始,教程将只涉及源代码的关键部分。如果想看完整的程序,你必须下载完整的源码。//启动SDL并创建窗口bool init();//加载媒体bool loadMedia();//释放媒体并关闭SDLvoid close();在第一个教程中,我们把所有的东西都放在主函数中。由于这是一个小程序,我们可以摆脱这种做法,但在真实的程序中(比如视频游戏),你希望你的代码尽可能的模块化。这意味着你希望你的代码是整齐的块,翻译 2020-09-18 15:28:44 · 1219 阅读 · 0 评论 -
SDL编程入门(1)Hello SDL
Hello SDL 你的第一个图形窗口所以你学会了C++的基础知识,但你厌倦了制作基于文本的小程序。为了使用诸如图形、声音、键盘、操纵杆等东西,你需要一个API(应用程序员接口),将所有这些硬件功能转化为C++可以交互的东西。这就是SDL所做的事情。它将Windows/Linux/Mac/Android/iOS等工具包装起来,让你可以用SDL编写代码,然后编译到它所支持的任何平台。为了使用它,你需要安装它。SDL作为一个动态链接库。一个动态链接库有3个部分。头文件(Library.h)库文件 (翻译 2020-09-18 14:51:06 · 1747 阅读 · 1 评论