kiwanoengine / kiwano Goto Github PK
View Code? Open in Web Editor NEWA simple game framework for C++
Home Page: https://kiwanoengine.com
License: MIT License
A simple game framework for C++
Home Page: https://kiwanoengine.com
License: MIT License
将所有的游戏配置相关的属性集中到Config类中,如节点默认中心点位置、节点默认碰撞体类型、是否打开碰撞监听等
实现一种新节点类型 —— 画布
,画布代表一个矩形区域,用户可以直接在该区域内绘制图像。
伪代码如下
class MyCanvas : public e2d::Canvas
{
public:
onRender()
{
// 设置画笔填充色为蓝色
this->setFillColor(Color::Blue);
// 在画布上绘制一个矩形
this->drawRect(Rect(0, 0, 150, 100));
}
};
具体实现上,看看是否有必要使用基于 D2D1Layer 在图层上进行渲染。
drawXxxx
方法可以看做一个命令,调用时不应该直接渲染,而是保存到一个命令队列中,场景整体渲染时再遍历命令,进行各种渲染操作。
同时删除 Shape
类相关代码,统一用画布实现绘图。
由于最初设计的一些模块仅仅是封装了windows api,为了调用方便,我把它们设计成了类的静态方法,但是这种写法显然不够 优雅。基础模块设计为单例模式更合理,例如 base/Game
、base/Window
等等,它们需要重做一番。
DirectInput是一个较老的版本,需要更新为XInput,同时优化现有的输入判断方式
应禁止一部分类的克隆功能,但是现在允许从拷贝构造函数创建新对象:
auto node1 = new Node();
auto node2 = new Node(*node1);
如果对象中有指针类型的成员,这么拷贝出的对象就有很大的隐患
重做事件分发机制,实现事件类型枚举。
使用 intrusive list 实现监听器和监听器管理器。
Node 应继承 EventDispatcher,但 Node 也同时继承自 intrusive::ListItem<>,事件分发时应逐节点进行分发,所以 EventDispatcher 应设计成一个 interface。
考虑是否需要一个事件管理器,缓存消息队列,然后在主循环中进行分发。
一个游戏可能分为多个层次,如 UI 层、Game 层等,增加 Layer
类实现画面分层的功能,以及设定图层大小等。
现在窗口消息的处理方式不适合和图层类结合,如果窗口消息改为一级一级传递的方式,那么可以在图层上增加吞噬消息的功能。
编译环境:Win10 + Visual Studio 2017
在Win7上运行打包的 exe 文件,弹出需要 xaudio2_9.dll的提示
Music
类目前只支持wav格式音频的解码,需要加入常见格式(如mp3)的自动解码
在 MSDN 中还没有找到和 XAudio2
解码 mp3 的相关资料,实现起来可能有些困难。
使用NuGet安装了Kiwano包。然后编译用户手册中的[快速上手代码],提示“无法解析外部符号”。不是很熟悉VS上的逻辑,安装好包后是否还要手动配置路径并指定要链接的库?
测试了下x86环境下能编,x64不行。这是特性还是Bug?
1.2.26,Win11,VS2022
这个 Issue 应在 #9 完成后再考虑实现。
使用 ID2D1GeometrySink
和 ID2D1PathGeometry
完成任意形状的组合。
要支持游戏窗口全屏需要考虑的因素有:
AnchorPanel
、StackPanel
、BorderPanel
、HPanel
、VPanel
等涉及到的改动较多,该 Issue 暂时不考虑实现。
取消 WARN 和 WARN_IF 宏,改为使用 inline 函数在 “输出” 窗口输出警告信息。
在 Config 中提供 Debug 模式,仅当在 Debug 下编译且开启了 Debug 功能时,显示警告信息。
使用 Direct2D 中的 IDWriteFontFace
可以很轻松地实现加载本地字体的功能,外部接口可以如下设计:
auto font = new Font();
font->loadFromFile("font.ttf");
auto text = new Text();
text->setFont(font);
当按钮位置有覆盖时,阻止消息向下一个按钮传递。
帧动画不管是从设计,还是代码上来说,实现起来都非常麻烦。增加一种 GifImage
类,继承自 Node
类,使其完成动态显示 gif 的功能。
GifImage需要支持的功能:
从本地图片或资源加载 gif
设定 gif 播放次数(设定为-1为循环播放)
获取 gif 的帧数
获取 gif 的播放时长
获取所有帧(取出的类型为 vector<Image>
)
插入一帧(接口类似:gif->insertImage(0, image)
)
用鼠标拖动标题栏移动窗口时,游戏会卡死
拖动标题不应该影响游戏进行
现在按键消息类型只有 Up 和 Down 两种,鼠标点击也只有这两种类型的消息,如果可以的话需要提供新的消息类型 KeyEvent::Type::Press 和 MouseEvent::Type::XxxPress ,在按键按下的一瞬间触发
Player 的单例模式是个错误的设计,应该简化 Player 类的使用方式。
目前形状的渲染是 renderTarget->DrawXXX
实现的,资料显示每次调用 DrawXXX
函数都会创建一个新的 ID2D1Geometry
对象,所以这种方式会影响速度。
把 ID2D1Geometry
对象作为形状的成员对象,优化渲染速度,并重写碰撞判断方法。
beta7 版本中的 Create
函数风格和 e2d 格格不入,我觉得不能因为它方便就接受它,因为它看起来不属于任何模块,所以现在它直接写在了头文件中。
而且现在 GC
的设计也让我不满意,它应该有一个类似 runtime.GC()
的方法,或者 ForceGC
之类的方法,不过这俩是我口胡的,还需要详细设计。
禁用高DPI时,Direct2D没有按照正常情况进行渲染
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.