1

我设法让 DukTape 在我的 GLUT 项目中工作(它能够使用 duk_eval_string(); 运行内联 javascript)。是否可以使用 DukTape 在 C++ GLUT 窗口中显示带有 javascript 图形的静态 html 画布?

4

1 回答 1

3

在 Duktape 中无法使用 HTML5 画布绘制方法。Duktape 是一个 Javascript 引擎,这意味着它允许您执行符合 ES5/5.1 的代码。显示 HTML 画布是 Duktape 无法完成的任务。

如果您最终想要实现这一点,请尝试搜索一个库来实现这样的任务,也许看看 Firefox 源代码。如果您想完全从头开始,您需要为您想要的每个绘制方法添加C 函数绑定(duktape.org/ 上的示例)。一个例子是这样的:

// C/C++ code:
// C function to be used in the Javascript engine 
int js_draw_rect(duk_context *ctx) {
    // get parameters from javascript function call
    int pos_x = duk_get_number(ctx, -4);
    int pos_y = duk_get_number(ctx, -3);
    ...

    // C/C++ code to draw the rectangle (in your case probably GLUT)
    draw_rectangle(pos_x, pos_y, ...);
    return 0;
}

int main(void) {
    duk_context *ctx;
    ...

    // this snippet adds a binding for the function 'js_draw_rect' so it can be called from Javascript code
    duk_push_global_object(ctx);
    duk_push_c_function(ctx, js_draw_rect, 4/*number of args the JS function has*/);
    duk_put_prop_string(ctx, -2 /*idx:global*/, "drawRect"/*name of function in JS environment*/);
    duk_pop(ctx);
}

// Javascript code:
drawRect(50, 50, 100, 200);
...

此方法允许您创建处理所有绘图的 C/C++ 函数,然后将它们全部绑定到 Javascript 引擎,以便可以在 JS 中调用它们。

于 2015-03-14T22:46:36.623 回答