赞 | 400 |
VIP | 0 |
好人卡 | 24 |
积分 | 250 |
经验 | 45372 |
最后登录 | 2024-7-2 |
在线时间 | 3339 小时 |
Lv5.捕梦者 (版主)
- 梦石
- 1
- 星屑
- 23994
- 在线时间
- 3339 小时
- 注册时间
- 2011-7-8
- 帖子
- 3926
|
6楼
楼主 |
发表于 2022-4-8 14:35:29
|
只看该作者
本帖最后由 guoxiaomi 于 2022-4-8 14:47 编辑
清明节前后有几天空闲时间,写好了引擎的核心框架:
rgm_v0.1.2.zip
(5.15 MB, 下载次数: 9)
,决定加入RG系列,命名为RGM,意为Modern RPG Maker。26个字母快不够用了
双击 main.exe 就会执行 main.rb 中的代码。核心代码在 src/core 里(模板元编程高能预警),思路跟主楼的区别不是很大,但是把SDL2和ruby都安排进来了。
这个核心框架有两个独立线程:逻辑线程(ruby)和渲染线程(SDL2),它们之间通过传递指令来交互,而后续的开发的主要工作就是堆上各种指令,这也算是一种模块化吧。
比如,下面的 test.hpp 中定义了2个指令:
1. fill_red 会把整个画面涂成红色
2. call_fill_red 定义了内部类 wrapper,并绑定其静态函数 call_fill_red 到 ruby 中,成为 Test 模块的 fill_red 方法。调用 Test.fill_red 时会向渲染线程发送指令 fill_red。
3. 指令可以定义类型对象 data,指定其需要的数据类别。可以定义run方法代表具体的操作,以及静态方法before和after代表在线程开始和结束时的额外任务。这些都是可选的,比如 call_fill_red 就只有 before 方法。
- #include "core/core.hpp"
- struct fill_red
- {
- using data = rgm::data<std::unique_ptr<cen::window>, std::unique_ptr<cen::renderer>>;
- void run(rgm::worker auto* worker)
- {
- cen::window& window = *worker->template get<std::unique_ptr<cen::window>>();
- cen::renderer& renderer = *worker->template get<std::unique_ptr<cen::renderer>>();
- printf("fill %d x %d.\n", window.width(), window.height());
- renderer.clear_with(cen::colors::red);
- renderer.present();
- }
- };
- struct bind_fill_red
- {
- static void before(rgm::worker auto* worker)
- {
- static const decltype(worker) w{ worker };
- struct wrapper
- {
- static VALUE call_fill_red(VALUE module)
- {
- printf("call fill red.\n");
- fill_red a{};
- w->send(std::move(a));
- return Qnil;
- }
- };
- VALUE rb_mTest = rb_define_module("Test");
- rb_define_module_function(rb_mTest, "fill_red", wrapper::call_fill_red, 0);
- }
- };
- namespace rgm::core
- {
- using list1_t = commandlist<bind_fill_red>;
- using list2_t = commandlist<fill_red>;
- using worker1_t = worker<commandlist<init_ruby, list1_t>, executor_ruby>;
- using worker2_t = worker<commandlist<init_sdl2, list2_t>, executor_sdl2>;
- using engine_t = scheduler<worker1_t, worker2_t>;
- template <>
- struct traits::magic_cast<scheduler<>*>
- {
- using type = engine_t*;
- };
- }
- int main(int argc, char* argv[])
- {
- printf("start rgm.\n");
- cen::library centurion;
- rgm::core::engine_t engine;
- engine.run();
- printf("exit rgm.\n");
- return 0;
- }
复制代码
个人觉得,核心框架应该是最难写的部分了,后面的难点大概是渲染流程(Graphics.update)和shader的应用(Bitmap.hue_change和Tone)。 |
|