今年出会った神曲10選

こんばんは。インフルエンザB型にかかりました shundroid です。

もうあと少しで 2017 年も終わりですね。早すぎっ

そして 2018 年が来るとすぐ受験かぁー・・がんばります。

さて今年はたくさんの神曲に出会うことができました。
修学旅行の DVD 作成とかで探しまくったからというのもありますがw

作曲してくださった方々、ありがとうございます。

それでは紹介していきます。
順位はつけづらいので、出会った順で紹介していきます。

Clutterfunk

まず最初はこの曲。Geometry Dash というゲームのステージ11で出会いました。
いきなり超個性的な曲になっちゃいましたが、すごく耳に残りますよね。
フィー↑っていう音が特徴的ですが曲とマッチしているというのがすごいです。

Geometry Dash については、下の記事を参照してください。

クリスマスプレゼントで Geometry Dash を 60% OFF で買った 【第二弾】
こんにちは。Besiege に続き、クリスマスプレゼントで、もう一つゲームを買いました。Geometry Dash です。Steam の Winter Sale で、60% OFF、159円 で売っていました...

このゲームの曲はすべて好きなので、紹介していくときりがないですw
1番最初の Stereo Madness も好きですが、これに出会ったのは・・2016年でしたw

ちなみに 10 ステージ目までクリアできました。
つまり、この Clutterfunk が使われている 11 ステージ目は・・クリアできなかったんです。。。
難しすぎます。挫折しました。そういう思い出もある曲です。

ゼルダの伝説 ブレスオブザワイルド メインテーマ

前の曲から一気に雰囲気が変わりました。次はゼルダの伝説からです。
この曲も大好きです。どんどん曲調が変わっていくので、聴きごたえがあります。

気づけば、Nintendo Switch が発売されたのも今年だったんですね。
遠い昔のように思えます。あの衝撃もすごかったなあ。
※持っていないです。

you

you という曲も実は今年初めて知りましたw
というのも、ゼルダの伝説 ブレスオブザワイルドの実況をしている、
ゼルダのセナさんという人が作った MAD にこの曲が使われていたからです。

このアレンジが特に好きです。連弾版ともちょっと違いますね。この MAD も好きです。
ひぐらしは怖いです(ブルブル)

Take Your Way

次はこの曲です。
セカオワの Fukase がボーカルをしています。
爽快感があふれる曲なので、修学旅行のDVD の出だしで使いました。
作曲者は Tell your world を作った人と同じらしいです。

Captain Jack (Grandale Remix)

続いてはこの曲。
知っている方もいるかと思いますが、出会いはマインクラフト荒らしたったwwです。
テンションが高いので、修学旅行のDVDの2日目夜に使用しました。

Zen

次はこの曲です。
流れるように続く音がすごくきれいですよね。
環境音も好きです。

作曲者は Warptech で、Daydream という曲で知りました。

※ SoundCloud の埋め込みは、uBlock などの広告ブロッカーを使っていると表示されないことがあります。

Athemos

次の曲も Warptech さんの曲です。
神秘的な感じと明るい感じがすごく好きです。

Unravel – Piano

次は東京喰種の Unravel のピアノアレンジです。
このアレンジが好きなんです。
この人うますぎでしょ。かっこいいなあ・・
強弱が激しいところが特に好きです。

Megalovania

次は UNDERTALE からの曲です。
ぽこにゃんという実況者とゼルダのセナさんが、UNDERTALE の実況をはじめたので知りました。
UNDERTALE 自体は知っていましたが、怖そうでなかなか手が出せませんでした。というか実際結構怖い。

The Everlasting Guilty Crown

最後に出会ったのは、The Everlasting Guilty Crown です。
ギルティクラウンというアニメの曲らしいのですが、アニメは見ていませんでした。
まらしぃが弾いていたので知りました。かっこいい。泣ける。

