top
[Index(X)][Back(B)]

PML3

画面写真

※画像なし

作品情報

作品名:
PML3(ピー エム エル スリー)
作者名:
はりまお
制作完了日:
2009年05月08日
制作環境:
Pentium M 1.73GHz + 1GB RAM
WindowsXP Home Edition SP3 + Visual Basic 2008 Express Edition
動作環境:
要 Microsoft .NET Framework 3.5

概要

ゲームなどを作成する際、同じ文字列をフレームを再描画するたびに毎回同じ設定をして描画させることが良くあり、面倒臭いし、処理効率も良くないような気がします。
そこで、予め決まりきった設定を登録しておいて、必要な時にそれらを呼び出すだけで表示させることができるようにと、このPMLを作成しました。

以前のバージョンでは、文字列の描画命令を全てマクロ言語で記述し、そのマクロとマクロで使用する文字列を管理するようになっていた。
しかし、このマクロでできることの多くが、.NET Frameworkが標準機能として持っているものが多かった。

そこで今回は、.NET Frameworkの機能を利用することでマクロを簡素化し、マクロで行っていた書式(フォント・色・配置・座標・描画方法など)の設定を文字列と一緒に保管し、表示したい物をマクロから指定すように変更した。
これによって、PML自体が小さくなると共に、マクロも簡素になりプログラム中から書式の変更も楽になっている。

PMLの構成

PMLの構成

PML3は、以下の三部構成になっています。

構成要素説明
Page文字列や書式を記録します。
NotebookPML3の本体。[Page]を管理したり、マクロを実行したりします。
DrawEngin文字列を描画するための関数がまとめられています。

ページの種類

・[Page]には、5種類あります。
種類説明
SolidPage通常ページ。装飾の無い文字を描画しまう。
設定項目Text, Font, ForeColor, Locate, Format
SimplePageシンプル ページ。[SolidPage]の設定項目から書式を省略したページ。
設定項目Text, ForeColor, Locate
GradationPageグラデーション ページ。文字列をグラデーションで描画します。
設定項目Text, Font, ForeColor, SubColor, StartPoint, EndPoint, Locate, Format
OutlinePage袋文字ページ。袋文字(輪郭線のある文字)を描画します。
設定項目Text, Font, ForeColor, SubColor, Width, Locate, Format
ExtentPage範囲規定ページ。指定した範囲内に収まるように描画します。
設定項目Text, Font, ForeColor, Extent, Format

・各設定項目は、以下の通りです。全て、.NET Frameworkの各機能の使用方法と同じです。
項目説明
Test表示する文字列を設定します。
Font描画する時のフォントの設定をします。
ForeColor文字列を描画する色、[GradationPage]ではグラデーション開始色の設定をします。
SubColor[GradationPage]ではグラデーション終端色、[OutlinePage]では輪郭色の設定をします。
StartPointグラデーション開始座標設定します。
EndPointグラデーション終了座標設定します。
Width輪郭線の太さを設定します。
Locate描画する位置の設定をします。
Extent描画する範囲の設定をします。
Format描画する際の書式を設定します。

・初期値について

新しくページを作成した時の各設定項目の初期値を、変更することができます。
[DefaultParameter]内の"def〜"に、値を入れてください。設定項目は、上記の設定項目名の頭にに"def"を付けたものになります。

[SimplePage]で省略されている項目は、描画を行う時の初期値の値が使われます。登録時の値ではないので注意してください。

使い方

基本的な流れは、最初に描画したい文字列と書式をページとして用意して登録しておき、必要な時に必要なページや機能をマクロで呼び出します。具体的には、下記を参照してください。

最初にやっておくこと
1プログラムの初めに、[Notebook]を作成しておく。
Dim myPml As New PML.Notebook
2必要に応じて初期値を設定しておく。
PML.Page.DefaultParameter.defFont = Me.Font
PML.Page.DefaultParameter.defForeColor = Color.Purple
3必要なページに名前を付けて登録しておく。名前は、大文字と小文字を区別します。
Dim page As New PML.Page.SolidPage
With page
    .Text = "テスト用文字列"
    .Font = New Font("MS ゴシック", 12)
    .ForeColor = Color.Red
    .Locate = New Point(Me.ClientSize.Width, 0)
    .Format = New StringFormat With {.Alignment = StringAlignment.Far}
End With
myPml.Add("Test", page)
プログラム中に内容を変更したくなったら
4初期設定した内容もプログラム中に変更できます。
例1 myPml.Pages("Test").text = "変更後の文字列"
例2 IntelliSenseを表示して欲しい場合は、CTypeを使って定義型を指定します。
CType(myPml.Pages("Test"), PML.Page.SolidPage).Text = "変更後の文字列"
描画したくなったら
5描画先とマクロを指定して、目的の文字列を描画させる。
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    myPml.Run(e.Graphics, "print=Test:")
End Sub

