スキップしてメイン コンテンツに移動

DxLib を node.js で使用する

DxLib を node.js で使用する

環境

  • Windows 7 64bit
  • node.js 32bit 版 v0.10.25

準備

ソースコード一式ダウンロード[node.js_dxlib.zip]
1,node-ffi を持ってくる
npm install ffi
2,DxLib C# 版を持ってくる
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]

このブログの人気の投稿

記述試験の書き方(仮)

記述試験の書き方(仮) 1,まえがき   法学部の試験では記述式の試験が出てくる。   その試験では、あるテーマについて自由に論ぜよとされている。 しかし、論ぜよと言われても、どのように論じればいいのか、すなわち、記述の仕方について教わったことがない(よくよく考えると、法的文章力を習得させる事だけが目的の授業はないと思われる)。   本稿では、私自身が法学畜になり、見聞きし、実際に活用している論述方法についてまとめている、はずである。その要点は、①条文、判例、学説を使う。②単なる事実と法的事実を区別する。③文章内に一貫性を持たせる。である。 法律と、プログラミング

本サイトの今後について

告知 本サイトは今後更新されることは、おそらくありません。 過去記事等はこのまま放置するつもりです。内容の陳腐化並びにその正確性等については保証はできません。自己責任で活用いただければと思います。 This site won't update in future. And Thank's everyone. new site -> sysrigar

node.js で SQLite3 を使用するコードを書くときの予備録

node.js で SQLite3 を使用するコードを書くとき、予備録 まず、非同期処理。 C言語や Perl のように上から下に処理が続くと決して思ってはいけない。 SQLite3 の each は SQL 文実行完了時に呼び出す関数を指定できる SQLite をインストールします、 npm install sqlite3 [test.js] var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(':memory:'); db.serialize(function() { db.run("CREATE TABLE lorem (info TEXT)"); var stmt = db.prepare("INSERT INTO lorem VALUES (?)"); for (var i = 0; i < 10; i++) { stmt.run("Ipsum " + i); } stmt.finalize(); var listInfo = new Array(); db.each("SELECT rowid AS id, info FROM lorem", function(err, row) { var tmp = new Object(); tmp.id = row.id; tmp.info = row.info; console.log("[ROW]\t" + row.id + ": " + row.info); listInfo.push(tmp); }, function() { // Each 完了時に呼び出される for (var i = 0; i < listInfo.length; i++) { console.log("[BUF]\t" + listInfo[i].id + ": " + listInfo[i].info); } console.lo