Diksamも言語としては一応それなりの機能が揃ったと思うので、 次に必要なのはライブラリです。
といってもstdio.hみたいなのばかり拡充させていってもあまり面白くありません (それはそれで必要ですが)。PHPがWebページ作りに特化しているように、 言語には、何か「得意技」が必要なのだと思います。
では、Diksamをどっち方面に向かわせるかですが。
大昔、こっちの方に 書いたんですが、私の世代は、スイッチオンBASICなマシン(PC-8001とか)で、 「UFOを打ち落とすゲーム」みたいなのを作ったものでした。 当時のPCの能力やBASICという言語の限界、また私の場合は何よりも私自身の 能力の問題で、そんなにたいしたものは作れなかったのですが、 それでも、自分で書いたプログラムどおりに画面で何かが動くというのは 結構楽しかったですし、プログラミングを学ぶ最初の一歩にはなったと思います。 言語がBASICだけに、変な癖が付いただけ、というのも否定できませんけど。
今現在、そういうことができる言語はあまりないように思えます。 一部は上でリンクしたページでも書いてますが、
という主張のほうが正しいと思う。弾さんは 『HTML/DOMなしでも、プログラミング入門としてJavaScriptを使うことは出来ます。 「シェル」を用意してしまえば済むのですから。』というけれど、 「シェル」上でhello, world.ができたってしょうがない。 画面で何か動いたりするような「気の利いたことをやろうとすると」、 やっぱりDOMの理解は必要になります。 また、crowbarとか作っておいてなんですが、 プロトタイプベースOOはやっぱりわかりにくいのでは。そして、これが最大の理由なのですが、 JavaScriptでブラウザ上で気の利いたことをやろうとすると、 必ずHTML/DOMの理解が必要になります。 いまからプログラムを勉強しようという人にとって、 これはかなり敷居が高いです。
……というわけで、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.dkm | UFOゲーム。カーソルキーで左右移動、スペースキーで ビーム発射。UFO爆発時にnで次のゲーム、qで終了。 |
ufo2.dkm | UFOゲームのUFOのビットマップ表示板。 |
wintest.dkm | 全体的なテストプログラム。 |
コンパイルは、UNIX版は上記ソースを展開したディレクトリの mainフォルダの下でmakeを、 Windows版はwindowsフォルダの下でmake(私はgmakeに改名していますが) を叩いてください。
また、今回、言語仕様も多少修正しています。最新版は以下を参照ください。
Diksam言語仕様 ver.0.4.01Diksam on Windows使用可能なクラス、関数の一覧を以下に挙げます。
また、こちらにwindow.dkhのソース を載せておきます。
Brushはcreate_solid_brush()関数で作るくせに Penはコンストラクタで作るとか、変なところがいろいろあるので 修正の可能性は大です。 Diksamについては、ver.1.0までは、後方互換性は気にせず修正していきたいと 思っています。ご理解のうえご使用くださいませ。
Windowクラスは、画面に表示されるウインドウに対応するクラスである。
Windowは、create_window()関数により生成する。
タイトルバーに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クラスは、ウインドウの属性を決定するために create_window関数に渡すためのクラスである。
WindowAttributeオブジェクトは、create_window_attribute()関数を使うか、 newすることにより生成する。
デフォルトのWindowAttributeオブジェクトを生成する。
メソッド一覧
void set_x(int x) | ウインドウのx座標(枠を含む左上端)を指定する。 これを指定しなければ、デフォルトの座標に表示される。 |
void set_y(int y) | ウインドウのy座標(枠を含む左上端)を指定する。 これを指定しなければ、デフォルトの座標に表示される。 |
constructor initialize() | デフォルトコンストラクタ。 x, y, 背景色ともにデフォルトに設定する。 |
フィールド一覧
Brush background | ウインドウの背景となるBrushオブジェクト。 |
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は、線を描画する際の色、線幅、スタイルを指定するクラスである。
メソッド一覧
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は、塗りつぶしのためのブラシを表現するクラスである。
現時点では、create_solid_brush()関数で生成する。
指定された色の塗りつぶしブラシを生成する。
メソッド一覧
dispose() | ブラシを破棄する。 |
Colorは色を表現するクラスである。現状では、文字の描画に使用している。
メソッド一覧
constructor rgb(int r, int green, int blue) | 指定された色でColorを生成する。 |
Fontは文字のフォントを指定する。create_font()関数にて生成する。
heightで指定された高さのフォントを生成する。 attrは、その他のフォントの属性を指定するが、 デフォルトでよければnullを指定すればよい。
メソッド一覧
dispose() | フォントを破棄する。 |
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クラスは、2次元座標(単位はint)上の点を表現する。 現状では、Graphics#draw_polyline()にて使用する。
メソッド一覧
constructor initialize(int x, int y) | x座標、y座標を与えてPointを生成する。 |
フィールド一覧
int x | x座標 |
int y | y座標 |
Bitmapクラスは、ビットマップイメージを表現する。 現状で、Bitmapオブジェクトを生成する手段は、load_bitmap()関数のみである。
SOLID | 実線 |
DASH | 破線 |
DOT | 点線 |
DASH_DOT | 一点鎖線 |
DASH_DOT_DOT | 二点鎖線 |
COPY | 指定された描画色を画面に上書きする形で書き込む。 デフォルトの動作。 |
XOR | 指定した描画色のNOTを取った色で、画面に対しXORで書き込む (Windows APIのSetROP2()におけるR2_NOTXORPEN)。 |
マウスのボタンの種類を示す。
LEFT | マウスの左ボタン |
MIDDLE | (あれば)マウスの中央ボタン |
RIGHT | マウスの右ボタン |