マクロ解体ショー

基本的な文法

マクロは、コマンド文をいくつもつなげて記述します。基本的に半角で書き、大文字と小文字の区別はありません(※ページ名は区別されます。登録時の名前をそのまま指定してください)。普通の文字列なので、変数を間に挟んだり、複数の文字列を連結したり、VB(.NET Framework)の機能を使って加工できます。マクロ中の好きなところに好きなだけ空白文字を入れても問題ありません。読み易いように記述してください。

各コマンドは、下記のようにコマンド名とパラメータから構成されており、それらを"="でつなげ、最後に":"で区切ります。パラメータは、","で区切られ、その数はコマンドによって異なります。

文法"コマンド名[=[パラメータ1][,パラメータ2]]:"

※[〜]は、省略可能
例文"'=サンプル: TRANSLATE=" & Me.ClientSize.Width \ 2 & "," & Me.ClientSize.Height \ 2 & ":SCALE=2:ROTATE=-20: PRINT=Sample,Test: RESET"

マクロの種類と解説

コマンド名ANTIALIAS
省略名A
機能アンチエイリアス(輪郭線のギザギザを誤魔化す)処理を行います。
パラメータ1ON・・・有効にする
OFF・・・無効にする
省略・・・"OFF"を指定したことになります。
パラメータ2なし

コマンド名PRINT
省略名?
機能登録されているページを描画します。
パラメータ1描画したいページの名前。
一度に複数ページを描画したい場合は、コンマで区切りながら続けて書いていきます。
省略・・・全てのページを表示します。
パラメータ2なし

コマンド名REM
省略名'
機能注釈を書きます。全角文字も使えます。(コマンドとしての役割はなく、無視されます。)
パラメータ1なし
パラメータ2なし

コマンド名RESET
省略名RS
機能ANTIALIAS, TRANSLATE, SCALE, ROTATEでの設定を全て初期化します。
パラメータ1なし
パラメータ2なし

コマンド名ROTATE
省略名R
機能座標系を、原点を中心に回転します。
パラメータ1時計回りに回転させる角度を指定します。不の値を指定すると反時計回りになります。
省略・・・"0"を指定したことになります。
パラメータ2なし

コマンド名SCALE
省略名S
機能倍率を変更します。
最初の状態に2倍を指定して、続いて3倍すると、最初に対して6倍したことになります。
パラメータ1X座標方向の倍率を指定します。
省略・・・"1"を指定したことになります。
パラメータ2Y座標方向の倍率を指定します。
省略・・・"1"を指定したことになります。

コマンド名TRANSLATE
省略名T
機能座標系の原点を移動します。
パラメータ1X座標方向の移動量を指定します。
省略・・・"0"を指定したことになります。
パラメータ2Y座標方向の移動量を指定します。
省略・・・"0"を指定したことになります。

注意点

マクロの解析・実行において、厳格なコードを組んでいません。要するに、マクロ解析時のエラー処理などを特に行っていません。よって、間違ったマクロを書いてしまうと、そのまま素通りしてしまったり、実行部でエラーが出て停止してしまったりしますし、エラー箇所を指摘してくれたりもしません。出力結果やエラー内容から、自力で間違いを見つけ出してください。

開発こぼれ話

PMLとは、Print Macro Languageの略です。これは、特に深い意味は無くて、大好きなMSX-BASICにあった"DRAW"文に使われていた[Graphic Macro Language]をぱくっちゃっただけです。と言うのも、もともとVB6にこのDRAW文に変わるものが無いから「創ってみようかなぁ」と思っていたのが、いつの間にか「PRINT USING文もないやん!」ってことで文字列表示機能にすり替わってたという経緯からです。

PML2を創った時は、.NET Frameworkで文字を描画する時に書式を色々設定できるって知らんかったから、PMLで全部実現しようとしてた。そのおかげで、PMLだけで色々できたけど、引き換えにコードもマクロも複雑になっちゃってた。
その後、標準機能だけでかなりの文字列描画処理ができることを知ってしまって、「マクロを書かんとアカンPMLなんて、面倒臭いし要らんわなぁ」って心が傾いてた。けど、描画する度に描画コードを書くのがしんどくなって、最初に一括登録しておけるようにPML3を作ちゃったってわけです。

.NET Frameworkには、任意の文字で文字列を分割する機能があって、マクロの解析がすごく簡単にできて嬉しかった。
その反面、昔のBASICみたいに(MSX-BASIC, VB6にはあった)グラフィックメソッドを使った時の最終参照座標を保持してくれなくなったのがすごく面倒臭くて嫌や。Drawing2D.GraphicsPathで連続する図形を扱えるから要らんと思ってるんやろうか?

[Top(T)][Index(X)][Back(B)]