Simple 2D 是一个小型开源图形引擎,提供基本的 2D 绘图、媒体和输入功能。它是用 C 语言编写的,可跨多个平台工作,创建本机窗口并使用 SDL 与硬件交互,同时使用 OpenGL 渲染内容。
请注意,随着新功能的添加、错误的修复以及其他更改的进行,本自述文件将不断更新。查看发行说明以获取该版本文档的链接。
如果您遇到任何问题、有功能请求或只是想提出问题,请在 GitHub 上提出问题。了解有关以下贡献的更多信息。
Simple 2D 支持所有主要操作系统和硬件平台,并在 Raspberry Pi 上的 macOS、iOS、tvOS、Windows、Linux 和 Raspbian 的最新版本上进行了测试。
要安装最新版本...
使用自制软件:
brew tap simple2d/tap
brew install simple2d
上面的 Homebrew 公式还将默认将 iOS 和 tvOS 框架安装到/usr/local/Frameworks/Simple2D
。安装后,运行simple2d simulator
命令以查看与 iOS 和 tvOS 模拟器交互的可用选项。运行simple2d build
以了解如何使用 iOS 和 tvOS SDK 构建 Xcode 项目。示例 Xcode 项目可以在deps
存储库中找到。
下载 Visual C++ 或 MinGW 的 Windows 安装程序。
对于 MinGW,我们建议使用 MSYS2 环境(在 Chocolatey 上也可用)以及 MinGW 64 位命令提示符(通常为mingw64.exe
)。 Simple 2D 也可以使用下面的 Linux 说明安装在 MinGW 上。
运行simple2d.sh
Bash 脚本。一切都会在整个过程中得到解释,并且在采取任何行动之前都会提示您。要从网络运行该脚本,请将此代码段粘贴到您的终端中:
url= ' https://raw.githubusercontent.com/simple2d/simple2d/master/bin/simple2d.sh ' ; which curl > /dev/null && cmd= ' curl -fsSL ' || cmd= ' wget -qO - ' ; bash <( $cmd $url ) install
Simple 2D 支持运行 Linux 的 ARM 平台,例如 Raspberry Pi。由于大多数 Linux 发行版都为传统桌面平台配置了 SDL 软件包,因此当检测到 ARM 时,安装脚本将从源代码编译 SDL,从而禁用窗口系统(如 X11)和 OpenGL(改为强制使用 OpenGL ES)。
安装后,使用simple2d
命令行实用程序来更新 Simple 2D、检查问题、输出编译应用程序所需的库等。只需运行simple2d
即可查看所有可用的命令和选项。
或者,您可以从源代码编译并安装 Simple 2D。首先使用以下命令克隆此存储库:
git clone --recursive https://github.com/simple2d/simple2d.git
为了保持此存储库的大小较小,Git 子模块用于引用测试媒体和依赖项。 --recursive
标志确保克隆此存储库时初始化和更新子模块。如果您碰巧在没有--recursive
标志的情况下克隆了此存储库,您仍然可以使用以下命令初始化和更新子模块:
git submodule init
git submodule update --remote
使用git submodule update --remote
随时更新这些子模块
接下来,通过运行以下命令在类 Unix 系统(包括使用 MinGW 的 Windows)上构建和安装:
make && make install
在使用 Visual C++ 的 Windows 上,打开 64 位 Visual Studio 命令提示符并运行:
nmake /f NMakefile all install
请注意,在 macOS 和 Linux 上,makefile 不会检查或安装依赖项,这与分别通过 Homebrew 或simple2d.sh
脚本安装不同。支持 Visual C++ 和 MinGW 的 Windows 依赖项包含在此存储库中(由deps
模块引用)并由两个 makefile 进行安装。
在使用 Visual C++ 的 Windows 上,Simple 2D 将安装到%LOCALAPPDATA%simple2d
,因此请确保将其添加到您的路径(例如使用set PATH=%PATH%;%LOCALAPPDATA%simple2d
)。在所有其他情况下,它将安装到/usr/local/
。在使用 MinGW 的 Windows 上,请确保/usr/local/bin
也在您的路径中。
要构建发布存档(随每个版本一起下载),请使用 MinGW 在 macOS 和 Windows 上运行make release
,并使用 Visual C++ 在 Windows 上运行nmake /f NMakefile release
。
Simple 2D 有多个测试程序,以确保一切正常工作。
auto.c
— 一组公共接口的自动化单元测试。triangle.c
— 本自述文件中的“Hello Triangle”示例。testcard.c
— 图形卡,类似于电视测试卡,目的是确保视觉效果和输入正常工作。audio.c
— 使用解释为声音样本和音乐的各种文件格式测试音频功能。controller.c
— 提供游戏控制器输入的视觉和数字反馈。triangle-ios-tvos.c
— 为 iOS 和 tvOS 设备设计的修改后的triangle.c
。 使用 Visual C++ 在 Windows 上运行make test
或nmake /f NMakefile test
,将测试编译到test/
目录。生成的可执行文件将与其 C 源文件同名。由于这些测试程序中的媒体路径是相对设置的,因此请确保在运行测试之前cd
到test/
目录,例如:
# On Unix-like systems
make test && cd test/ && ./testcard
# On Windows using MinGW
make test & cd test & testcard.exe
# On Windows using Visual C++
nmake /f NMakefile test & cd test & testcard.exe
每个测试还有一个 makefile 目标,因此您可以使用make test testcard
等来构建和运行测试。或者,方便地卸载所有内容,从源代码重建 Simple 2D 和测试,并使用make rebuild <name_of_test>
运行测试,例如:
# Rebuild and run `auto.c` then `testcard.c`...
# ...on Unix-like systems and Windows using MinGW
make rebuild auto testcard
# ...on Windows using Visual C++
nmake /f NMakefile rebuild auto testcard
要运行 iOS 和 tvOS 测试,请首先运行make frameworks && make install-frameworks
来构建和安装 iOS 和 tvOS 框架。接下来,运行make ios
在 iOS 模拟器中运行测试,并make tvos
在 tvOS 模拟器中运行。
制作 2D 应用程序很简单!让我们创建一个窗口并绘制一个三角形......
#include <simple2d.h>
void render () {
S2D_DrawTriangle (
320 , 50 , 1 , 0 , 0 , 1 ,
540 , 430 , 0 , 1 , 0 , 1 ,
100 , 430 , 0 , 0 , 1 , 1
);
}
int main () {
S2D_Window * window = S2D_CreateWindow (
"Hello Triangle" , 640 , 480 , NULL , render , 0
);
S2D_Show ( window );
return 0 ;
}
将上面的代码保存到名为triangle.c
的文件中,并通过在命令行上运行simple2d build triangle.c
来编译它(在 MinGW 中,在 Bash 提示符下运行它)。现在,在 macOS 和 Linux 上使用./triangle
运行该应用程序,或在 Windows 上使用triangle.exe
运行该应用程序,并在 640x480 窗口中以每秒 60 帧的速度欣赏令人惊叹的三角形!
simple2d build
命令是编译单个源文件的有用快捷方式。当然,你也可以直接使用编译器,例如在类 Unix 系统上:
cc triangle.c ` simple2d --libs ` -o triangle
在 Windows 上,在开发人员命令提示符中使用 Visual C++:
cl triangle.c /I %LOCALAPPDATA% s imple2d /link /LIBPATH %LOCALAPPDATA% s imple2d s imple2d.lib /SUBSYSTEM:CONSOLE
# as a PowerShell command
iex " cl triangle.c $( simple2d --libs ) "
让我们了解 2D 绘图等的结构化应用程序。
所有渲染的内容、输入和声音都由窗口控制,因此创建窗口是您要做的第一件事。首先声明一个指向S2D_Window
结构的指针,并使用S2D_CreateWindow()
对其进行初始化。
S2D_Window * window = S2D_CreateWindow (
"Hello World!" , // title of the window
800 , 600 , // width and height
update , render , // callback function pointers (these can be NULL)
0 // flags
);
要将窗口的宽度和高度设置为与显示器的宽度和高度相同,请分别使用S2D_DISPLAY_WIDTH
和S2D_DISPLAY_HEIGHT
作为这些值。
窗口标志可以是0
或以下任意一项:
S2D_RESIZABLE // allow window to be resized
S2D_BORDERLESS // show window without a border
S2D_FULLSCREEN // show window at fullscreen
S2D_HIGHDPI // enable high DPI mode
还可以使用按位 OR 运算符组合标志,例如: S2D_RESIZABLE | S2D_BORDERLESS
视口的大小(窗口中绘制图形的区域)可以独立于窗口大小进行设置,如下所示:
window -> viewport . width = 400 ;
window -> viewport . height = 300 ;
视口有多种缩放模式,例如S2D_FIXED
(视口在窗口大小变化时保持相同大小)、 S2D_EXPAND
(调整大小时视口扩展以填充窗口)、 S2D_SCALE
(默认值,其中视口按比例缩放并居中于窗口)窗口),或S2D_STRETCH
(视口拉伸以填充整个窗口)。像这样设置模式:
window -> viewport . mode = S2D_FIXED ;
在显示窗口之前,可以设置这些属性:
window -> vsync = false; // set the vertical sync, true by default
window -> icon = "app.png" ; // set the icon for the window
一旦您的窗口准备就绪,请使用以下命令显示它:
S2D_Show ( window );
在显示窗口之前或期间的任何时间,都可以设置这些属性:
// Cap the frame rate, 60 frames per second by default
window -> fps_cap = 30 ;
// Set the window background color, black by default
window -> background . r = 1.0 ;
window -> background . g = 0.5 ;
window -> background . b = 0.8 ;
window -> background . a = 1.0 ;
回调函数也可以随时更改 - 下面将详细介绍。可以从S2D_Window
结构体中读取许多值,详细信息请参见simple2d.h
头文件。
可以使用以下命令更改窗口图标:
S2D_SetIcon ( window , "new_icon.png" );
以 PNG 格式截取窗口的屏幕截图,并提供文件路径:
S2D_Screenshot ( window , "./screenshot.png" );
使用完窗口后,使用以下命令释放它:
S2D_FreeWindow ( window );
窗口循环是所有操作发生的地方:设置帧速率、处理输入、更新应用程序状态以及渲染视觉效果。您需要声明两个将由窗口循环调用的基本函数: update()
和render()
。与传统的游戏循环一样, update()
用于更新应用程序状态, render()
用于绘制场景。 Simple 2D 优化了这两个函数的性能和准确性,因此最好将这些更新和渲染任务分开。
更新和渲染函数应如下所示:
void update () { /* update your application state */ }
void render () { /* draw stuff */ }
请记住在调用S2D_CreateWindow()
时添加这些函数名称(有关示例,请参阅上面的“窗口”部分)。
要随时退出窗口循环,请使用:
S2D_Close ( window );
可以在窗口中绘制各种形状和纹理。下面详细了解它们。
有多种几何形状可供选择,例如三角形、四边形(可以制成矩形和正方形)、直线和圆形。每个形状都包含顶点,即两条线相交形成角度的位置(例如,三角形有三个)。对于三角形和四边形的每个顶点,需要设置六个值: x
和y
坐标以及四个颜色值。线条有两个顶点,但可以设置每个角的颜色。圆有一个中心点和可以设置的颜色。当顶点具有不同的颜色值时,它们之间的空间会以渐变的形式混合。
以下示例的简写是:
x = the x coordinate
y = the y coordinate
// Color range is from 0.0 to 1.0
r = red
g = green
b = blue
a = alpha ( opacity )
使用此表示法, x2
将是第二个x
坐标, b2
将是该顶点处的蓝色值。
要绘制三角形,请使用:
S2D_DrawTriangle ( x1 , y1 , r1 , g1 , b1 , a1 ,
x2 , y2 , r2 , g2 , b2 , a2 ,
x3 , y3 , r3 , g3 , b3 , a3 );
要绘制四边形,请使用:
S2D_DrawQuad ( x1 , y1 , r1 , g1 , b1 , a1 ,
x2 , y2 , r2 , g2 , b2 , a2 ,
x3 , y3 , r3 , g3 , b3 , a3 ,
x4 , y4 , r4 , g4 , b4 , a4 );
要画一条线,请使用:
S2D_DrawLine ( x1 , y1 , x2 , y2 ,
width ,
r1 , g1 , b1 , a1 ,
r2 , g2 , b2 , a2 ,
r3 , g3 , b3 , a3 ,
r4 , g4 , b4 , a4 );
要绘制圆,请使用:
S2D_DrawCircle ( x , y , radius , sectors , r , g , b , a );
可以在窗口中绘制许多流行格式的图像,例如 JPEG、PNG 和 BMP。与形状不同,图像需要从文件中读取并存储在内存中。只需声明一个指向S2D_Image
结构的指针,并使用提供图像文件路径的S2D_CreateImage()
对其进行初始化。
S2D_Image * img = S2D_CreateImage ( "image.png" );
如果找不到图像,它将返回NULL
。
获得图像后,您可以更改其x, y
位置,如下所示:
img -> x = 125 ;
img -> y = 350 ;
通过调整图像的宽度和高度来更改图像的大小:
img -> width = 256 ;
img -> height = 512 ;
像这样旋转图像:
// Angle should be in degrees
// The last parameter is the point the image should rotate around, either:
// S2D_CENTER, S2D_TOP_LEFT, S2D_TOP_RIGHT, S2D_BOTTOM_LEFT, or S2D_BOTTOM_RIGHT
S2D_RotateImage ( img , angle , S2D_CENTER );
// Or, set a custom point to rotate around
img -> rx = 50 ;
img -> ry = 75 ;
// Set the rotation angle directly
img -> rotate = 90 ;
您还可以像这样调整图像的颜色:
// Default is 1.0 for each, a white color filter
img -> color . r = 1.0 ;
img -> color . g = 0.8 ;
img -> color . b = 0.2 ;
img -> color . a = 1.0 ;
最后,使用以下命令绘制图像:
S2D_DrawImage ( img );
由于图像是动态分配的,因此可以使用以下方法释放它们:
S2D_FreeImage ( img );
精灵是一种特殊类型的图像,可用于创建动画。要创建精灵,请声明一个指向S2D_Sprite
结构的指针,并使用提供精灵表图像的文件路径的S2D_CreateSprite()
对其进行初始化。
S2D_Sprite * spr = S2D_CreateSprite ( "sprite_sheet.png" );
如果找不到精灵图像,它将返回NULL
。
通过提供剪切矩形将精灵表剪切为单个图像:
S2D_ClipSprite ( spr , x , y , width , height );
精灵本身的x, y
位置可以像这样改变:
spr -> x = 150 ;
spr -> y = 275 ;
通过调整精灵的宽度和高度来更改精灵的大小:
spr -> width = 100 ;
spr -> height = 100 ;
像这样旋转精灵:
// Angle should be in degrees
// The last parameter is the point the sprite should rotate around, either:
// S2D_CENTER, S2D_TOP_LEFT, S2D_TOP_RIGHT, S2D_BOTTOM_LEFT, or S2D_BOTTOM_RIGHT
S2D_RotateSprite ( spr , angle , S2D_CENTER );
// Or, set a custom point to rotate around
spr -> rx = 50 ;
spr -> ry = 75 ;
// Set the rotation angle directly
spr -> rotate = 90 ;
您还可以像这样调整精灵图像的颜色:
// Default is 1.0 for each, a white color filter
spr -> color . r = 1.0 ;
spr -> color . g = 0.8 ;
spr -> color . b = 0.2 ;
spr -> color . a = 1.0 ;
最后,使用以下命令绘制精灵:
S2D_DrawSprite ( spr );
由于精灵是动态分配的,因此可以使用以下方法释放它们:
S2D_FreeSprite ( spr );
文本的绘制方式与图像非常相似。首先找到您最喜欢的 OpenType 字体(带有.ttf
或.otf
文件扩展名),然后声明一个指向S2D_Text
结构的指针,并使用S2D_CreateText()
对其进行初始化,提供字体的文件路径、要显示的消息以及大小。
S2D_Text * txt = S2D_CreateText ( "vera.ttf" , "Hello world!" , 20 );
如果找不到字体文件,它将返回NULL
。
然后您可以更改文本的x, y
位置,例如:
txt -> x = 127 ;
txt -> y = 740 ;
像这样旋转文本:
// Angle should be in degrees
// The last parameter is the point the text should rotate around, either:
// S2D_CENTER, S2D_TOP_LEFT, S2D_TOP_RIGHT, S2D_BOTTOM_LEFT, or S2D_BOTTOM_RIGHT
S2D_RotateText ( txt , angle , S2D_CENTER );
// Or, set a custom point to rotate around
txt -> rx = 50 ;
txt -> ry = 75 ;
// Set the rotation angle directly
txt -> rotate = 90 ;
像这样更改文本的颜色:
// Default is 1.0 for each, a white color filter
txt -> color . r = 0.5 ;
txt -> color . g = 1.0 ;
txt -> color . b = 0.0 ;
txt -> color . a = 0.7 ;
最后,使用以下命令绘制文本:
S2D_DrawText ( txt );
您还可以随时更改短信:
S2D_SetText ( txt , "A different message!" );
// Format text just like `printf`
S2D_SetText ( txt , "Welcome %s!" , player );
由于文本是动态分配的,因此可以使用以下方法释放它们:
S2D_FreeText ( txt );
Simple 2D 支持多种流行的音频格式,包括 WAV、MP3、Ogg Vorbis 和 FLAC。音频概念有两种:声音和音乐。声音是简短的样本,不间断地播放,就像效果一样。音乐适用于较长的片段,可以播放、暂停、停止、恢复和淡出,就像背景配乐一样。
首先声明一个指向S2D_Sound
结构的指针来创建声音,并使用提供音频文件路径的S2D_CreateSound()
对其进行初始化。
S2D_Sound * snd = S2D_CreateSound ( "sound.wav" );
如果找不到音频文件,它将返回NULL
。
像这样播放声音:
S2D_PlaySound ( snd );
您可以像这样获取和设置声音的音量:
int volume = S2D_GetSoundVolume ( snd );
S2D_SetSoundVolume ( snd , 50 ); // set volume 50%
此外,获取并设置所有声音的音量,如下所示,其中音量范围介于 0(最轻)和 100(最响)之间:
int volume = S2D_GetSoundMixVolume ();
S2D_SetSoundMixVolume ( 50 ); // set volume 50%
由于声音是动态分配的,因此可以使用以下方法释放它们:
S2D_FreeSound ( snd );
同样,通过声明指向S2D_Music
结构的指针来创建一些音乐,并使用提供音频文件路径的S2D_CreateMusic()
对其进行初始化。
S2D_Music * mus = S2D_CreateMusic ( "music.ogg" );
如果找不到音频文件,它将返回NULL
。
像这样播放音乐,其中第二个参数是一个布尔值,指示音乐是否应该重复:
S2D_PlayMusic ( mus , true); // play on a loop
一次只能播放一首音乐。以下用于暂停、恢复、获取和设置音量、停止和淡出的函数适用于当前正在播放的任何音乐:
S2D_PauseMusic ();
S2D_ResumeMusic ();
S2D_StopMusic ();
int volume = S2D_GetMusicVolume ();
S2D_SetMusicVolume ( 50 ); // set volume 50%
// Fade out over 2000 milliseconds, or 2 seconds
S2D_FadeOutMusic ( 2000 );
由于音乐是动态分配的,因此可以使用以下方法释放它们:
S2D_FreeMusic ( mus );
简单的 2D 可以捕获几乎任何事物的输入。让我们学习如何从鼠标、键盘和游戏控制器获取输入事件。
窗口捕获三种类型的键盘事件:按下某个键、按住某个键、释放某个键。当键盘事件发生时,窗口调用其on_key()
函数。
要捕获键盘输入,首先定义on_key()
函数并从S2D_Event
结构中读取事件详细信息,例如:
void on_key ( S2D_Event e ) {
// Check `e.key` for the key being interacted with
switch ( e . type ) {
case S2D_KEY_DOWN :
// Key was pressed
break ;
case S2D_KEY_HELD :
// Key is being held down
break ;
case S2D_KEY_UP :
// Key was released
break ;
}
}
然后,将回调附加到窗口:
window -> on_key = on_key ;
可以随时从窗口读取鼠标或触控板的光标位置。请注意,左上角是原点(0, 0)
。
window -> mouse . x ;
window -> mouse . y ;
要捕获鼠标按钮输入,首先定义on_mouse()
函数并从S2D_Event
结构中读取事件详细信息,例如:
// `e.button` can be one of:
// S2D_MOUSE_LEFT
// S2D_MOUSE_MIDDLE
// S2D_MOUSE_RIGHT
// S2D_MOUSE_X1
// S2D_MOUSE_X2
void on_mouse ( S2D_Event e ) {
switch ( e . type ) {
case S2D_MOUSE_DOWN :
// Mouse button was pressed
// Use `e.button` to see what button was clicked
// Check `e.dblclick` to see if was a double click
break ;
case S2D_MOUSE_UP :
// Mouse button was released
// Use `e.button` to see what button was clicked
// Check `e.dblclick` to see if was a double click
break ;
case S2D_MOUSE_SCROLL :
// Mouse was scrolled
// Check `e.direction` for direction being scrolled, normal or inverted:
// S2D_MOUSE_SCROLL_NORMAL
// S2D_MOUSE_SCROLL_INVERTED
// Check `e.delta_x` and `e.delta_y` for the difference in x and y position
break ;
case S2D_MOUSE_MOVE :
// Mouse was moved
// Check `e.delta_x` and `e.delta_y` for the difference in x and y position
break ;
}
}
然后,将回调附加到窗口:
window -> on_mouse = on_mouse ;
使用以下命令隐藏窗口上的光标(并再次显示):
S2D_HideCursor ();
S2D_ShowCursor ();
所有游戏控制器都会自动检测、添加和删除。窗口捕获两种类型的事件:轴运动和按钮按下。当按下按钮或移动操纵杆时,窗口调用其on_controller()
函数。按钮和轴映射到通用 Xbox 控制器布局。
要捕获控制器输入,首先定义on_controller()
函数并从S2D_Event
结构中读取事件详细信息,例如:
void on_controller ( S2D_Event e ) {
// Check `e.which` for the controller being interacted with
switch ( e . type ) {
case S2D_AXIS :
// Controller axis was moved
// Use `e.axis` to get the axis, either:
// S2D_AXIS_LEFTX, S2D_AXIS_LEFTY,
// S2D_AXIS_RIGHTX, S2D_AXIS_RIGHTY,
// S2D_AXIS_TRIGGERLEFT, S2D_AXIS_TRIGGERRIGHT,
// or S2D_AXIS_INVALID
// Use `e.value` to get the value of the axis
break ;
// For the following button events, use `e.button`
// to get the button pressed or released, which can be:
// S2D_BUTTON_A, S2D_BUTTON_B, S2D_BUTTON_X, S2D_BUTTON_Y,
// S2D_BUTTON_BACK, S2D_BUTTON_GUIDE, S2D_BUTTON_START,
// S2D_BUTTON_LEFTSTICK, S2D_BUTTON_RIGHTSTICK,
// S2D_BUTTON_LEFTSHOULDER, S2D_BUTTON_RIGHTSHOULDER,
// S2D_BUTTON_DPAD_UP, S2D_BUTTON_DPAD_DOWN,
// S2D_BUTTON_DPAD_LEFT, S2D_BUTTON_DPAD_RIGHT,
// or S2D_BUTTON_INVALID
case S2D_BUTTON_DOWN :
// Controller button was pressed
break ;
case S2D_BUTTON_UP :
// Controller button was released
break ;
}
}
然后,将回调附加到窗口:
window -> on_controller = on_controller ;
有关如何与游戏控制器交互的详尽示例,请参阅controller.c
测试。
您肯定会找到还没有按钮映射的控制器,特别是如果它们是全新的。有关如何生成映射字符串的示例,请参阅社区来源的控制器映射数据库。获得映射字符串后,您可以使用S2D_AddControllerMapping()
注册它,或者使用S2D_AddControllerMappingsFromFile()
从文件添加多个映射并提供文件路径。
“简单可能比复杂更难:你必须努力理清思路,使其变得简单。但最终这是值得的,因为一旦你做到了这一点,你就可以移山。” — 史蒂夫·乔布斯
尽管计算机图形硬件和软件不断进步,但简单的图形编程入门并不是那么容易或容易实现。我们正在努力改变这一点。
如果您喜欢该项目,请考虑贡献!查看未解决的问题以获取想法,或提出您自己的建议。我们一直在寻找使项目更具吸引力并改善每个平台上的开发人员体验的方法。如果您不是 C 或图形 API 方面的专家,请不要担心 — 我们很乐意引导您完成这一切。
如果您是一名铁杆 C 和操作系统黑客,您应该认真考虑为 SDL 做出贡献,这样我们就可以继续编写游戏,而不必担心下面的平台细节。查看 Steam 开发日的演讲,尤其是 Ryan C. Gordon 关于使用 SDL 2.0 进行游戏开发的演讲。
simple2d.sh
中的 SDL 版本deps
存储库进行任何更新(按照自述文件中的说明进行操作),并在此存储库中运行git submodule update --remote
来更新子模块simple2d.sh
和simple2d.cmd
中的 Simple 2D 版本号,提交更改release
make/nmake 目标创建 Windows 安装程序(适用于 Visual C++ 和 MinGW)和 Apple 库v#.#.#
;将 Windows 安装程序和 Apple 库附加到发行说明中shasum -a 256 <file>
计算版本和框架存档的新sha256
校验和brew audit --strict ./simple2d.rb
来检测公式的任何问题brew install ./simple2d.rb
测试公式的安装Simple 2D 是由 Tom Black 创建的,他认为简单的图形编程太困难,并决定对此做点什么。
一切都是麻省理工学院许可的,所以破解吧。
享受!