Section 3.4 レイヤに文字を書く

前回はレイヤに画像を表示したから、今回はレイヤに文字を書いてみるね。
メッセージレイヤみたいな感じに?
ん、そう。
あ、そういえばメッセージレイヤって文字を書く専用のレイヤなの?
ううん、メッセージレイヤも普通のレイヤだよ。
KAG では画像を表示するレイヤとメッセージを表示するレイヤを使い分けてるけど、 元々画像を表示するためのレイヤとか文字を書くためのレイヤっていう区別はないんだ。
だから、1つのレイヤに画像と文字を両方表示することもできるよ。
へぇ、そうなんだ。
で、レイヤに文字を書くのに使うのが drawText メソッド。
このメソッドは、今まで使ってきたメソッドの中で一番引数が多いメソッドなんだ。
多いって…どれくらいあるの?
11個。
そんなにあるの!?
うん。drawText メソッドの引数はこうなってるよ。

drawText メソッドの引数>
引数名引数の意味デフォルト値
第1引数x文字を書き始める点の x 座標
第2引数y文字を書き始める点の y 座標
第3引数text描画する文字列
第4引数color文字の色
第5引数opa文字の不透明度255 (不透明)
第6引数aaアンチエイリアスを行うかtrue (行う)
第7引数shadowlevel影の不透明度0 (影をつけない)
第8引数shadowcolor影の色0x000000 (黒)
第9引数shadowwidth影の幅0
第10引数shadowofsx影の位置の x 座標0
第11引数shadowofsy影の位置の y 座標0

うわ、ほんとにいっぱいあるね…
まぁ、第5引数以降の7個の引数は省略できるんだけどね。
あと文字に影をつけない場合は第7引数以降は必要ないし。
う〜ん、でも結構ややこしそうだね…
普通の文字を書く場合は最初の4つだけ指定して、後はデフォルトのままでいいから、そうでもないと思うよ。
そうなの?
うん。
じゃあ実際に drawText を使ってレイヤに文字を書いてみよっか。
うん!

drawText メソッドの使用例>

class SimpleWindow extends Window
{
    var messageLayer;  // 文字を書くためのレイヤ

    // コンストラクタ
    function SimpleWindow()
    {
        super.Window();  // スーパークラスのコンストラクタを呼び出します
        setInnerSize(250, 50);  // クライアント領域のサイズを 250×50 にします

        // プライマリレイヤを作ります
        add(new Layer(thisnull));

        // プライマリレイヤのサイズをウィンドウのクライアント領域のサイズに合わせます
        primaryLayer.setSize(innerWidth, innerHeight);

        // 文字を書くためのレイヤを作ります
        messageLayer = new Layer(this, primaryLayer);
        add(messageLayer);
        with(messageLayer)
        {
            // プライマリレイヤと同じ位置・大きさにします
            .setPos(0, 0, innerWidth, innerHeight);
            // フォントの高さを 24 ピクセルに設定します
            .font.height = 24;
            // messageLayer の左上の位置から赤字で「drawTextで文字表示!」と書きます
            .drawText(0, 0, "drawTextで文字表示!", 0xFF0000);
            // レイヤを表示状態にします
            .visible = true;
        }

        visible = true;
    }

    // デストラクタ:スーパークラスのデストラクタを呼び出します
    function finalize()
    {
        super.finalize();
    }
}

var win = new SimpleWindow();  // ウィンドウを作ります

じゃーまずは実行から。
は〜い。

<実行結果>

実行の結果表示されたウィンドウ

