Embind /で動的バインディングを使用しましたemscripten::val
例 (emscripten v3.0.0):
#include <emscripten/val.h>
auto main() -> int {
const auto document = emscripten::val::global("document");
const auto canvas =
document.call<emscripten::val, std::string>("querySelector", "canvas");
auto ctx = canvas.call<emscripten::val, std::string>("getContext", "2d");
const auto width = canvas["width"].as<int>();
const auto height = canvas["height"].as<int>();
ctx.call<void>("clearRect", 0, 0, width, height);
// rect
ctx.set("fillStyle", "white");
ctx.call<void>("fillRect", 0, 0, width, height);
// line
ctx.set("strokeStyle", "black");
ctx.call<void>("moveTo", 0, 0);
ctx.call<void>("lineTo", width, height);
ctx.call<void>("stroke");
// text
ctx.set("fillStyle", "black");
ctx.set("font", "bold 48px serif");
ctx.call<void, std::string>("fillText", "Hello World!", width / 2,
height / 2);
return 0;
}
emcc src/main.cpp -g -s ENVIRONMENT='web' -std=c++20 --bind -o build/main.js
PS
emscripten に静的/定義済みバインディングが存在しない場合、または存在するものを使用したくない場合は、同じアプローチを使用して任意の Web API を操作できます。たとえば、 CanvasRenderingContext2D Web API にできる限り近づけたかったので、SDL は選択しませんでした。