javascript - 将 C++ 虚拟方法绑定(bind)到具有覆盖功能的 js

标签 javascript c++ node.js v8 node-modules

假设我有一个 C++ 类:

class cRenderer {
    ...
    virtual void draw();
    ...
}

这是渲染引擎的一部分,因此任何继承 cRenderer 的 C++ 类都可以覆盖 draw方法并在屏幕上绘制内容。

问题是我如何使用 v8 绑定(bind)实现相同的行为(这最终将成为一个 Node.js 模块)?

有人可能会说,我能做到:

class cApplication : public cRenderer, public node::ObjectWrap
{
    ... define bindings ...
}

然后在我的 javascript 中我做了类似的事情:

var app = new cApplication();
var oldDraw = app.draw; //saving old instance of draw
app.draw = function() {
    ... do drawing api calls ...
    oldDraw(); //calling old draw
}

这行不通,因为所有绘图 API 调用都发生在 draw 之外。

更具体地说,JS 绑定(bind)如何在 draw 方法中插入动态 api 调用?如何解决这个问题?请记住,编辑渲染引擎的架构不是一种选择。

编辑:

draw 的外部和内部我的意思是:

drawCircle(100, 100, 11); //outside of render loop
draw(); //nothing happens at this point.

但是如果你在 draw 方法中进行了调用:

void draw()
{
    //inside of render loop
    drawCircle(100, 100, 11); //it draws a circle at (100, 100) with radius 11
}

最佳答案

我的 Sciter引擎使用所谓的直接绘图模型。我高度怀疑你正试图在这里做同样的事情。

绘图的直接模型:

Sciter 中的任何 DOM 元素都可能附加有“绘制处理程序”:

var someEl = ...

someEl.paintBackground = function(gfx) {... }
someEl.paintContent = function(gfx) {... }
...

当需要绘制元素时,本地代码将调用此类绘制器。 为了以防万一,在 HTML/CSS 中,元素绘图被分成多个层:背景、内容、前景/轮廓。

例如,原生 draw_background 的实现方式如下:

class Element {

   void draw_background(graphics* gfx) {
      if( has_paintBackground() ) { 
        if(invoke(paintBackground, object_wrap(gfx)) == TRUE_VALUE)
           return; // default background drawing was suppressed by script
      }
      default_draw_background(gfx);
   }
}

在这种情况下,脚本可能会在元素的背景层下面、上面甚至完全代替默认渲染器绘制一些东西。

更新:

由 object_wrap(gfx) 生成的脚本对象仅在渲染调用内连接到真实渲染表面。任何在其他地方存储和使用该 gfx 对象的尝试都会引发错误:“无效渲染表面”。

我不确定,但怀疑您需要这样的东西。

关于javascript - 将 C++ 虚拟方法绑定(bind)到具有覆盖功能的 js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24703133/

相关文章:

node.js - Node 中的 HTTPS TLS 设置

node.js - 如何在 WHM CentOS7 中为与虚拟主机一起安装的 Socket.IO 设置 SSL?

JavaScript 日期对象增量出错

javascript - 通过 Javascript 添加时显示额外模板项的 HTML 模板

c++ - 换档时的奇怪行为

c++ - 用于即时压缩和二进制搜索的最佳压缩库/格式?

node.js - 不同语言的生产者和消费者的 Redis 消息队列

javascript - 修改 li 的子集

Javascript删除字符串中的所有 '|'

c++ - 我应该在任何地方都使用 PIMPL 吗?