Visual DでD言語を扱いつつ、DxLibを使ってみる

Visual Studio上でD言語を扱いつつDxLibを触る方法について色々と試してみました。
今回はIDEとしてVisual Studioを使いたいので、想定されるOSの環境はWindowsに限定します。
そもそもDxLibを使う時点でWindowsしか動かんよなー。
Visual Studio導入は既に終わっている前提で進めていきます。

用意するもの

Visual Studio 2005~2013

Shell IsolatedとShellIntegratedの組み合わせでもいける模様

Visual D

Visual D - D Programming Language - Digital Mars
Visual StudioD言語プロジェクトを扱えるようになるツール

D言語版DXライブラリ

D言語からDXライブラリを使う方法 - 羽流布の備忘録
D言語でDxLibを扱うことができるライブラリ
※ この記事を書いている時点での最新版は3.11

インストール

DMD 2 → Visual Dの順番でインストールします。

DMD 2

インストール先フォルダはお好みで。
DMD 2のインストール時のチェックボックスDMDの1と2の選択ができますが、Visual DではDMD 1は使えませんのでDMD 1のチェックは不要です。
インストール時のチェックは初期状態のままで大丈夫でしょう。

Visual D

DMD 2がWindows用のインストーラーを利用して先にインストールされていると、インストール時にDMD 2のフォルダの指定を自動で行ってくれます。
もしDMD 2を前述のインストーラーを利用せずに手動で入れていた場合は、画面の指示に従って手動で設定する必要があります。


ここまでのインストールが正常に行われていれば、Visual Studioを起動したときにメニューバー上に"VISUAL D"というタブが追加されているはずです。
もしも追加されていないようであれば、セキュリティソフトの設定などを見直してVisual Dを再インストールしてみるとよいでしょう。
筆者が導入を行った時は、Kasperskyに"VisualD.dll"が誤検知されて削除されてしまったため、少し手惑う羽目になりました。

プロジェクトの作成

この記事ではVisual Studio 2013を使用しています。

1.

Visual Studioを立ち上げ、メニューバーから
ファイル > 新規作成 > プロジェクト
を選択。

2.

新しいプロジェクトのウィンドウが開くので、左のメニューから
インストール済み > 他の言語 > D
を選択。

3.

プロジェクトの種類をWindows Applicationにして作成。
※ここで間違えてConsole Applicationを選んでしまうと、DxLibの窓生成時にコンソールの窓も生成されてしまうため注意。

4.

ソリューションのディレクトリ作成のチェックを外し、名前と場所を設定したらOKを押して完了です。
※ ソリューションのディレクトリ作成はお好みでどうぞ。ただし、この記事ではチェックを外した前提で書いている為、以降適宜自分の設定に置き換えて読み進めてください。

f:id:SiON_PN:20140721151300p:plain

DxLibの準備

この記事では3.11を使用します。

1.

冒頭でダウンロードしてきたD言語版DXライブラリを解凍します。

2.

以下のデータをプロジェクトのslnファイルがあるフォルダにコピー。

dx4d.d
string.d
dxlib311.lib
dxlib311_x64.lib
dataフォルダとその中身

x64のは大半の人は使わないと思うけど念のため。

3.

Visual Studioのメニューバーから
プロジェクト > 既存項目の追加
を選択し、2でプロジェクトのフォルダに移動した以下のファイルを追加して完了。

dx4d.d
string.d

コーディング

今回は試しにD言語くんの画像を描画してみます。
プロジェクト作成時に既にwinmain.dというソースファイルが生成されている筈なのでこれを開き、書かれているコードをすべて削除してから以下のように書き換えます。

コード

module winmain;

import dx4d;
import string;
void main()
{
	// ウィンドウの名称定義
	dx_SetMainWindowText( toCS("Visual D") );
	
	// ウィンドウサイズ指定
	dx_SetGraphMode( 640 , 480 , 32 );
	
	// ウィンドウモード
	dx_ChangeWindowMode( TRUE );

	// Dxライブラリ初期化処理
	if ( dx_DxLib_Init() == -1 )
		return;

	// 四角を描画
	dx_DrawBox( 0 , 16 , 640 , 480 , dx_GetColor( 0 , 255 , 0 ) , TRUE );

	// 画像をロードして描画
	int image=dx_LoadGraph( toCS("Image/image.png") );
	dx_DrawRotaGraph( 320 , 240 , 1.0 , 0 , image , TRUE );
	
	// printfDxがコメントアウトされていて使えなかったのでDrawStringを代用
	dx_DrawString( 0 , 0 , toCS("Hello World") , dx_GetColor( 255 , 255 , 255 ) );

	// キーの入力待ち
	dx_WaitKey();

	// Dxライブラリ使用の終了処理
	dx_DxLib_End();

}

