だったら最初からJavaで書けばえぇやん!
ってことで、DXライブラリのJava版を作っている人がいないか探しました。
・・・・結果居ませんでした。
じゃ、作るか。
ってことで作り始めました。
手順としては、
1. まずピュアCでDXライブラリの関数をjni経由で呼べるように宣言し、jniインターフェイスを持ったDXライブラリをDLL化します。
2. 次にJavaからはそのDLLを使えるようにしたnativeメソッドを揃えたクラスを用意し、Javaのコードから参照します。
って感じです。
しかしCでオーバーロードが出来ないことと、デフォルト引数がJavaで使えないことが痛いんですよね・・・。
文字コードの違いがあったり、Stringを色々とCで使えるようにしてあげないといけなかったりと面倒なことは多いようですが、
とりあえずこの連休でゲームプログラミングの館のコードの8割は動くようになりました。
(と言っても目ぼしい関数をいくつか使えるようにしただけなので、使える関数は全体のまだ数%も満たない状況)
まだ作りかけですがEclipseのプロジェクトを一式置いておきます。これだけでJavaからDXライブラリが使えます。
http://dixq.net/blog/12.10.08/DxLibGames.zip
需要は無いでしょうが、DLL側も置いておきます。
http://dixq.net/blog/12.10.08/DxJava.zip
で、結果どうなったかというと、C版コードと、Java版コードをゲームの館3.5章のコードで比較してみます。
[ C++版 ]
#include
#include "DxLib.h"
#define PI 3.141592654f
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
int Handle, Count = 0;
Handle = LoadGraph("res/images/char.png" );
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
DrawRotaGraph( 100, 240+sin(PI*2/240*Count)*200, 1.0, 0.0, Handle, TRUE );
DrawRotaGraph( 500, 240, 1.0+sin(PI*2/120*Count)*0.5, 0.0, Handle, TRUE );
Count++;
}
DxLib_End();
return 0;
}
package net.dixq.dxgames;
import jdx.Dx;
public class Main {
public static void main(String[] args) {
Dx.ChangeWindowMode(Dx.TRUE); Dx.DxLibInit(); Dx.SetDrawScreen(Dx.DX_SCREEN_BACK);
int Handle, Count = 0;
Handle = Dx.LoadGraph("res/images/char.png");
while (Dx.ScreenFlip() == 0 && Dx.ProcessMessage() == 0 && Dx.ClearDrawScreen() == 0) {
Dx.DrawRotaGraph(100, (int)(240 + Math.sin(Math.PI * 2 / 240 * Count) * 200), 1.0, 0.0, Handle, Dx.TRUE);
Dx.DrawRotaGraph(500, 240, 1.0 + Math.sin(Math.PI * 2 / 120 * Count) * 0.5, 0.0, Handle, Dx.TRUE);
Count++;
}
Dx.DxLibEnd();
}
}
しかし問題はあの膨大なDxLib.hの関数・・・。
まさか手作業であれを全て一つ一つjni化するわけにいきません・・・。
早い所変換ツールでも作ろうかと思います。
ん~・・そんなうまく行くのだろうか・・。構造体を引数に持った関数はとりあえず後にしよう・・。
で、ある程度使えるようになったら公開したいと思いますが・・・需要あるんですかね・・・。