作曲者は ryo さんらしいですね。Odds & Ends を作った人と同じ人です。

まとめ

こんな感じで今年も多くの神曲に出会うことができました。
来年、2018年もたくさんの神曲が訪れますように。

受験生ですがインフルエンザになりました。

こんにちは。

9か月ぶりですね・・・・お久しぶりです。

実は今年ぼくは受験生になってしまい、とても忙しくて更新できませんでしたすみません。
事前に書いておけばよかったですね・・

しかしこの度、受験生だというのにかかわらず、インフルエンザになっちゃいましたw
それで時間があるので、ブログを更新しようと思います。

熱がでたのは月曜日。夕方すぐに病院に行って検査をしたら、
インフルエンザB型とのこと。

最低5日間は出席停止なので、1週間丸まる学校がつぶれることに。
うれしさ 63%。かなしさ 37%ですね。

実は3年くらいもうインフルエンザにかかっていなかったので、
けっこうびっくりです。

1,2か月後にかかるよりはましかもしれませんが。。

インフルエンザの時にやっていること

暇なので、いろんなことをやっています。

Spacechem

期末テスト後に買ったゲームで、めちゃくちゃ面白いです。

Steam:SpaceChem
Zachtronics Industries is back with an ambitious new design-based puzzle game. Take on the role of a Reactor Engineer working for SpaceChem, the leading chem...

見つけた瞬間やりたくて買わずにはいられなかったので、すぐ定価で買いましたが、
その数日後にオータムセールでめちゃめちゃ安くなるなんて聞いてなかったよーーーーー

最後のステージまで行きました。今奮闘中です。

クリアしたらたぶん記事を書くと思います。

追記(2017/12/31): クリアしました!

【Spacechem】最終ステージ「そして結末へ」クリアした!
こんにちは。shundroid です。2017 年も今日で最後ですねー。早いなあそして 2017 年中に、なんと、Spacechem をクリアすることができましたーーーー!!!!!!今年の...

東京都立高等学校入試問題そっくりもぎを、作った。

インフルエンザの直前にやったのですが、
都立高校入試問題の理科の問題形式をそっくりまねして、
問題だけ自校作成レベル(あるとしたら)の難易度にしてみました。

かなりそっくりです。自分でもびっくり。
解答用紙もそっくりに作りました。マークシートで。
学校に来ていた時に友達に渡して、解いてもらいました。
その後ぼくは保健室に行って教室に帰ることはなかったので結果はわかりませんw

自分が出会った難問をふんだんに盛り込んで、テストの形式も熟知できたので、
よいテスト対策になったことでしょう。(・・・????)

動画を上げた

撮影は今年の初めにしていたのですが、編集して動画を上げました。
Besiege というゲームで、2つのブロックでどれだけたくさんのステージを解けるのかに挑戦しました。
字幕だけだと寂しかったので、ゆっくり実況をつけました。

Youtube:

Niconico:

【Besiege】2つのブロックだけでできるだけ解いてみる【ゆっくり実況】
【Besiege】2つのブロックだけでできるだけ解いてみる【ゆっくり実況】 こんにちは。 今回は Besiege でSTARTING BLOCK + 1ブロックの2ブロックだけでステージを解...

Besiege については、下の記事をご覧ください。

クリスマスプレゼントで Besiege を 30% OFF で買った 【第一弾】
こんにちは。メリークリスマス!!(1日遅れ)いやー、今年は旧正月になる前にクリスマスプレゼントを買えましたw去年はなんか gdgd してたらセールが終わっちゃって...

テレビを見た

たまっていたイッテQと、激レアさんを連れてきた。を見ました。
インフルエンザは録画機器の味方ですね。どんどん空き容量が増えていきます。

ブログを久しぶりに上げた。

これです。

まとめ

正直暇ですが、ずっと忙しかったので、いい感じの休息になったのかもしれませんね。
皆さんも体調にはお気を付けください。

