Java版DXライブラリ制作 .1

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Java版DXライブラリ制作 .1

投稿記事 by Dixq (管理人) » 12年前

C++でプログラムを書いてる時、Boostを使ったりSTLを使ったりして何とかJavaライクに、C#ライクにプログラムを書こうとしますが、

だったら最初から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++版 ]

CODE:

#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;
} 
[ Java版 ]

CODE:

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化するわけにいきません・・・。
早い所変換ツールでも作ろうかと思います。

ん~・・そんなうまく行くのだろうか・・。構造体を引数に持った関数はとりあえず後にしよう・・。


で、ある程度使えるようになったら公開したいと思いますが・・・需要あるんですかね・・・。
最後に編集したユーザー Dixq (管理人) on 2012年10月08日(月) 23:46 [ 編集 2 回目 ]

トントン
記事: 100
登録日時: 14年前

Re: Java版DXライブラリ制作 .1

投稿記事 by トントン » 12年前

DXライブラリをswig使ってPerlで動かそうと思ったら
上手くいかず挫折した記憶があります。

ちなみに、需要はあると思います。
(コードタグがC++なところが素敵)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Java版DXライブラリ制作 .1

投稿記事 by Dixq (管理人) » 12年前

需要ありそうなら頑張って作りたいところですw

ちなみに、コードタグは最初Javaにしてたんですが、色が違い過ぎて見にくかったので、「同じ感」を出すためにもC++にしました・・w

アバター
tk-xleader
記事: 158
登録日時: 14年前

Re: Java版DXライブラリ制作 .1

投稿記事 by tk-xleader » 12年前

C++でJavaライクにコーディングしようという人のために、こんなライブラリがありますよ。

http://pocoproject.org/

まぁ、本当にJavaで書くのよりもは、物足りないといわれればそうですけどね…

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: Java版DXライブラリ制作 .1

投稿記事 by Dixq (管理人) » 12年前

>tk君
pocoプロジェクトってなんかかわいいねw
出だしちょっと読んだ位だけだと、あんまJavaライクな雰囲気掴めなかったけど、Javaライクなの?

naohiro19
記事: 256
登録日時: 14年前

Re: Java版DXライブラリ制作 .1

投稿記事 by naohiro19 » 12年前

pocoはラテン語系で「わずか少し」という意味があります。(英語のlittleに相当する単語です)