假设我有一个 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/