Diksam on Windows

Diksamでウインドウを開く

Diksamも言語としては一応それなりの機能が揃ったと思うので、 次に必要なのはライブラリです。

といってもstdio.hみたいなのばかり拡充させていってもあまり面白くありません (それはそれで必要ですが)。PHPがWebページ作りに特化しているように、 言語には、何か「得意技」が必要なのだと思います。

では、Diksamをどっち方面に向かわせるかですが。

大昔、こっちの方に 書いたんですが、私の世代は、スイッチオンBASICなマシン(PC-8001とか)で、 「UFOを打ち落とすゲーム」みたいなのを作ったものでした。 当時のPCの能力やBASICという言語の限界、また私の場合は何よりも私自身の 能力の問題で、そんなにたいしたものは作れなかったのですが、 それでも、自分で書いたプログラムどおりに画面で何かが動くというのは 結構楽しかったですし、プログラミングを学ぶ最初の一歩にはなったと思います。 言語がBASICだけに、変な癖が付いただけ、というのも否定できませんけど。

今現在、そういうことができる言語はあまりないように思えます。 一部は上でリンクしたページでも書いてますが、

……というわけで、Diksamは、 昔なつかしの「UFOを打ち落とすゲーム」等を簡単に作れる方向で考えてみました。 こんな感じで※1

これのソースはこちら

コメントを過剰に入れていますし、 普通にプログラムが書ける人なら読めるかと思います。

まあ、いくらなんでもUFOが「├○┤」なんてのはネタ以外のものではなくて、 一応BMPファイルの読み込みと表示の手段は付けたので、 これぐらいのことはできるんですけど、たいした違いはないですね。

なお、このUFOゲームのソースは意図的に、初心者然とした、というか、 かつてのBASICのような書き方をしています。 この程度のプログラムでも、そこそこ行数は嵩んでしまっていて (中括弧だけで1行食ってしまうとかの言語の特性はあるにせよ)、 次はUFOを複数飛ばそうとか、 ビームが同時に複数存在できるようにしようとか考えるとすぐ破綻して、 初心者さんは、その辺から、 クラスとかポリモルフィズムとかに発展していけるのではないかなあ、 と思っています。

ところで、もう数年かかっているこの「プログラミング言語を作る」 という企画を始めた頃は、これもcrowbarでやろうと思っていて、 記事のタイトルも決めていたのです。

「パールのようなもので窓をこじ開ける」

しかし、明確なクラスのないcrowbarのような言語では ネイティブなクラスライブラリが書きづらいとか、 こういうことをやるのなら少しは実行速度も意識すべきだろうとか、 いろいろ考えて、結局crowbarではやらずに新たに言語を作ってしまったのでした。 思えば遠くに来たもんだ。

なお、今回追加したライブラリ部分は、Windows専用です。 やっぱり一番ユーザ数が多いと思いますので。

ダウンロードとコンパイル

2008/12/31追記:
Windows版でShift-JISの扱いに問題があったこと(0x5C問題)、 およびUNIX版についてUTF-8が使えなかったため、ver.0.4.02を上げました。 UNIX(Linux)版は、UTF-8環境の人はUTF-8版をダウンロードしてください。
2009/1/9追記:文字リテラル関連のバグを修正したver.0.4.03を上げました。

Windows版実行形式には、以下のサンプルプログラムを含みます。

draw.dkm ドローツールのできそこないのようなもの。 マウスの左ボタンで折れ線の描画開始および中間点の設置、 右ボタンで折れ線の描画終了。
lineart.dkmスクリーンセーバのようなラインアート。
ufo.dkmUFOゲーム。カーソルキーで左右移動、スペースキーで ビーム発射。UFO爆発時にnで次のゲーム、qで終了。
ufo2.dkmUFOゲームのUFOのビットマップ表示板。
wintest.dkm 全体的なテストプログラム。