実行結果

f:id:SiON_PN:20140721160050p:plain

まとめ

D言語用のDxLibのreadmeに

あと文字列を渡す関数については注意が必要です。
 付属している string.d を使ってください。
例)
  dx_FileRead_open( toCS( "文字列" ) );
  string str = toDS( toCS( "文字列" ) );

とあったので注意。

また、メイン関数だけども

extern (Windows)
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

でやるとdebugビルドは通るけどreleaseビルドに失敗します。
勿論、

void main()

でやると両方とも問題なく通るのだけど。
今のところ原因は不明。
もしわかる方がいれば、教えて下さるとありがたいです。

くぅ疲。

Luaの基本文法 Part1

以前書いたLuaの文法紹介記事を改めてまとめ直しました。
一つの記事にまとめるには少し長すぎるので複数回に分割して紹介します。


コメントアウト

一行コメントアウト

Luaコメントアウトを行うにはハイフンを並べて使用します。

-- comment

また、文頭に#を使用してもコメントアウトを行うことが可能ですが、その場合は行頭に配置しないと使えない為注意が必要です。

複数行コメントアウト

複数行のコメントアウトを行う場合はハイフンの直後に開き長括弧()を使用します。
この場合、コメントアウトは対応する閉じ長括弧(
)がある部分まで続きます。

--[[
	comment
]]

複数行コメントアウトで処理を実行されないようにする場合は、閉じ括弧の直前にもハイフンを二つおく事をお勧めします。

--[[
	(処理部分)
--]]

この記法はデバッグの際に大変役立ちます。
処理部分のコメントアウトを外したいときに、開き括弧の前にもうひとつハイフンを加えると

---[[
	(処理部分)
--]]

というように、コメントアウト開始部分と終了部分が一行コメントアウトとして扱われるのでコメントアウトをはずす事が手軽に行えます。

データの扱い

変数

Luaは動的型付け言語なので、変数を宣言する際に型名を記述する必要はありません。
下記のように記述するだけで、変数を宣言することが出来ます。

a = 0		-- 整数
b = 3.14	-- 実数
c = "Hello"	-- 文字列

また、上記のように宣言した変数は全てグローバルとして扱われてしまうため注意が必要です。
もしローカルとして宣言したい場合は、

local a=0

のように、変数名の前にlocalと記述してやる必要があります。
Luaでは多重代入を行うことが出来ます。
多重代入を行う際は

a , b , c = 1 , 2 , 3

のように記述します。
この書き方を用いてスワップを行うことも可能です。

a , b = b , a

上記のように書くことで、変数aと変数bの数値の入れ替えが出来ます。
他に一時保存用の変数を用意する必要はありません。

演算子

算術演算子
+		-- 足し算
-		-- 引き算
*		-- 掛け算
/		-- 割り算
^		-- 累乗
%		-- 剰余

LuaではC言語などとは違い、累乗の算術演算子が存在します。
上記の演算子を用いた計算例は以下。

x = 9 + 2	-- 11
x = 9 - 2	-- 7
x = 9 * 2	-- 18
x = 9 / 2	-- 4.5
x = 9 ^ 2	-- 81  ( 9 * 9 == 81 )
x = 9 % 2	-- 1   ( 9 / 2 == 4 あまり 1 )

また、残念ですが+=演算子や++演算子Luaでは使うことが出来ません。

x = x + 2

のように記述して対応しましょう。

関係演算子
A == B		-- AはBと等しい
A ~= B		-- AとBは等しくない
A <  B		-- AはB未満
A <= B		-- AはB以下
A >  B		-- BはA未満
A >= B		-- AはB以下

左辺と右辺の不等を表す演算子の使用には注意してください。
C言語などでは!=ですが、Luaでは~=となります。
書き間違えやすい箇所なので、特に意識して記述するようにしましょう。

論理演算子

論理演算子には and , or , not があります。
論理演算子では false と nil を偽とし、それ以外を真として扱います。

-- and演算子
-- 左項が偽であれば左項が返る
print(nil and 2)	-- nil
print(false and 2)	-- false
-- 左項が真であれば右項が返る
print(1 and 2)		-- 2

-- or演算子
-- 左項が真であれば左項が返る
print(1 or 2)		-- 1
-- 左項が偽であれば右項が返る
print(nil or 2)		-- 2
print(false or 2)	-- 2

-- not演算子
-- 偽であればtrueが返る
print(not nil)		-- true
print(not false)	-- true
-- 真であればfalseが返る
print(not 1)		-- false

and と or は左項から順番に評価されます。



とりあえず今回はここまで。
次回は制御構造について扱います。