electron-vue で生成したプロジェクトで electron-connect を使う

こんにちは。

今回は electron-vue で生成したプロジェクトで、
BrowserProcess 側、RendererProcess 側、両方のコードのリロードをさせる方法を紹介します。

コードのリロードは、electron-connect を利用します。
こちらで紹介されていました。すごく便利です。

ぼくのかんがえたさいきょうのElectron - Qiita
# はじめに(http://electron.atom.io/)はNode.js + HTML5フロントエンドのいいとこ取りな開発が行えるのが特徴です。その分、開発環境もElectronならではの考慮・工夫が...

ソースコード

Github にて公開しています。

electron-connect に対応させる

プロジェクトの生成

electron-vue でのプロジェクトの生成方法は、下の記事がわかりやすかったので参考にしてください。

ElectronでVue.jsを始める - Qiita
今回は、EletronをVue.jsでどうやって使うか、セットアップをするかを記事に書いていきたいと思います。このアドベントカレンダーの23日目の、@nakajmgさんと内容が少...

generate-electron-vue

この記事では、↑の設定で生成しました。

npm でインストール

$ npm install --save-dev electron-connect

tasks/runner.js を変更

これは、 npm run dev したときに実行されるファイルです。

--- a/tasks/runner.js
+++ b/tasks/runner.js
@@ -3,6 +3,8 @@
 const config = require('../config')
 const exec = require('child_process').exec
 const treeKill = require('tree-kill')
+const electronConnect = require('electron-connect').server.create()
+const fs = require('fs')

 let YELLOW = '\x1b[33m'
 let BLUE = '\x1b[34m'
@@ -33,10 +35,14 @@ function run (command, color, name) {
      * Start electron after successful compilation
      * (prevents electron from opening a blank window that requires refreshing)
      */
-    if (/Compiled/g.test(data.toString().trim().replace(/\n/g, '\n' + repeat(' ', command.length + 2))) && !isElectronOpen) {
-      console.log(`${BLUE}Starting electron...\n${END}`)
-      run('cross-env NODE_ENV=development electron app/src/main/index.dev.js', BLUE, 'electron')
-      isElectronOpen = true
+    if (/Compiled/g.test(data.toString().trim().replace(/\n/g, '\n' + repeat(' ', command.length + 2)))) {
+      if (!isElectronOpen) {
+        console.log(`${BLUE}Starting electron...\n${END}`)
+        electronConnect.start()
+        isElectronOpen = true
+      } else {
+        electronConnect.reload()
+      }
     }
   })