コンパイルは、UNIX版は上記ソースを展開したディレクトリの mainフォルダの下でmakeを、 Windows版はwindowsフォルダの下でmake(私はgmakeに改名していますが) を叩いてください。

また、今回、言語仕様も多少修正しています。最新版は以下を参照ください。

Diksam言語仕様 ver.0.4.01

リファレンス

Diksam on Windows使用可能なクラス、関数の一覧を以下に挙げます。

また、こちらにwindow.dkhのソース を載せておきます。

Brushcreate_solid_brush()関数で作るくせに Penはコンストラクタで作るとか、変なところがいろいろあるので 修正の可能性は大です。 Diksamについては、ver.1.0までは、後方互換性は気にせず修正していきたいと 思っています。ご理解のうえご使用くださいませ。

diksam.windowパッケージ

Windowクラス

Windowクラスは、画面に表示されるウインドウに対応するクラスである。

Windowは、create_window()関数により生成する。

Window create_window(string title, int width, int height, WindowAttribute attribute);

タイトルバーにtitleを表示する、サイズがwidth×heightのウインドウを 作成する。このwidth, heightは、ウインドウ枠のサイズを含む。

第3引数のattributeは、ウインドウの各種属性を指定するが、 デフォルトでよければnullを指定すればよい。

ウインドウは作成するだけでは表示されず、show()メソッドを呼び出す必要がある。

メソッド一覧

void show() ウインドウを表示する。
void set_destroy_proc(WindowDestroyProc proc) ウインドウの×ボタンをクリックされた際に呼び出される 関数を設定する。
void set_paint_proc(WindowPaintProc proc) ウインドウの再描画が必要な際に呼び出される関数を設定する。
void set_key_down_proc(KeyDownProc proc) ウインドウ上でキーボードのキーが押下されたときに 呼び出される関数を設定する。
void set_key_up_proc(KeyUpProc proc) ウインドウ上でキーボードのキーを離したときに 呼び出される関数を設定する。
void set_mouse_button_down_proc(MouseButtonDownProc proc) ウインドウ上でマウスのボタンを押したときに 呼び出される関数を設定する。
void set_mouse_button_up_proc(MouseButtonUpProc proc) ウインドウ上でマウスのボタンを離したときに 呼び出される関数を設定する。
void set_mouse_move_proc(MouseMoveProc proc) ウインドウ上でマウスが動いたときに呼び出される関数を設定する。
void set_mouse_drag_proc(MouseDragProc proc) ウインドウ上でマウスをドラッグしたときに呼び出される関数を設定する。
void get_graphics() このウインドウに描画を行うためのGraphicsオブジェクトを取得する。
void get_width() このウインドウの、枠を含まない領域の幅を取得する。
void get_height() このウインドウの、枠を含まない領域の高さを取得する。

WindowAttributeクラス

WindowAttributeクラスは、ウインドウの属性を決定するために create_window関数に渡すためのクラスである。

WindowAttributeオブジェクトは、create_window_attribute()関数を使うか、 newすることにより生成する。

WindowAttribute create_window_attribute();

デフォルトのWindowAttributeオブジェクトを生成する。

メソッド一覧

void set_x(int x) ウインドウのx座標(枠を含む左上端)を指定する。 これを指定しなければ、デフォルトの座標に表示される。
void set_y(int y) ウインドウのy座標(枠を含む左上端)を指定する。 これを指定しなければ、デフォルトの座標に表示される。
constructor initialize() デフォルトコンストラクタ。 x, y, 背景色ともにデフォルトに設定する。

フィールド一覧

Brush background ウインドウの背景となるBrushオブジェクト。

Graphicsインタフェース

Graphicsは、ウインドウに実際に描画を行うためのインタフェースである。 再描画関数の引数として、またはWindowクラスのget_graphics()メソッドにより 取得する。

メソッド一覧

