gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:16 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com