ホームへ戻る

1.1 Java版のDXライブラリを使ってみよう


※前書き
本サイトは、本家でC#版DXライブラリが公開されているにも拘らず、Java版のDXライブラリを使いたい人のためのマニアックなサイトです。
使えない関数は非常に多いですし、まだ「作ってみたらなんか動いた」程度ですので、御了承下さい。
制作は有用性とモチベーションに起因します。

さて、2.1章から紹介しているDXライブラリのDLLをJavaから使えるようにしてみます。
Eclipseのプロジェクトファイル一式をこちらに置きます。

Eclipseを立ち上げ、
ファイル」>「インポート」>「一般」>「既存プロジェクトをワークスペースへ」を選んで次へ
「参照」から上でダウンロードしたプロジェクトのあるフォルダを選択して完了。

これで既に実行可能になっていますので、Ctrl+F11を押して実行して見ましょう。

ここで src/net.dixq.dxgames.Main を見て下さい。以下のように書かれています。


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();

	}
}

これはゲームプログラミングの館3.5章にあるコードをJava版DXライブラリで使えるように書き換えたものです。
ほとんどそのまま書けます。
変わっているのは、DXライブラリの関数や定義の前に"Dx."が付いている程度かと思います。

現在使用可能なDXライブラリの機能は、src/jdx.Dx の中を見れば分かります。この中の「public」の付いているメソッド・定義が使用可能です。
(2012/10/09現在のver.)


public final class Dx {

	static {
		System.loadLibrary("DxJava");
	}

	public  static native int DxLibInit			();
	public  static native int DxLibEnd 			();
	public  static native int ChangeWindowMode	(int Flag);
	public  static native int SetDrawScreen		(int DrawScreen);
	private static native int LoadGraph			(byte[] FileName);
	public  static native int ScreenFlip		();
	public  static native int ProcessMessage	();
	public  static native int ClearDrawScreen	();
	private static native int DrawString		(int x, int y, byte[] string, int Color);
	public  static native int DrawGraph			(int x, int y, int GrHandle,  int TransFlag ) ;
	public  static native int DrawRotaGraph		(int x, int y, double ExRate, double Angle, int GrHandle, int TransFlag);
	public  static native int SetDrawBlendMode	(int BlendMode, int BlendParam ) ;
	public  static native int GetRand			(int RandMax ) ;
	public  static native int SRand				(int Seed ) ;
	private static native int LoadSoundMem		(byte[] FileName);
	public  static native int PlaySoundMem		(int SoundHandle, int PlayType);
	public  static native int GetColor			(int red, int green, int blue);

	public static int LoadGraph(String fileName){
		try {
			byte[] fn = fileName.getBytes(CHAR_CODE);
			return LoadGraph(fn);
		} catch (UnsupportedEncodingException e) {
			return ERROR;
		}
	}

	public static int DrawString(int x, int y, String string, int Color){
		try {
			return DrawString(x,y,string.getBytes(CHAR_CODE),Color);
		} catch (UnsupportedEncodingException e) {
			return ERROR;
		}
	}

	public static int LoadSoundMem(String fileName){
		try {
			return LoadSoundMem(fileName.getBytes(CHAR_CODE));
		} catch (UnsupportedEncodingException e) {
			return ERROR;
		}
	}

	public static final int ERROR = -1;
	public static final int FALSE = 0;
	public static final int TRUE  = 1;

	public static final int DX_SCREEN_FRONT		= 0xfffffffc;
	public static final int DX_SCREEN_BACK		= 0xfffffffe;
	public static final int DX_SCREEN_WORK 		= 0xfffffffd;
	public static final int DX_SCREEN_TEMPFRONT	= 0xfffffffb;

	public static final int DX_BLENDMODE_NOBLEND= 0;	// ノーブレンド
	public static final int DX_BLENDMODE_ALPHA	= 1;	// αブレンド
	public static final int DX_BLENDMODE_ADD	= 2;	// 加算ブレンド
	public static final int DX_BLENDMODE_SUB	= 3;	// 減算ブレンド
	public static final int DX_BLENDMODE_MUL	= 4;	// 乗算ブレンド

	private static final int DX_PLAYTYPE_LOOPBIT = 0x0002;	// ループ再生ビット
	private static final int DX_PLAYTYPE_BACKBIT = 0x0001;	// バックグラウンド再生ビット

	public static final int DX_PLAYTYPE_NORMAL	= 0;												// ノーマル再生
	public static final int DX_PLAYTYPE_BACK	= (DX_PLAYTYPE_BACKBIT);							// バックグラウンド再生
	public static final int DX_PLAYTYPE_LOOP	= (DX_PLAYTYPE_LOOPBIT | DX_PLAYTYPE_BACKBIT);		// ループ再生

	private static final String CHAR_CODE = "Shift-JIS";

	private Dx(){}
}

一部メソッドの定義がprivateになっているのは、JavaのStringをDLLで解釈出来るようにするためです。

privateメソッドは同じ関数名で、下にpublicの定義があります。
stringで受け取った物は、Shift-JISにエンコードしてByte配列に変換して渡す必要があるので、一度ラップしています。
Dxを利用する時は、publicの付いた物さえ確認すればOKです。



→分からないことがあれば掲示板で質問して下さい


Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

- Remical Soft -