お〜、ちゃんと文字が表示されてる!
それじゃ、スクリプトの方を見とこっか。
うん。
今回もデストラクタはスーパークラスのデストラクタを呼び出してるだけだから省略するとして、 コンストラクタで、プライマリレイヤを作るとこまでは解るよね?
うん、おっけーだよ。
ん、じゃあ messageLayer を作るとこからね。
えっと、messageLayer を作った後に、setPos メソッドでレイヤの位置と大きさを指定してるんだよね?
うん、そう。
setPos メソッドは第1、第2引数が位置で第3、第4引数が大きさだから…
第1、第2引数はどっちも 0 になってるから messageLayer とプライマリレイヤの左上の点は同じ位置になるんだよね?
そうそう。
あと、第3引数が innerWidth、第4引数 innerHeight ってことは、messageLayer のサイズもウィンドウのクライアント領域と同じだよね。
つまり、messageLayer とプライマリレイヤは大きさも同じってことだね。
次に『.font.height』って書いてあるけど、これってプロパティ?
ん、これはレイヤが持ってる Font クラス のオブジェクトのプロパティだよ。
Font クラス?
Font クラスってのは名前の通りフォントを管理するクラスだよ。
レイヤはそれぞれ Font クラスのオブジェクトを持ってて、font っていうプロパティで参照できるんだ。
へぇ…あ、じゃあ height っていうのはフォントの高さを設定できるプロパティなの?
うん、そだよ。
drawText メソッドは文字の大きさを指定できないから、こうやって文字の大きさを指定するんだ。
あ、そういえば drawText メソッドには文字の大きさを指定する引数なかったね。
メソッドの引数で指定できないフォント関係の設定には font プロパティを使うんだ。
ちなみに、height24 を代入してるから、文字の高さは 24 ピクセルになるよ。
height プロパティがあるってことは、width プロパティもあるの?
ううん、width プロパティはないよ。
文字の幅は文字の高さに合わせて自動的に決められるから。
あ、そうなんだ。
今回使うのは height プロパティだけなんだけど、 Font クラスには他にもプロパティやメソッドがあるから、次回詳しく見ていくことにするね。
うん、りょーかい。
じゃ、次は drawText メソッドを実行してるとこね。
引数が4つ指定されてるね。
最初の2つは文字を書き始める位置だね。
どっちも 0 になってるってことは、レイヤの左上から書き始めるってことだよね?
ん、そう。表示される文字列は、第1引数の値が大きいほど右に寄って、第2引数の値が大きいほど下に寄るんだ。
ちなみに、例えば右に寄せすぎて文字列がレイヤの中に表示しきれなくなった場合は、途中で切れちゃうから気をつけてね。
自動的に改行されたりしないってこと?
ん、そういうこと。
で、第3引数はレイヤに書き込む文字列ね。
これは表示したい文字列を普通に指定すればいいんだよね?
そ。あと、最後の第4引数は文字の色なんだけど、これはどうやって指定してるかわかる?
えっと、色の指定の仕方は §3.2 でやったよね。
確か、0xAARRGGBB っていう形式だったよね?
drawText メソッドの場合は第5引数で文字の不透明度を指定するようになってるから、AA の指定はいらないんだ。
つまり、0xRRGGBB の形式で指定するってこと。
あ、そうなんだ。
じゃあ、0xFF0000 になってるから、赤が 255 で、緑と青は 0 ってことだね。
そ。だから赤い字になってるってワケ。
なるほどね。
…えっと、指定されてる引数は4つだから、後の7つの引数はデフォルトの値になるんだよね。
うん。つまり、文字は不透明で、アンチエイリアスありで、文字に影はつけない、ってことだね。
アンチエイリアスってなんだったっけ?
アンチエイリアスは文字の縁を滑らかに表示することだよ。
アンチエイリアスをやるかやらないかで、これくらい違って見えるんだ。

<アンチエイリアスの有無による文字表示の違い>

アンチエイリアス有りの文字と無しの文字

結構違って見えるねー。
アンチエイリアスはやってもやらなくてもいいんだけど、まぁ大抵の場合はやっといていいんじゃないかな。
だね。
後は、文字に影をつけるやり方をちょっと説明しとくね。
第7〜第11引数に設定する値によって色んな影がつけられるんだけど、 ここでは Config.tjs で設定できる影と縁取りのつけかたを説明するね。
Config.tjs には影をつけるかどうかの defaultShadow と、 縁取りをするかどうかの defaultEdge っていう設定項目があるよね。
まず、defaultShadowtrue にした時に相当するスクリプトはこれね。

<影付き文字を書くスクリプト>

.drawText(0, 0, "drawTextで文字表示!", 0xFF0000, , , 255, 0xC08080, 0, 2, 2);

さっき実行したスクリプトの drawText の行をこのスクリプトで置き換えて実行してみて。
おっけー。

<実行結果(影付き文字)>

影付き文字

そーそー、defaultShadowtrue にするとこんな感じになるよね。
影を付ける時には、第7引数の shadowlevel に影の不透明度を指定して、 第8引数の shadowcolor に影の色を指定するんだ。
この場合だと、それぞれ 2550xC08080 だから、不透明で暗い赤色の影がつくわけね。
えっと、影の色って Config.tjs の中にある defaultShadowColor のこと?
うん、それのこと。
で、普通の影の場合は第9引数の shadowwidth0 になるんだ。
あと第10、第11引数の shadowofsx, shadowofsy は、影を何ピクセルずれた位置に表示するかってこと。
shadowofsxshadowofsy はどっちも 2 になってるから、影になる文字列は赤い文字列を右に2ピクセル、下に2ピクセルずらした位置に表示されてるってこと?
そういうこと。
じゃ次は defaultEdgetrue の場合ね。

<縁取り文字を書くスクリプト>

.drawText(0, 0, "drawTextで文字表示!", 0xFFC0C0, , , 512, 0xFF0000, 1, 0, 0);

今度は drawText の行をこのスクリプトで置き換えて実行してみて。
は〜い。

<実行結果(縁取り文字)>

縁取り文字

うんうん、defaultEdgetrue だとこんな感じになるよね。
縁取り文字を書く時には、第7引数の shadowlevel に縁取りをどれくらい強調するかを指定して、 第8引数の shadowcolor に縁取りの色を指定するんだ。
じゃあ、縁取りの色が defaultEdgeColor なの?
そだよ。
んで、第9引数の shadowwidth で縁取りをどれだけぼかすかを設定して、 第10、第11引数の shadowofsx, shadowofsy はどっちも 0 にしとくんだ。
引数を変えるだけで、普通の文字も影付き文字も縁取り文字も全部 drawText メソッドで書けるんだねぇ。
これで drawText メソッドに引数が多い理由が解ったでしょ。
うん、納得。
さて、今回はこんなところかな。
文字の書き方は大体解った?
基本的なところは理解できたと思うよ。
ん、それなら OK。
それじゃ、また次回ね〜。


前へ | TOP | 次へ