@@ -54,3 +60,7 @@ function exit (code) {

 console.log(`${YELLOW}Starting webpack-dev-server...\n${END}`)
 run(`webpack-dev-server --hot --colors --config webpack.renderer.config.js --port ${config.port} --content-base app/dist`, YELLOW, 'webpack')
+
+let timeoutId = null
+fs.watch('app/src/main', () => {
+  if (!timeoutId) {
+    electronConnect.restart()
+    timeoutId = setTimeout(() => { timeoutId = null }, 500)
+  }
+})

普段僕はダブルクォーテーション&セミコロンを付けて開発しますが、
ここは合わせます。

変更点としては、

  • isElectronOpen が false のとき、electronConnect を start します。
    • この時 Electron が勝手に起動されます。
    • cross-env の設定をしていないように見えますが、index.dev.js を読み込んだ時に NODE_ENV を production にするようになっているので不要だと思います。
  • isElectronOpen が true のときは、electronConnect を reload します。
  • BrowserProcess 側で動くコードは変更されたら restart します。

package.json を変更

electron-connect では、直接ファイルを指定できないので、
代わりに package.json で指定しましょう。

--- a/package.json
+++ b/package.json
@@ -2,6 +2,7 @@
   "name": "electron-test",
   "version": "0.0.0",
   "description": "An electron-vue project",
+  "main": "app/src/main/index.dev.js",
   "scripts": {
     "build": "node tasks/release.js",
     "build:clean": "cross-env PLATFORM_TARGET=clean node tasks/release.js",

main プロパティを指定しました。

app/src/renderer/main.js を変更

次のように変更します。

--- a/app/src/renderer/main.js
+++ b/app/src/renderer/main.js
@@ -10,3 +10,7 @@ import App from './App'
 new Vue({
   ...App
 }).$mount('#app')
+
+if (process.env.NODE_ENV === 'production') {
+  require('electron-connect').client.create()
+}

webpack.renderer.config.js を変更

依存に指定されていないモジュールによるエラーが起きるので、モジュールを除外します。

--- a/webpack.renderer.config.js
+++ b/webpack.renderer.config.js
@@ -16,7 +16,11 @@ let rendererConfig = {
   entry: {
     renderer: path.join(__dirname, 'app/src/renderer/main.js')
   },
-  externals: Object.keys(pkg.dependencies || {}),
+  externals: Object.keys(pkg.dependencies || {}).concat([
+    "spawn-sync",
+    "utf-8-validate",
+    "bufferutil"
+  ]),
   module: {
     rules: [
       {

実行

ok-electron-vue

改善できる点

  • BrowserProcess 側で動くコードを、runner.js で watch していますが、これは main ディレクトリ直下のファイルしか監視していません。子ディレクトリも監視するには、glob を使うなどする必要があります。
  • electron-connect には、reload 機能も含まれているので、webpack-dev-server を使う必要がなくなりました。
    • これについては、今度書こうと思います。

【Javascript】線の点・太さ(lineWidth)から、輪郭の座標を算出する

こんにちはー。更新が遅れてしまいすみません。

あけましておめでとうございます。今年もよろしくお願いします。

今回は、線の点・太さから、輪郭の座標をとる方法を紹介します。
HTML5 Canvas の stroke() メソッドを、SVG などを使わず、自分で実装する感じです。

なお、自分で考えて手探りでやってみた方法なので、もっと効率のいい方法があるかもしれません。

なぜやりたいのか

matter.js というライブラリがあり、
それを使って、マウスで書いた線を Body に変換したかったのですが、
線を Body に直接することができなかったので、作ろうと思いました。

Constant とか使えばできそうですが、面白そうなのでやってみます。

やってみる

始点・終点

始点は1つ後の点から現在の点、終点は現在の点から1つ前の点を引いて、
逆三角関数でラジアンにし、それに垂直な方向になるように輪郭線を打ちます。

var lineWidth = 5;
var points = [
  { x: 30, y: 50 },
  { x: 120, y: 150 }
];
var outline1 = [];
var outline2 = [];

points.forEach((point, index) => {
  if (index === 0) {
    // 始点
    // Math.PI / 2 は degree で 90°
    var rad = Math.atan2(points[index + 1].y - point.y, points[index + 1].x - point.x) - Math.PI / 2;
    var sin = Math.sin(rad) * lineWidth;
    var cos = Math.cos(rad) * lineWidth;
    outline1.push({ x: point.x + cos, y: point.y + sin });
    outline2.push({ x: point.x - cos, y: point.y - sin });
  } else if (index === points.length - 1) {
    // 終点
    var rad = Math.atan2(point.y - points[index - 1].y, point.x - points[index - 1].x) - Math.PI / 2;
    var sin = Math.sin(rad) * lineWidth;
    var cos = Math.cos(rad) * lineWidth;
    outline1.push({ x: point.x + cos, y: point.y + sin });
    outline2.push({ x: point.x - cos, y: point.y - sin });
  }
});

See the Pen Drawing outlines of a line by shundroid (@shundroid) on CodePen.0

途中の点

いやー、これが難しかったです・・。
方法としては、輪郭線は角の二等分線上で交わるので、
そこで、sinθ = lineWidth となるときの cos をとってくる感じです。

求めた後、回転移動させるのですが、まずは移動させなくてもいいパターンでやってみます。

※省略部分は↑のコードと変わらない部分です。

var lineWidth = 5;
var points = [
  { x: 200, y: 100 },
  { x: 100, y: 100 },
  { x: 150, y: 50 }
];

// 省略

points.forEach((point, index) => {
  if (index === 0) {
    // 省略
  } else if (index === points.lenght - 1) {
    // 省略
  } else {
    var rad1 = Math.atan2(points[index - 1].y - point.y, points[index - 1].x - point.x);
    var rad2 = Math.atan2(points[index + 1].y - point.y, points[index + 1].x - point.x);
    var rad = (rad2 - rad1) / 2;
    var x = Math.cos(rad) * lineWidth / Math.sin(rad);
    var y = lineWidth;
    outline1.push({ x: point.x + x, y: point.y + y });
    outline2.push({ x: point.x - x, y: point.y - y });
  }
});

See the Pen Drawing outlines of a line 2 by shundroid (@shundroid) on CodePen.0

回転移動させる

これでできたっぽいですが、これは入ってくる線の角度が 0° だったときのみ動きます。
それ以外で動かすようにするには、いったん入ってくる線を基準にして求め、それを回転移動させる必要があります。

回転移動については下のサイトが詳しいです。参考にしてみてください。
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html

rad1 を基準にしたので、 rad1 の分だけ回転させればいいのです。

var lineWidth = 5;
var points = [
  { x: 200, y: 100 },
  { x: 100, y: 100 },
  { x: 150, y: 50 }
];

// 省略

points.forEach((point, index) => {
  if (index === 0) {
    // 省略
  } else if (index === points.lenght - 1) {
    // 省略
  } else {
    var rad1 = Math.atan2(points[index - 1].y - point.y, points[index - 1].x - point.x);
    var rad2 = Math.atan2(points[index + 1].y - point.y, points[index + 1].x - point.x);
    var rad = (rad2 - rad1) / 2;
    var x = Math.cos(rad) * lineWidth / Math.sin(rad);
    var y = lineWidth;

    var rx = x * Math.cos(rad1) - y * Math.sin(rad1);
    var ry = x * Math.sin(rad1) + y * Math.cos(rad1);
    outline1.push({ x: point.x + rx, y: point.y + ry });
    outline2.push({ x: point.x - rx, y: point.y - ry });
  }
});

See the Pen Drawing outlines of a line 3 by shundroid (@shundroid) on CodePen.0

これでできました!間の点はいくつあってもできます。

See the Pen Drawing outlines of a line 4 by shundroid (@shundroid) on CodePen.0

random にやっているので、急カーブになった場合、輪郭がちょうとんがります。
これは↓でもある、miterLimit を早く実装して直したいです。

考えた別の方法

線を直線の式に変えて、連立方程式で交点を出す

中学2年生で習うことでできそうですが、
どの線とどの線が交わるのかを見つけるのが超難しそうだったのでやめました。

今後やりたいこと

lineCap、lineJoin、miterLimit を実装する

Canvas にある、これらのプロパティも実装してみたいです。
miterLimit は今がんばっています。

クリスマスプレゼントで Geometry Dash を 60% OFF で買った 【第二弾】

こんにちは。

Besiege に続き、クリスマスプレゼントで、
もう一つゲームを買いました。

Geometry Dash です。

geometry-dash-steam

Steam の Winter Sale で、60% OFF、159円 で売っていました!

Save 60% on Geometry Dash on Steam
Jump and fly your way through danger in this rhythm-based action platformer!

さっそくプレイしたのですが、これが超絶難しいです・・・・

geometry-dash

このようなステージを、ジャンプで進んでいくのですが、
一回でもミスったら最初からになってしまう、という、
かなりの鬼畜ゲームなのです。

最初の5ステージくらいは簡単ですが、
徐々にロケット・半重力などのギミックが増えていき、難易度も上がっていきます。

geometry-dash-11
11個目のステージをちょっとやってみましたが、
途中で進行方向が変わったりしてよくわからなかったので開始 10 秒くらいで挫折しましたw

コツ

Normal Mode のほかに、Practice Mode という、
ミスっても途中から始められるモードがあるので、
それで何回か練習した後、Normal Mode でやると、
割と楽です。

ちょっと反応が遅い?

曲のリズムにステージがあっているところがありますが、
PC のスペックの問題なのか、ジャンプの反応が 0.25 秒くらい遅いです。
操作方法で、マウス・キーボード・コントローラーがありますが、
コントローラーが一番やりやすいと思います。

難しいですが、クリアできた時の達成感は半端じゃないので、
これからも続けてやっていこうと思います。

第一弾はこちら

クリスマスプレゼントで Besiege を 30% OFF で買った 【第一弾】
こんにちは。メリークリスマス!!(1日遅れ)いやー、今年は旧正月になる前にクリスマスプレゼントを買えましたw去年はなんか gdgd してたらセールが終わっちゃって...

クリスマスプレゼントで Besiege を 30% OFF で買った 【第一弾】

こんにちは。メリークリスマス!!(1日遅れ)

いやー、今年は旧正月になる前にクリスマスプレゼントを買えましたw

去年はなんか gdgd してたらセールが終わっちゃって、大変でした・・。

Cities: Skylines がセールだったから買ってみた
やっとクリスマスプレゼントが買えました!!Cities: Skylines です。Steam で、旧正月セールが行われています。Cities: Skylinesも、60%Off で売られていたので、買い...

今年は、Steam でセールになっている安いゲームをたくさん買うことにしました。

第一弾は Besiege です!

Steam で 30% オフ:Besiege
Besiege is a physics based building game in which you construct medieval siege engines and lay waste to immense fortresses and peaceful hamlets. Build a mach...

besiege-winter-sale

Winter Sale 中なので、30% OFF で、558 円になっています!!

というわけで、さっそくプレイしました。

動作を軽くした

去年の Cities: Skylines と同様、ぼくの PC だとちょっと重かったです。
Windows 10 の都合上、GPU をオフにしているのが原因だと思うんですけど・・・・

とりあえず、設定を変更して軽くしました。

besiege-lite

ほとんどすべて無効化しました。

SSAO はないとグラフィックがわるくなってしまったのでつけました。
SHADOWS は空中戦の時につけるようにします。

いろいろ作ってみた

besiege-catapult
こんなのとか、

besiege-bom-car
こんなのとか、

besiege-drone

こんなのを作って、とりあえず、ZONE 22 までクリアしました。

どうやって作ったのかなどは、また今度紹介します!

最後に

Besiege 超楽しいです!
しかし、ずっとこれをやっていると、時間がたつのが早くて、
冬休みがあっという間に終わってしまいそうなので、
ほどほどにプレイするようにします!!

【MIDI】セカオワの Error の間奏を作った

こんにちは。

今回は SEKAI NO OWARI 「Error」の間奏を作りました。
音がピコピコしていて、すごく好きな部分です。

メロディ部分は音が多すぎて、自分で全部わからなかったので、

https://www.youtube.com/watch?v=gX3keesEbp4

上の動画を参考にし、それをピコピコ音に変えました。

ベースとドラム、最初の音は自分で耳コピしました。

よかったら聞いてみてください。

ハルスター・アクション(beta)

2014年~2015年にかけて作っていたゲームです。
Unity で作りました。イラストは友達が作りました。

ルール

マリオのようなアクションゲームです。
ステージにあるぶどうを集めたりしながら、ゴールを目指します。

操作方法

  • ←・→ : 移動
  • SPACE : ジャンプ
    ゲームを進めると、そのほかのアクションができるようになります。

ダウンロード

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 – 非営利 – 改変禁止 4.0 国際 ライセンスの下に提供されています。

ダウンロード
上のリンクを開き、右上のダウンロードボタンからダウンロードしてください(Zip形式)
解凍し、 game.exe を開くと、ゲームが起動します。

※このゲームはかなりの鬼畜ゲームだそうです。
 製作者によりクリアできることは確認されておりますが(W0を除く)、
 難しいそうです。がんばってください!!

※このゲームは beta 版です。ステージに不具合がある場合があります。
 また、現在 Unity でなく、別のフレームワークでの開発を試しています。
 更新はそちらで行うかもしれません。

工夫したところ

ステージのシーン

ステージ(W1-1、W1-2)ごとにシーンを作るのではなく、
ステージの状態を CSV で保存し、それを利用するようにしました。

【MIDI】「クロノ・トリガー」を耳コピしてみた

MIDI 系では初めて動画を投稿しました。
Domino を使用して、クロノ・トリガーの名曲「クロノ・トリガー」を耳コピしました。

後半の部分は、切ないイメージがきちんと出るように、
主旋律をストリングスとフルートで演奏するように工夫しました。

よろしければお聴きくださいー

【Emscripten】 C++ でJSの関数を関数ポインタとして使う

ものすごく久しぶりの投稿となってしまいました。すみません。

今回は、Emscripten で C++ を実行するときに、
JSの関数を関数ポインタとして登録し、それを呼び出せるようにする方法を紹介します。

実行環境

  • Ubuntu 14.04.5 LTS
  • emcc 1.36.0
  • clang version 3.9.0

やりたいこと

  • JS の関数を set_js_listener 関数を使用して登録する
  • call_listener 関数を呼び出した時、登録した JS の関数を実行する

手順1: set_js_listener、call_listener 関数を実装

typedef void(*JS_LISTENER)();
JS_LISTENER js_listener = NULL;

extern "C"
{
  void set_js_listener(JS_LISTENER f)
  {
    js_listener = f;
  }
}

void call_listener()
{
  js_listener();
}

EMSCRIPTEN_BINDINGS()
{
  emscripten::function("call_listener", &call_listener);
}

typedef を利用して、型を簡略化して使用できるようにしています。

また、set_js_listener は、EMSCRIPTEN_BINDINGS は使用せず、
ビルド時に EXPORTED_FUNCTIONS で js から呼び出せるようにします。
そうしないと、次のようなエラーが出ます。
emscripten_failed_js_pointer
(EMSCRIPTEN_BINDINGS、allow_raw_pointers を使用した場合)

手順2: ビルドする

$ emcc main.cpp -std=c++11 -s RESERVED_FUNCTION_POINTERS=1 --bind -s EXPORTED_FUNCTIONS="['_set_js_listener']"

それぞれの引数は、次のような意味があります。
std=c++11 を指定しないと、embind を使用する際にエラーが出ます。
-s RESERVED_FUNCTION_POINTERS=1 : 1つの関数ポインタを使えるようにします。
--bind : embind を使えるようにします。
-s EXPORTED_FUNCTIONS="['_set_js_listener']" : set_js_listener を js から呼び出せるようにします。

手順3: 関数ポインタをJSで作成する

var fnPointer = Runtime.addFunction(function() {
  console.log("called!");
});

// 登録する
Module.ccall("set_js_listener", "void", [], [fnPointer]);

関数ポインタは、Runtime.addFunction を通して使用します。
set_js_listener は、Module.ccall を使用して呼び出します。

手順4: 登録した関数ポインタを呼び出す

JS から関数ポインタを呼び出します。

Module.call_listener();

emscripten_called_js_pointer

called! とコンソールに出力されたので、登録した関数が呼び出されたことがわかります。

コード

今回実行したコードは次のようになりました。


参考

http://stackoverflow.com/questions/12358877/passing-js-function-to-emscripten-generated-code