void draw_line(Pen pen, int x1, int y1, int x2, int y2) penで指定されたPenで、 (x1, y1)から(x2, y2)までの直線を描画する。
void draw_polyline(Pen pen, Point[] points) penで指定されたPenで、 pointsで指定された座標群による折れ線を描画する。
void draw_rectangle(Pen pen, int x, int y, int width, int height) penで指定されたPenで、 左上隅が(x, y)、幅がwidth、高さがheightの矩形を描画する。
void draw_ellipse(Pen pen, int x, int y, int width, int height) penで指定されたPenで、 左上隅が(x, y)、幅がwidth、高さがheightの矩形に内接する楕円を描画する。
void draw_arc(Pen pen, int x, int y, int width, int height, double start_angle, double end_angle) penで指定されたPenで、 左上隅が(x, y)、幅がwidth、高さがheightの矩形に内接する楕円の一部を、 開始角をstart_angleとして、end_angle分描画する。 角度の単位は度で、右方向を0とした時計回りである。
void draw_string(Font font, Color color, int x, int y, string str) fontで指定されたフォント、colorで指定された色で、 (x, y)の座標に文字列strを描画する。
void fill_rectangle(Brush brush, int x, int y, int width, int height) brushで指定されたBrushで、 左上隅が(x, y)、幅がwidth、高さがheightの矩形を塗りつぶす。
void draw_ellipse(Brush brush, int x, int y, int width, int height) brushで指定されたBrushで、 左上隅が(x, y)、幅がwidth、高さがheightの矩形に内接する楕円を塗りつぶす。
void fill_pie(Pen pen, int x, int y, int width, int height, double start_angle, double end_angle) penで指定されたPenで、 左上隅が(x, y)、幅がwidth、高さがheightの矩形に内接する楕円の一部の、 開始角をstart_angleとして、end_angle分の扇形を塗りつぶす。 角度の単位は度で、右方向を0とした時計回りである。
void set_background_color(Color color) draw_string()で描画する文字の背景色を指定する。
void set_draw_mode(DrawMode mode) 描画モードを指定する。指定できるモードは DrawModeの項を参照のこと。

Penクラス

Penは、線を描画する際の色、線幅、スタイルを指定するクラスである。

メソッド一覧

constructor rgb(int r, int green, int blue) 指定された色でPenを生成する。
constructor width(int r, int green, int blue, int width) 指定された色と線幅でPenを生成する。
constructor style(int r, int green, int blue, int width, PenStyle style) 指定された色と線幅とスタイルでPenを生成する。
dispose() ペンを破棄する。

Brushクラス

Brushは、塗りつぶしのためのブラシを表現するクラスである。

現時点では、create_solid_brush()関数で生成する。

Brush create_solid_brush(int red, int green, int blue);

指定された色の塗りつぶしブラシを生成する。

メソッド一覧

dispose() ブラシを破棄する。

Colorクラス

Colorは色を表現するクラスである。現状では、文字の描画に使用している。

メソッド一覧

constructor rgb(int r, int green, int blue) 指定された色でColorを生成する。

Fontクラス

Fontは文字のフォントを指定する。create_font()関数にて生成する。

Font create_font(int height, FontAttribute attr);

heightで指定された高さのフォントを生成する。 attrは、その他のフォントの属性を指定するが、 デフォルトでよければnullを指定すればよい。

メソッド一覧

dispose() フォントを破棄する。

FontAttributeクラス

FontAttributeはフォントの属性を定義するクラスである。 create_font()関数の第2引数に指定する。

メソッド一覧

constructor initialize() デフォルト値でFontAttributeを生成する。

フィールド一覧

string font_name フォント名。「"MS 明朝"」等を指定する。
int width 平均文字幅を指定する。デフォルトの幅でよければ0を指定する。
int orientation 文字列の描画角度を1/10度単位で指定する。反時計回り。
boolean bold ボールド体にする場合trueにする。
boolean italic イタリック体にする場合trueにする。
boolean underline アンダーラインを引く場合trueにする。
boolean strike_out 取り消し線を引く場合trueにする。

Pointクラス

