DxLib を node.js で使用する
環境
- Windows 7 64bit
- node.js 32bit 版 v0.10.25
準備
ソースコード一式ダウンロード[node.js_dxlib.zip]
1,node-ffi を持ってくる
npm install ffi
http://homepage2.nifty.com/natupaji/DxLib/dxdload.html
から C# 版をダウンロードする。
3,ディレクトリ構成を以下のようにする
作業フォルダ | dxlib_test.js | DxLib.dll [This is importance.] | \---node_modules \---ffi | package.json | .npmignore | README.md | LICENSE | .travis.yml | binding.gyp | History.md | .jshintrc | 以下たくさん続く ( 「tree /A /F .」を使用した。 )ここでのポイントは、ダウンロードしたDxLib C# 版のフォルダ内にある DLL をスクリプトと同じフォルダ内に置くことです。
サンプルコード
dxlib_test.js/* * Node.js で DxLib を使ってみる。 * C# 版の DLL を叩けば行ける気がする。 */ var ffi = require('ffi'); var KEY_INPUT_BACK = 14; var KEY_INPUT_TAB = 15; var KEY_INPUT_RETURN = 28; var KEY_INPUT_LSHIFT = 42; var KEY_INPUT_RSHIFT = 54; var KEY_INPUT_LCONTROL = 29; var KEY_INPUT_RCONTROL = 157; var KEY_INPUT_ESCAPE = 1; var KEY_INPUT_SPACE = 57; var KEY_INPUT_PGUP = 201; var KEY_INPUT_PGDN = 209; var KEY_INPUT_END = 207; var KEY_INPUT_HOME = 199; var KEY_INPUT_LEFT = 203; var KEY_INPUT_UP = 200; var KEY_INPUT_RIGHT = 205; var KEY_INPUT_DOWN = 208; var KEY_INPUT_INSERT = 210; var KEY_INPUT_DELETE = 211; var KEY_INPUT_MINUS = 12; var KEY_INPUT_YEN = 125; var KEY_INPUT_PREVTRACK = 144; var KEY_INPUT_PERIOD = 52; var KEY_INPUT_SLASH = 53; var KEY_INPUT_LALT = 56; var KEY_INPUT_RALT = 184; var KEY_INPUT_SCROLL = 70; var KEY_INPUT_SEMICOLON = 39; var KEY_INPUT_COLON = 146; var KEY_INPUT_LBRACKET = 26; var KEY_INPUT_RBRACKET = 27; var KEY_INPUT_AT = 145; var KEY_INPUT_BACKSLASH = 43; var KEY_INPUT_COMMA = 51; var KEY_INPUT_KANJI = 148; var KEY_INPUT_CONVERT = 121; var KEY_INPUT_NOCONVERT = 123; var KEY_INPUT_KANA = 112; var KEY_INPUT_APPS = 221; var KEY_INPUT_CAPSLOCK = 58; var KEY_INPUT_SYSRQ = 183; var KEY_INPUT_PAUSE = 197; var KEY_INPUT_LWIN = 219; var KEY_INPUT_RWIN = 220; var KEY_INPUT_NUMLOCK = 69; var KEY_INPUT_NUMPAD0 = 82; var KEY_INPUT_NUMPAD1 = 79; var KEY_INPUT_NUMPAD2 = 80; var KEY_INPUT_NUMPAD3 = 81; var KEY_INPUT_NUMPAD4 = 75; var KEY_INPUT_NUMPAD5 = 76; var KEY_INPUT_NUMPAD6 = 77; var KEY_INPUT_NUMPAD7 = 71; var KEY_INPUT_NUMPAD8 = 72; var KEY_INPUT_NUMPAD9 = 73; var KEY_INPUT_MULTIPLY = 55; var KEY_INPUT_ADD = 78; var KEY_INPUT_SUBTRACT = 74; var KEY_INPUT_DECIMAL = 83; var KEY_INPUT_DIVIDE = 181; var KEY_INPUT_NUMPADENTER = 156; var KEY_INPUT_F1 = 59; var KEY_INPUT_F2 = 60; var KEY_INPUT_F3 = 61; var KEY_INPUT_F4 = 62; var KEY_INPUT_F5 = 63; var KEY_INPUT_F6 = 64; var KEY_INPUT_F7 = 65; var KEY_INPUT_F8 = 66; var KEY_INPUT_F9 = 67; var KEY_INPUT_F10 = 68; var KEY_INPUT_F11 = 87; var KEY_INPUT_F12 = 88; var KEY_INPUT_A = 30; var KEY_INPUT_B = 48; var KEY_INPUT_C = 46; var KEY_INPUT_D = 32; var KEY_INPUT_E = 18; var KEY_INPUT_F = 33; var KEY_INPUT_G = 34; var KEY_INPUT_H = 35; var KEY_INPUT_I = 23; var KEY_INPUT_J = 36; var KEY_INPUT_K = 37; var KEY_INPUT_L = 38; var KEY_INPUT_M = 50; var KEY_INPUT_N = 49; var KEY_INPUT_O = 24; var KEY_INPUT_P = 25; var KEY_INPUT_Q = 16; var KEY_INPUT_R = 19; var KEY_INPUT_S = 31; var KEY_INPUT_T = 20; var KEY_INPUT_U = 22; var KEY_INPUT_V = 47; var KEY_INPUT_W = 17; var KEY_INPUT_X = 45; var KEY_INPUT_Y = 21; var KEY_INPUT_Z = 44; var KEY_INPUT_0 = 11; var KEY_INPUT_1 = 2; var KEY_INPUT_2 = 3; var KEY_INPUT_3 = 4; var KEY_INPUT_4 = 5; var KEY_INPUT_5 = 6; var KEY_INPUT_6 = 7; var KEY_INPUT_7 = 8; var KEY_INPUT_8 = 9; var KEY_INPUT_9 = 10; var DX_SCREEN_FRONT = -4; var DX_SCREEN_BACK = -2; var DX_SCREEN_WORK = -3; var DX_SCREEN_TEMPFRONT = -5; // DxLib.cs のコードを参考に DLL の内部関数名を書く var dxlib = ffi.Library('DxLib', { "dx_DxLib_Init" : ["int32", []], "dx_DxLib_End" : ["int32", []], "dx_SetGraphMode" : ["int32", ["int32", "int32", "int32", "int32"]], "dx_ChangeWindowMode" : ["int32", ["int32"]], "dx_SetMainWindowText" : ["int32", ["string"]], "dx_ProcessMessage" : ["int32", []], "dx_CheckHitKey" : ["int32", ["int32"]], "dx_SetDrawScreen" : ["int32", ["int32"]], "dx_ScreenFlip" : ["int32", []], "dx_GetColor" : ["int32", ["int32", "int32", "int32"]], "dx_DrawBox" : ["int32", ["int32", "int32", "int32", "int32", "int32", "int32"]] }); console.log("Start."); console.log(dxlib); dxlib.dx_SetGraphMode(640, 480, 16, 60); dxlib.dx_ChangeWindowMode(1); // ウインドウモードで起動する。 dxlib.dx_SetMainWindowText("Use Dxlib by node.js"); if (dxlib.dx_DxLib_Init() == -1) { console.log("DxLib init error."); return; } // 描画画面を裏画面にセット dxlib.dx_SetDrawScreen(DX_SCREEN_BACK); var x = 60, y = 60; var pW = 100, pH = 100; var speed = 5; while (dxlib.dx_ProcessMessage() == 0 && dxlib.dx_CheckHitKey(KEY_INPUT_ESCAPE) == 0) { if (dxlib.dx_CheckHitKey(KEY_INPUT_LSHIFT) != 0) { speed = 10; } else { speed = 5; } if (dxlib.dx_CheckHitKey(KEY_INPUT_LEFT) != 0) { x -= speed; } if (dxlib.dx_CheckHitKey(KEY_INPUT_RIGHT) != 0) { x += speed; } if (dxlib.dx_CheckHitKey(KEY_INPUT_UP) != 0) { y -= speed; } if (dxlib.dx_CheckHitKey(KEY_INPUT_DOWN) != 0) { y += speed; } if (x < 0) { x = 0; } if (x > 640 - pW) { x = 640 - pW; } if (y < 0) { y = 0; } if (y > 480 - pH) { y = 480 -pH; } // ClearDrawScreen の代わり dxlib.dx_DrawBox(0, 0, 640, 480, dxlib.dx_GetColor(0, 0, 0), 1); // 市松模様でも敷き詰めてみる var cSize = 32; for (var _y = 0; _y < 480 / cSize; _y++) { for (var _x = 0; _x < 640 / cSize; _x++) { dxlib.dx_DrawBox(_x * cSize, _y * cSize, _x * cSize + cSize, _y * cSize + cSize, dxlib.dx_GetColor((_x+_y)%2 * 255, 0, 0), 1); } } dxlib.dx_DrawBox(x, y, x + pW, y + pH, dxlib.dx_GetColor(255, 255, 0), 1); dxlib.dx_ScreenFlip(); } dxlib.dx_DxLib_End(); console.log("Finish.");
実行結果
Console
Start. { dx_DxLib_Init: { [Function] async: [Function] }, dx_DxLib_End: { [Function] async: [Function] }, dx_SetGraphMode: { [Function] async: [Function] }, dx_ChangeWindowMode: { [Function] async: [Function] }, dx_SetMainWindowText: { [Function] async: [Function] }, dx_ProcessMessage: { [Function] async: [Function] }, dx_CheckHitKey: { [Function] async: [Function] }, dx_SetDrawScreen: { [Function] async: [Function] }, dx_ScreenFlip: { [Function] async: [Function] }, dx_GetColor: { [Function] async: [Function] }, dx_DrawBox: { [Function] async: [Function] } } Finish.
まとめ
かなり気持ちの悪いコードになる事、DLL をダイレクトにぶっ叩くため結構気持ち悪い、更に 32bit 限定?であること等なかなか気持ちの悪い。うん。
ただ、node.js から DxLib が本当に面倒くさいけど使用できることが確認できたのでそれでいいかな・・・
ソースコード一式ダウンロード[node.js_dxlib.zip]