eepp是一个开源跨平台游戏和应用程序开发框架,主要专注于丰富的图形用户界面的开发。
官方支持 Linux、Windows、macOS、Android 和 iOS。
使用 emscripten 导出到 HTML5,但有一些小限制。
也适用于 BSD 和 Haiku。
基本小部件将应用程序/游戏对象作为节点进行管理,具有所有基本输入交互事件(单击、按键、鼠标悬停、焦点等)。
功能齐全的UI系统,动画支持,缩放,旋转,剪辑,事件,消息等。
主题和皮肤/装饰支持。
像素密度支持(由屏幕像素密度定义的 UI 元素缩放)。
所有基本的小部件都已实现(按钮、文本框、组合框、输入框、菜单、列表框、滚动条等)。
获得失效支持。它可以用来制作真正的应用程序,资源使用率低(仅在需要时重绘)。
布局系统类似于 Android 布局( LinearLayout、RelativeLayout、GridLayout )。
文本选择、复制和粘贴以及按键绑定等高级功能。
从 XML 加载布局并设计样式
使用层叠样式表进行样式设置
OpenGL 2(固定管道)、OpenGL 3(可编程管道)、OpenGL ES 2、OpenGL ES 1 和 OpenGL Core Profile 的渲染器。
批处理渲染器(所有渲染均由引擎自动批处理)。
字体支持(TrueType、BMFont 和 XNA 字体)。
帧缓冲区支持。
着色器支持(通过自动固定管道着色器到可编程转换器)。
顶点缓冲区对象支持。
粒子系统。
可扩展控制台。
动画精灵。
纹理图集支持(自动创建和更新纹理图集,包括编辑器)。
剪贴蒙版(模板、剪刀、飞机)
九个补丁可调整大小的位图支持。
基元可绘制对象。
支持多种图像格式(包括光栅化 SVG),支持压缩纹理(如果可能,直接上传到 GPU)。
基于后端的模块,这意味着您可以轻松地为窗口/输入处理创建后端。
目前支持 SDL 2 作为后端。
剪贴板支持。
硬件光标。
显示管理器
操纵杆支持。
提供库的完整多线程支持、打包文件格式支持、时钟、资源管理器、转换器等的所有基础知识。
虚拟文件系统类(将资产提供者抽象为单个虚拟文件系统,将zip文件和本地文件系统抽象为一个以透明加载资源,类似于PhysicsFS)。
可定制的内存管理器。默认情况下在调试模式下用于跟踪内存泄漏。
UTF8、UTF-16、UTF-32、Ansi、Wide Char 支持。
内部使用 UTF-32 字符的 String 类。
调试宏
通用函数和模板(矢量、四边形、多边形等)。
带有缓动的插值类。
一些次要的数学实用程序,包括 Mersenne Twister 随机数生成器实现、柏林噪声等。
使用 HTTP 客户端进行 Web 请求,并支持 TLS (由 mbedtls 或 openssl 提供)。
异步 HTTP 请求。
使用 FTP 客户端和 FTPS 客户端进行文件传输(具有显式 TLS 的 FTP)。
TCP 和 UDP 套接字。
HTTP 内容编码和传输编码支持。
HTTP 代理支持。
HTTP 压缩响应支持。
还有 HTTP 恢复/继续下载支持和自动跟随重定向。
基于节点的系统,可轻松管理场景。
完全控制节点事件(点击、鼠标悬停、焦点等)。
事件系统。
节点消息系统。
节点的可编程操作(淡入淡出、旋转、移动、缩放等)。
带有软件动态灯光的平铺地图。
全功能地图编辑器。
非常简单的 UI 编辑器。从 XML 文件加载布局并实时查看所做的更改。
纹理图集编辑器。一个非常简单的工具,允许开发人员创建和编辑纹理图集。
地图编辑器:用于游戏引擎的高级但简单的地图编辑器。它缺乏几个功能,因为我没有时间研究它,这个特殊的工具可能会在不久的将来因 TMX 地图支持而消亡(但我不是 TMX 地图的粉丝,所以没有决定那一刻)。
文档位于此处。我目前正在努力改进它。目前该项目大约 50% 已记录在案,因此仍需要大量工作。请检查位于src/examples
中的代码示例,您还可以查看测试 ( src/test
) 和工具 ( src/tools
)。
我正在努力改进 UI 模块的文档,因为当前是最重要和最复杂的模块,但缺乏适当的文档。如果您有任何疑问可以随时联系我。
存储库使用 git 子模块,因此您需要克隆存储库及其子模块,为了轻松实现此目的,您可以简单地克隆:
git clone --recurse-submodules https://github.com/SpartanJ/eepp.git
ecode 是一个受 lite 启发的代码编辑器。它使用基于默认 Plasma 深色主题的最新纯 CSS 主题:Breeze Dark。
实时显示任何布局和 CSS 的更改的编辑器,有助于加快用户界面的开发。屏幕截图中显示了 eepp 中可用的一些默认小部件。
小工具,用于创建和编辑纹理图集。
使用默认皮肤主题的 2D 地图编辑器(使用带有 9 块图像的单个纹理图集)。
对于任何 Android 开发人员来说,它看起来都应该非常熟悉。这是一个以垂直线性布局显示最基本的小部件的窗口。
< window layout_width = " 300dp " layout_height = " 300dp " window-flags = " default|maximize|shadow " >
< LinearLayout id = " testlayout " orientation = " vertical " layout_width = " match_parent " layout_height = " match_parent " layout_margin = " 8dp " >
< TextView text = " Hello World! " gravity = " center " layout_gravity = " center_horizontal " layout_width = " match_parent " layout_height = " wrap_content " backgroundColor = " black " />
< PushButton text = " OK! " textSize = " 16dp " icon = " ok " gravity = " center " layout_gravity = " center_horizontal " layout_width = " match_parent " layout_height = " wrap_content " />
< Image src = " thecircle " layout_width = " match_parent " layout_height = " 32dp " flags = " clip " />
< Sprite src = " gn " />
< TextInput text = " test " layout_width = " match_parent " layout_height = " wrap_content " />
< DropDownList layout_width = " match_parent " layout_height = " wrap_content " selectedIndex = " 0 " >
< item >Test Item</ item >
< item >@string/test_item</ item >
</ DropDownList >
< ListBox layout_width = " match_parent " layout_height = " match_parent " layout_weight = " 1 " >
< item >Hello!</ item >
< item >World!</ item >
</ ListBox >
</ LinearLayout >
</ window >
UI介绍可以在这里找到。
真实代码看起来如何?
UITextView::New ()->setText( " Text on test 1 " )
->setCharacterSize( 12 )
->setLayoutMargin( Rect ( 10 , 10 , 10 , 10 ) )
->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent )
->setParent( layout );
元素样式可以通过级联样式表的自定义实现来完成,可以使用最常见的 CSS2 规则,以及一些 CSS3 规则(一些示例:动画、过渡、自定义属性、媒体查询、@font-face at 规则、:root 元素) 。下面是一个有关 CSS 外观的小示例:
@font-face {
font-family : "OpenSans Regular" ;
src : url ( "https://raw.githubusercontent.com/SpartanJ/eepp/develop/bin/assets/fonts/OpenSans-Regular.ttf" );
}
@import url ( "assets/layouts/imported.css" ) screen and ( min-width : 800 px );
: root {
--font-color : black;
--background-input-color : rgba ( 255 , 255 , 255 , 0.7 );
--border-color : black;
--border-width : 1 dp ;
}
. screen TextView {
color : var ( --font-color );
}
. form {
background-image : @drawable /back;
background-repeat : no-repeat;
background-size : cover;
}
. form . form_inputs {
background-color : var ( --non-existent , var ( --background-input-color ));
margin-left : 100 dp ;
margin-right : 100 dp ;
padding-top : 72 dp ;
padding-left : 57 dp ;
padding-right : 57 dp ;
padding-bottom : 115 dp ;
}
. screen TextView . input ,
. screen TextInput . input {
font-family : AkzidenzGroteskBQ-Cnd;
layout-width : match_parent;
layout-height : 80 dp ;
border-color : var ( --border-color );
border-width : var ( --border-width );
color : var ( --font-color );
padding-left : 40 dp ;
padding-right : 40 dp ;
margin-bottom : 32 dp ;
skin : none;
hint-font-family : AkzidenzGroteskBQ-Cnd;
hint-font-size : 46 dp ;
hint-color : # 818285 ;
background-color : # FFFFFF00 ;
transition : all 0.125 s ;
}
. screen TextInput . input : focus {
background-color : # FFFFFF66 ;
border-color : # 796500 ;
}
. screen TextInput . input : hover {
background-color : # FFFFFF66 ;
}
@media screen and ( max-width : 1024 px ) {
. form . form_inputs {
background-color : red;
}
}
完整的 CSS 规范可以在文档中找到:这里。
您还可以在 eepp: 此处查看纯 CSS 主题的外观。
由于 eepp 支持 emscripten,您可以快速查看该库当前提供的一些示例、演示和工具。请注意,您会发现基于 emscripten 目前的限制(无法访问文件系统、没有自定义光标等)的一些差异,并且演示未针对大小进行优化,并且它们比应有的要大是。注意:请使用具有良好 WebGL 和 WASM 支持的现代浏览器(Chrome/ium 70+ 或 Firefox 80+)。
ecode - 代码编辑器
用户界面编辑器
用户界面你好世界
纹理图集编辑器
地图编辑器
字体示例
物理模块演示
精灵示例
全面测试
7GUIs 被称为“GUI 编程基准”,它用于比较不同的 GUI 库并探索每种库的 GUI 编程方法。 7GUIs 中提出的所有 7 个任务均已在 eepp 中实现。这些任务很好地代表了 eepp GUI 可以实现的目标,并且对于演示如何使用库实现不同的任务也非常有用。
7GUI 由以下任务组成:
Counter:演示和代码实现。
温度转换器:演示和代码实现。
Flight Booker:演示和代码实现。
定时器:演示和代码实现。
CRUD:演示和代码实现。
Circle Drawer:演示和代码实现。
Cells:演示和代码实现。
该库只有一个外部依赖项。您只需要安装了标头的SDL2库。还需要premake5或premake4来生成 Makefile 或项目文件来构建库。我假设您知道自己在做什么并跳过基础知识。
注意:eepp 默认使用 mojoAL 作为 OpenAL 的直接替代品。 OpenAL 可以选择用作音频后端。如果您想使用它,您可以选择启用它。要启用它并禁用 mojoAL 直接替换,您需要将参数--without-mojoal
添加到任何premake
调用(例如: premake5 --without-mojoal gmake2
)。
在 Ubuntu 系统中,它会是这样的(你也需要 gcc,但无论如何它都会安装):
sudo apt-get install premake5 libsdl2-2.0-0 libsdl2-dev libopenal1 libopenal-dev
克隆存储库并在存储库根目录上运行:
premake5 gmake2
或者如果你安装了 premake4 你可以运行:
premake4 gmake
然后构建库:
make -C make/linux
就是这样。这将构建整个项目。
您有两种选择:使用 Visual Studio 或使用 MinGW 构建。为了能够使用这些选项中的任何一个来构建项目,您首先需要使用 premake4 或 premake5 生成项目文件。然后,您需要将二进制文件添加到PATH
中定义的任何可执行路径(或添加一个,或从本地路径使用它)。根据您的需要下载Visual Studio或MinGW文件。
您将需要使用 premake5 并运行:
premake5.exe --windows-vc-build vs2022
然后项目文件应该在make/windows/
中找到。完整的解决方案和所有项目都将可用。安装完所有内容后,您将能够像任何其他项目一样构建Visual Studio解决方案。
使用 commnad 行参数--windows-vc-build
将自动下载 SDL2 依赖项,并将路径添加到构建过程以链接到它,而无需手动下载任何外部依赖项。
然后只需在 Visual Studio 中构建解决方案或在控制台中手动运行MSBuild
:
"%MSBUILD_PATH%MSBuild.exe" .makewindowseepp.sln -m
其中%MSBUILD_PATH%
是 MSBuild.exe Visual Studio 路径,例如对于VS2022 Community Edition,路径通常为:
C:Program FilesMicrosoft Visual Studio2022CommunityMSBuildCurrentBin
Windows MinGW 版本正在使用 w64devkit 发行版进行生成和测试。鉴于在构建过程中发现的一些问题,MSYS 目前尚未得到正式支持(但可以通过一些额外的步骤进行构建)。
如果您使用 w64devkit,则必须下载并解压它,我们假设它是在C:w64devkit
解压的。
以管理员身份执行C:w64devkitw64devkit.exe
( right click
-> Run as administrator
)。
然后转到eepp
克隆的存储库目录并运行:
premake5.exe --windows-mingw-build gmake2
--windows-mingw-build
将自动下载并链接外部依赖项(SDL2)。
然后只需使用mingw32-make.exe
或任何等效项构建位于make/windows/
中的项目:
mingw32-make.exe -C make\windows config=release_x86_64
要构建调试构建运行:
mingw32-make.exe -C make\windows config=debug_x86_64
然后确保将位于src/thirdparty/SDL2-2.XX.X/x86_64-w64-mingw32/bin/SDL2.dll
SDL2.dll
文件复制到bin
。如果由于某种原因eepp.dll
(或eepp-debug.dll
)没有被自动复制,您可以将它们从libs/windows/x86_64/
复制到bin
。
您将需要 SDL2 的预构建二进制文件和开发库,OpenAL 包含在操作系统中。安装 SDL2 框架,您应该能够构建项目。
您有两种选项来构建项目:使用XCode或使用Makefiles 。要首先使用这两个选项中的任何一个进行构建,您还需要使用 premake4 或 premake5 构建项目文件。
生成项目:
premake5 --use-frameworks gmake2
并构建它:
make -C make/macosx
您可以使用projects/osx/make.sh
脚本来生成Makefile并构建项目。
跑步:
premake5 --use-frameworks xcode4
并打开在make/macosx/
生成的 XCode 项目,或者简单地从命令行构建:
xcodebuild -project make/macosx/project-name.xcodeproj
在projects/android-project/
中有一个gradle项目。它将构建包含所有依赖项的库。使用示例项目作为您的项目的基础。请注意,有一个用于构建该库的eepp.mk
项目文件。该文件可以在您的项目中使用。
该项目提供了两个文件来构建库和演示。您可以根据需要使用其中任何一个。这些文件位于projects/ios
中:
该脚本可用于生成 eepp 中所有包含项目(演示、工具、共享库、静态库等)的 xcode 项目和解决方案。它还将下载并构建 SDL2 fat 静态库,以便能够将该库引用到项目中。遗憾的是,在构建项目后,您需要对您不想构建或测试的任何/所有项目进行一些细微的更改,因为生成的项目缺少一些细微的配置。运行此脚本后,您需要打开位于make/ios/eepp.xcworkspace
中的解决方案。要构建静态库,您不会发现任何问题(开箱即用)。但要测试一些示例,需要:
选择(单击项目名称)要测试的项目,例如eepp-empty-window
。您将看到几个选项卡/选项,转到Build Settings ,然后找到选项Info.plist文件,双击编辑并写入: Info.plist
。这将指示读取与项目位于同一目录中的文件。转到“常规”选项卡,并使用将生成的应用程序包的标识符名称来完成“包标识符” ,在此示例中,您可以使用类似以下内容的内容: eepp-empty-window
。这将允许您构建并运行该项目。
此eepp-empty-window
演示不使用任何资产/资源,但其他演示需要加载资产,并且需要将此资产添加到项目中才能可供应用程序包使用。例如,项目eepp-ui-hello-world
需要您将assets
文件夹添加到项目中。您需要做的是:选择项目并转到“构建阶段”选项卡,在“复制捆绑资源”中单击加号图标 (+),然后转到“添加其他...” ,找到并选择bin/assets/
文件夹,然后结束。那应该足够了。
该脚本可用于将 SDL2 和 eepp 构建为两个胖静态库,其中包含 arm64 和 x86_64 架构(iPhone/iPad 的 arm64 和模拟器的 x86_64)。要生成发布版本,请传递config=release
作为脚本的参数 ( sh compile-all.sh config=release
)。构建的文件将位于libs/ios/
中,如libSDL2.a
和libeepp.a
(或libeepp-debug.a
用于调试构建)。这两个文件可以集成到您的项目中。
您首先需要下载并安装 emscripten。然后在projects/emscripten/make.sh
中有一个用于构建emscripten项目的脚本。在运行此脚本之前,请记住设置 emsdk 环境,它应该类似于: source /path/to/emsdk/emsdk_env.sh
。这在GNU/Linux或macOS中应该足够了(仅在 GNU/Linux 上测试过)。
构建后,所有二进制文件都位于bin
目录中。二进制文件需要两个文件:eepp 库和 SDL2 库。 eepp 库将位于libs/{OS}/
中。构建脚本将尝试将 eepp 库符号链接到bin
中,如果失败,则应手动复制或符号链接。关于存储库中未提供的 SDL2 库,因此为了运行演示,您需要下载正确的 SDL2 库操作系统版本和体系结构。
该库已经开发了好几年,从一开始就经历了很多变化,我正在做任何我认为必要的更改来改进它,所以 API 仍然不完全稳定(但接近稳定)。它被用于多个面向宣传活动的应用程序中,这些应用程序主要是为 Android 设备和 Windows PC 开发的。
我个人从来没有时间用它来开发一个复杂的游戏(几个失败的项目),但我为客户制作了几个面向 UI 的游戏。
目前项目重点是UI模块。我将继续专注于此。
该计划是提供一个替代的 UI 工具包,完全硬件加速,类似于 Android 工具包,但更简单(易于使用)并且也面向桌面应用程序。
音频和网络模块基于 SFML 中的模块,但具有上述几个重要差异。
我喜欢使用做得好的并且适合我的需求的东西,但是由于我对如何实现一些东西有我个人的看法,所以我更喜欢使用代码,以完全控制它。
许多想法也取自其他项目。我可以考虑一些: cocos2d-x 、 raylib 、 Android SDK 、 libGDX 、 Godot 、 XNA 、 LÖVE和许多其他项目。
如果出于某种疯狂的原因,这一切对您来说很有趣,请联系我,让我知道我是否可以帮助您进入图书馆,并且如果您愿意,您将来可以为其做出贡献。这个项目比其他任何事情都更需要贡献者。
目前图书馆状况良好。就功能而言,应该与最常用的 2D 游戏引擎处于相似的位置。但当然缺乏可以从Godot或cocos2d-x获得的支持+社区。
该库的主要思想是专注于一种比其他选项更好的通用方法来开发基于 UI 的应用程序和游戏,并且具有更清晰的代码和实现。
我开发这个库的主要原因是为了乐趣和学习新技术。我喜欢花时间在图书馆上工作,但我知道可能没有真正的理由去开发这样的东西与大量类似的替代品。
关于代码质量:这个项目很早以前就开始了,随着时间的推移经历了很多修改。大部分代码库仍然使用旧的 C++ 实践(例如:原始指针、线程自己的实现、互斥体等)。其中一些东西可以“现代化”,但是,另一些东西没有多大意义,或者彻底修改它们将花费太多时间来证明这一努力的合理性。我正在致力于“现代化”代码的某些部分,新代码通常看起来更现代。
不断改进 UI 系统,添加新的小部件和布局并改进 CSS 支持。
简化并改进 UI 小部件皮肤/主题支持。
改进/创建 UI 模块的文档。
添加更多示例和一些工具。
添加脚本支持,但首先我想稳定该库,但我已经做到了。
添加 2D 骨骼动画支持(可能是 Spine2D,实现起来不需要太多工作)。
可能会弃用 Maps 模块,因为我将把精力集中在 UI 系统上。
Sean Barrett 负责 stb_image 和所有 stb 库。
Sam Latinga 用于简单 DirectMedia 层。
Jonathan Dummer 的简单 OpenGL 图像库。
SFML 的洛朗·戈米拉
尤里·科贝茨 for litehtml
Michael RP Ragazzon 的 RmlUI
精简版 rxi
SerenityOS 的 Andreas Kling
瑞安·C·戈登 (Ryan C. Gordon) 为 mojoAL 设计
大卫·里德 (David Reid) 的 dr_libs
Lion (Lieff) 适用于 minimp3 及更多
刘易斯·范·温克尔 (Lewis Van Winkle) 的 PlusCallback
Dieter Baron 和 Thomas Klausner 的 libzip
让-卢·盖利 (Jean-loup Gailly) 和马克·阿德勒 (Mark Adler) 的 zlib
米兰·伊基茨 (Milan Ikits) 和马塞洛·马加隆 (Marcelo Magallon) 为 GLEW 拍摄
米科·莫诺宁 (Mikko Mononen) 为 nanosvg 设计
斯科特·莱姆贝克 (Scott Lembcke) 为 Chipmunk2D 设计
克里斯托夫·里奇奥 (Christophe Riccio) 为 glm 设计
Rich Geldreich 用于图像重采样器和 jpeg 压缩器
Arseny Kapoulkine 的 pugixml
杰森·帕金斯的预拍
Martín Lucas Golini(我)以及 SOIL2 和 efsw 的所有贡献者
libogg 和 libvorbis 的 Xiph 开源社区
mbed TLS 的 ARMmbed 社区
用于 openal-soft 的 kcat
FreeType 项目
还有很多人!
麻省理工学院许可证