Git Product home page Git Product logo

kiwano's People

Contributors

lenheart357 avatar nomango avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

kiwano's Issues

日志系统的增强

需求描述

  • 提供 LogLevel 日志等级,实现分级管理日志
  • 提供 LogProvider 类,实现具体的日志写入功能
  • 从 LogProvider 派生到 ConsoleLogProvider 和 FileLogProvider ,分别提供控制台输出和文件输出日志
  • 提供 LogFormater 类,实现日志内容的格式化
  • 从 LogFormater 派生到 TextLogFormater,实现默认的日志格式化方式
  • 实现 LogBuffer 日志缓冲区,派生自 std::streambuf,实现基于 vector 的缓冲

事件映射、分发与监听

需求描述

重做事件分发机制,实现事件类型枚举。
使用 intrusive list 实现监听器和监听器管理器。

Node 应继承 EventDispatcher,但 Node 也同时继承自 intrusive::ListItem<>,事件分发时应逐节点进行分发,所以 EventDispatcher 应设计成一个 interface。

考虑是否需要一个事件管理器,缓存消息队列,然后在主循环中进行分发。

游戏窗口全屏

要支持游戏窗口全屏需要考虑的因素有:

  • 保证 UI 布局不被打乱,可能需要支持 AnchorPanelStackPanelBorderPanelHPanelVPanel
  • 游戏主体场景需要居中显示
  • 游戏需要分为 UI 层和 Game 层

涉及到的改动较多,该 Issue 暂时不考虑实现。

移动窗口时程序卡死

BUG 表现

用鼠标拖动标题栏移动窗口时,游戏会卡死

复现步骤

  1. 启动游戏
  2. 让节点执行动画
  3. 拖动窗口标题
  4. 从开始拖动到松开鼠标的这段时间游戏会卡死,节点的动画停止了

预期行为

拖动标题不应该影响游戏进行

增加Gif节点

帧动画不管是从设计,还是代码上来说,实现起来都非常麻烦。增加一种 GifImage 类,继承自 Node 类,使其完成动态显示 gif 的功能。

GifImage需要支持的功能:

  • 从本地图片或资源加载 gif

  • 设定 gif 播放次数(设定为-1为循环播放)

  • 获取 gif 的帧数

  • 获取 gif 的播放时长

  • 获取所有帧(取出的类型为 vector<Image>

  • 插入一帧(接口类似:gif->insertImage(0, image)

节点的拷贝构造函数

应禁止一部分类的克隆功能,但是现在允许从拷贝构造函数创建新对象:

auto node1 = new Node();
auto node2 = new Node(*node1);

如果对象中有指针类型的成员,这么拷贝出的对象就有很大的隐患

基于ID2D1Geometry实现形状

目前形状的渲染是 renderTarget->DrawXXX 实现的,资料显示每次调用 DrawXXX 函数都会创建一个新的 ID2D1Geometry 对象,所以这种方式会影响速度。

ID2D1Geometry 对象作为形状的成员对象,优化渲染速度,并重写碰撞判断方法。

无法编译DEMO

简述

使用NuGet安装了Kiwano包。然后编译用户手册中的[快速上手代码],提示“无法解析外部符号”。不是很熟悉VS上的逻辑,安装好包后是否还要手动配置路径并指定要链接的库?


测试了下x86环境下能编,x64不行。这是特性还是Bug?

环境

1.2.26,Win11,VS2022

Layer图层类

一个游戏可能分为多个层次,如 UI 层、Game 层等,增加 Layer 类实现画面分层的功能,以及设定图层大小等。

现在窗口消息的处理方式不适合和图层类结合,如果窗口消息改为一级一级传递的方式,那么可以在图层上增加吞噬消息的功能。

画布功能

实现一种新节点类型 —— 画布,画布代表一个矩形区域,用户可以直接在该区域内绘制图像。

伪代码如下

class MyCanvas : public e2d::Canvas
{
public:
    onRender()
    {
        // 设置画笔填充色为蓝色
        this->setFillColor(Color::Blue);
        // 在画布上绘制一个矩形
        this->drawRect(Rect(0, 0, 150, 100));
    }
};

具体实现上,看看是否有必要使用基于 D2D1Layer 在图层上进行渲染。

drawXxxx 方法可以看做一个命令,调用时不应该直接渲染,而是保存到一个命令队列中,场景整体渲染时再遍历命令,进行各种渲染操作。

同时删除 Shape 类相关代码,统一用画布实现绘图。

不再需要继续 #9 & #10

可以组合的任意形状

这个 Issue 应在 #9 完成后再考虑实现。

使用 ID2D1GeometrySinkID2D1PathGeometry 完成任意形状的组合。

在“输出”窗口显示警告信息

取消 WARN 和 WARN_IF 宏,改为使用 inline 函数在 “输出” 窗口输出警告信息。

在 Config 中提供 Debug 模式,仅当在 Debug 下编译且开启了 Debug 功能时,显示警告信息。

GC的模式需要重新设计

beta7 版本中的 Create 函数风格和 e2d 格格不入,我觉得不能因为它方便就接受它,因为它看起来不属于任何模块,所以现在它直接写在了头文件中。

而且现在 GC 的设计也让我不满意,它应该有一个类似 runtime.GC() 的方法,或者 ForceGC 之类的方法,不过这俩是我口胡的,还需要详细设计。

增加Config配置类

将所有的游戏配置相关的属性集中到Config类中,如节点默认中心点位置、节点默认碰撞体类型、是否打开碰撞监听等

增加按键和鼠标 Press 消息

需求描述

现在按键消息类型只有 Up 和 Down 两种,鼠标点击也只有这两种类型的消息,如果可以的话需要提供新的消息类型 KeyEvent::Type::Press 和 MouseEvent::Type::XxxPress ,在按键按下的一瞬间触发

加载本地字体

使用 Direct2D 中的 IDWriteFontFace 可以很轻松地实现加载本地字体的功能,外部接口可以如下设计:

auto font = new Font();
font->loadFromFile("font.ttf");

auto text = new Text();
text->setFont(font);

需要重做的单例模式

由于最初设计的一些模块仅仅是封装了windows api,为了调用方便,我把它们设计成了类的静态方法,但是这种写法显然不够 优雅。基础模块设计为单例模式更合理,例如 base/Gamebase/Window 等等,它们需要重做一番。

播放器支持mp3格式解码

Music 类目前只支持wav格式音频的解码,需要加入常见格式(如mp3)的自动解码

在 MSDN 中还没有找到和 XAudio2 解码 mp3 的相关资料,实现起来可能有些困难。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.