Pointクラスは、2次元座標(単位はint)上の点を表現する。 現状では、Graphics#draw_polyline()にて使用する。

メソッド一覧

constructor initialize(int x, int y) x座標、y座標を与えてPointを生成する。

フィールド一覧

int xx座標
int yy座標

Bitmapクラス

Bitmapクラスは、ビットマップイメージを表現する。 現状で、Bitmapオブジェクトを生成する手段は、load_bitmap()関数のみである。

Bitmap load_bitmap(string file_name);
file_nameで指定されるファイルから.bmpファイルを読み込み、 Bitmapオブジェクトを生成する。

その他の型(列挙型、delegate)

KeyCode列挙型
キーコードを表現する列挙型。 覧はwindow.dkhを参照のこと。
PenStyle列挙型
Penの線種を指定する。
SOLID実線
DASH破線
DOT点線
DASH_DOT一点鎖線
DASH_DOT_DOT二点鎖線
DrawMode列挙型
描画モードを指定する。
COPY 指定された描画色を画面に上書きする形で書き込む。 デフォルトの動作。
XOR 指定した描画色のNOTを取った色で、画面に対しXORで書き込む (Windows APIのSetROP2()におけるR2_NOTXORPEN)。
MouseButton

マウスのボタンの種類を示す。

LEFTマウスの左ボタン
MIDDLE(あれば)マウスの中央ボタン
RIGHTマウスの右ボタン
void WindowDestroyProc()
ウィンドウの×ボタンがクリックされた際に呼び出される関数のdelegate。
void WindowPaintProc(Graphics g)
ウインドウの再描画が必要な際に呼び出される関数のdelegate。
void KeyDownProc(Window window, KeyCode key_code, int repeat_count)
キーが押下された際に呼び出される関数のdelegate。 repeat_countは、キーリピートに処理が追いつかなかった際に その間に発生したリピート数を意味する。通常は1。
void KeyUpProc(Window window, KeyCode key_code)
キーが離された際に呼び出される関数のdelegate。
void MouseButtonDownProc(Window window, int x, int y, MouseButton button)
マウスボタンが押下された際に呼び出される関数のdelegate。 x, yはその時点でのカーソルの座標を意味する。
void MouseButtonUpProc(Window window, int x, int y, MouseButton button)
マウスボタンが離された際に呼び出される関数のdelegate。 x, yはその時点でのカーソルの座標を意味する。
void MouseMoveProc(Window window, int x, int y)
マウスカーソルが移動した際に呼び出される関数のdelegate。 x, yは移動後のカーソルの座標を意味する。
void MouseDragProc(Window window, int x, int y, MouseButton button)
マウスでドラッグした際に呼び出される関数のdelegate。 x, yは移動後のカーソルの座標を、 buttonは押下されているマウスボタンを意味する。

その他の関数

void message_loop();
メッセージ待ちのループに入る。 このループの中で、ウインドウの再描画、マウスイベント等を検知し、 コールバック関数が呼び出される。
void timed_message_loop(Window window, int millisecond);
時限メッセージループ。 millisecondで指定された時間(ミリ秒単位)を経過すると、 イベントの有無に関わらずメッセージループを抜ける。
windowは、存在するウインドウであれば何を指定してもよい。
boolean is_key_pressed(KeyCode code);
codeで指定されたキーが現在押されていればtrueを返す。
void window_destroy_and_exit()
プログラムを終了する。 Window#set_destroy_proc()にてこの関数を設定することを想定している。 それにより、×ボタンでプログラムを終了するようになる。
int message_box(Window owner, string title, string caption, int flags);
メッセージボックスを表示する。 まともに作っていないので、今のところほぼ隠し関数。flagsは無視するし。

例外クラス

WindowInternalException
通常発生しない、Windowsの内部エラー。
WindowArgumentException
window.dkhの関数、メソッドに不正な引数を渡した場合に発生する。


前のページ | 次のページ | ひとつ上のページに戻る | トップページに戻る