画面に文字を出力する関数
今まで、zdoomに内蔵されている関数と言えばほとんどprint関数しか紹介しませんでした。
しかも、print関数の最小限の使い方しか紹介していませんでした。
ここでは、画面に文字を出力する関数のほぼすべてを紹介し、使い方を説明します。
※第2版と大体同じ内容です。
print関数
print関数の一般的な形
print関数は指定した数字や文字列を(この関数の起動主の)画面に表示させる関数です。
では、print関数の一般の形を見てみましょう。
void Print(item(s));
voidは戻り値が何もないことを意味しています。
item(s)に、表示させたい文字列や、数字を入力します。
item(s)の一般的な形は、
<cast type>:<expression>
<cast type>で表示する文字列や数字の種類を指定し、<expression>で内容を指定します。
<cast type>と<expression>の間に:(コロン)があることに気をつけて下さい。
//例
print(s:"This is a test");
//"This is a test"という文字列が画面の中央に表示されます。
この場合、<cast type>は's'の文字列型で、<expression>は"This is a test"という文字列です。(文字列型の変数を持ってきてもOKです。)
<cast type>の種類を紹介します。
<cast type>に入れる文字 | <expression>に入力する値と表示する文字の種類 |
a | 文字としてのint型を要素とする配列変数を[ ](要素を指定する括弧)抜きで入力すると、要素の順番に文字が表示されます。(文字列ではないので注意して下さい。) |
c | 文字としてのint型に対応した文字を表示します。(1文字だけです。また、文字列ではありません。) |
d | 10進法の整数を表示します。 |
f | 固定小数点数を表示します。(小数の状態で表示します。) |
i | 整数を表示します。'd'と同じです。 |
k | ゲームプレイヤーが割り当てているキーの役割を入力すると、割り当てているキーの名前が表示されます。 例: k:"+jump"など |
l | 不明です・・・同じWAD内にあるテキストファイルを開くのだと予想していたのですが、どうやら違うようです・・・'s'と同じように思われます。 |
n | Thingの名前を表示します。 1〜8を入力すると、そのゲームに参加している(指定した番号の)プレイヤーの名前を表示します。もし、(指定した番号の)プレイヤーがゲームに参加していなければ"Player 番号"と表示されます。 それ以外の場合(入力する値が0や9以上のときなど)は、この関数の起動主の名前を表示します。もし、起動主がプレイヤーでなければ、そのThingのClassの名前を表示します。 |
s | 文字列を表示します。 |
c,d,f,s指定子は紹介しましたよね。
d,f,s指定子さえ覚えていれば十分だと思います。
//例
#include "zcommon.acs"
int a = 2;
int b = 1;
Script 1 ENTER
{
print(d:a + b);
}
が表示されます。
文字列とint型変数を組み合わせて表示したいっていう時がありますよね。
複数の<cast type>と<expression>を同時に表示させる方法を紹介します。
その場合のprint関数の書き方は
void Print(<cast type1>:<expression1> , <cast type2>:<expression2> , ...);
このように、<cast type○>:<expression○>の後に,(コンマ)を付けてから次の<cast type>と<expression>を書きましょう。
//例
#include "zcommon.acs"
Script 1 ENTER
{
int imp = 15;
print(s:"Destroy ",d:imp,s:" imps!");
}
//d:impの部分では数字しか表示されないので数字の前後の空白はその前後の文字列に入れています。
が表示されます。
エスケープシーケンス
s指定子を使用すると、ほとんどの文字がそのまま使用できますが、"記号や改行を表す文字は別の文字で表す必要があります。
次の例を見て下さい。
「改行」の間違った使用例
#include "zcommon.acs"
Script 1 ENTER
{
print(s:"This is the first line
This is the second line");
//改行しました
}
このACSを実行してみると
と改行されずに表示されてしまいます。
また、次の例も見て下さい。
"ダブルクォーテーションマーク"の間違った使用例
#include "zcommon.acs"
Script 1 ENTER
{
print(s:"You destroyed the "cyberdemon"");
//コンパイルできません。
}
このACSはコンパイラが"You destroyed the "をひとまとまりの文字列と考えてしまい、正常にコンパイルせずに、エラーが発生します。
このような特殊な文字を入力したいときに、エスケープシーケンス(escape sequence)を使用します。
エスケープシーケンスの入力方法は
\○
です。○には文字を入れます。
ちなみに、外国では\の部分はバックスラッシュ(/が反対に傾いた記号)ですが、日本では\になっています。
○の部分に入れる文字のうち、一部を紹介します。
\○のの○の部分に入れる文字 | 表示される文字 |
n | 改行します。 |
t | 画面には空白と同じ役割を果たしますが、コンソールには正方形が表示されます。 C言語などの名残と思われます。(役割が違いますが) |
r | 画面には空白と同じ役割を果たしますが、コンソールには三角形が表示されます。 ただし、コンソールにおいて、\rが文字列の最後にあると、その文字列がある行がすべて消えます。 C言語などの名残と思われます。(役割が違いますが) |
" | ダブルクォーテーションマークを表示します。 |
\ | バックスラッシュを表示します。 |
0 | この文字より後に文字があったとしても、ここで文字列の表示を終了します。 \0はナル文字とか呼ばれます。C言語などでは重要な要素なので、その名残であると思われるのですが、ACSではまず使いません。 |
専ら\nしか使わないと思います。では、先ほどの例をエスケープシーケンスを使って書き直してみましょう。
"改行"の例
Script 1 ENTER
{
print(s:"This is the first line\nThis is the second line");
//改行しました
}
が表示されます。
"ダブルクォーテーションマーク"の例
#include "zcommon.acs"
Script 1 ENTER
{
print(s:"You destroyed the \"cyberdemon\"");
}
が表示されます。
文字の色の変更
次に、文字の色を変えてみましょう。
変えたい文字列の前に\c○(○はアルファベット1文字)と入力するとそれより後ろの文字列の色を変えることができます。
例
print(s:"\cgThis is red \chThis is blue");
//"This is red"は赤色で、"This is blue"は青色で表示されます。
これも、エスケープシーケンスの一種だと思います。
色の種類を紹介します。
"\c○"の○に入るアルファベット | 色 | 画像 | colorに入る定数 (※) |
定数の値 (※) |
a | 赤っぽい煉瓦色 | ![]() |
CR_BRICK | 0 |
b | 黄褐色、小麦色? | ![]() |
CR_TAN | 1 |
c | 灰色? | ![]() |
CR_GRAY または CR_GREY |
2 |
d | 緑色 | ![]() |
CR_GREEN | 3 |
e | 茶色 | ![]() |
CR_BROWN | 4 |
f | 金色(明るい黄色) | ![]() |
CR_GOLD | 5 |
g | 赤色 | ![]() |
CR_RED | 6 |
h | 青色 | ![]() |
CR_BLUE | 7 |
i | オレンジ色 | ![]() |
CR_ORANGE | 8 |
j | 白色(灰色より微妙に白と黒の差が大きいです。) | ![]() |
CR_WHITE | 9 |
k | 黄色 | ![]() |
CR_YELLOW | 10 |
l | 文字として使われている画像の元々の色だと思います。 | ![]() |
CR_UNTRANSLATED | -1 |
m | 黒色 | ![]() |
CR_BLACK | 12 |
n | 水色 | ![]() |
CR_LIGHTBLUE | 13 |
o | クリーム色 | ![]() |
CR_CREAM | 14 |
p | オリーブ色 | ![]() |
CR_OLIVE | 15 |
q | 暗緑色 | ![]() |
CR_DARKGREEN | 16 |
r | 暗赤色 | ![]() |
CR_DARKRED | 17 |
s | 焦茶色 | ![]() |
CR_DARKBROWN | 18 |
t | 紫色 | ![]() |
CR_PURPLE | 19 |
u | 暗い灰色 | ![]() |
CR_DARKGRAY または CR_DARKGREY |
20 |
ちなみに\c["色の名前"]でも色が指定できるようです。ただし、textcolorsに定義されている物のみのようです。
例:\c[green]
など
※「colorに入る定数」はHudMessage関数で使用します。
フォントの変更
日本語でもフォント(書体)に明朝体とかゴシック体がありますよね、zdoomにもフォントがあります。
文字のフォント(書体)を変えてみましょう。
文字のフォントを変えるにはSetFont関数を使用します。
SetFont関数は、現在のフォント(何も指定されていない場合は"smallfont")から指定した名前のフォントに変更し、そのSetFont関数があるScriptの中でのみ、そのSetFont関数より後の文字を表示させる関数に影響を与えます。
(今までの文字のフォントはsmallfontだったのですね。)
SetFont関数の一般の形は
void SetFont(str fontlump);
引数fontlumpに指定したいフォントの名前を文字列で入力します。
とりあえず具体例を見てみましょう。
//例
#include "zcommon.acs"
Script 1 ENTER
{
SetFont("bigfont");
print(s:"This is \"bigfont\"");
//エスケープシーケンスを使ってみました。
}
が表示されます。
いつもよりも大きめの文字が画面に表示されると思います。
ZDOOMには、最初から3種類のフォントが用意されていますが、オリジナルのフォントを作成すればそれらを利用することもできます。
最初から用意されているフォントを紹介します。
フォント名 | 特徴 | 画像 |
CONFONT | コンソールで使われているフォントです。 | |
SMALLFONT | 小さめのフォントです。 SetFont関数を使用していない場合はこれが自動的に選択されます。 |
|
BIGFONT | 大きめのフォントです。 |
画像を画面に出力
ゲーム画面に画像を出力したいときってありますよね。
先ほど紹介したSetFont関数を利用すると画像を画面に出力することができます。
次の例を見て下さい。(IWADはDOOM2.wadを使用しています。)
//例
#include "zcommon.acs"
Script 1 ENTER
{
SetFont("GATE1");
print(s:"A");
}
が表示されます。
このように、SetFont関数に表示したい画像の名前を入力して、print関数(やそれに準ずる関数)に文字列"A"を表示させるようにすると、表示したい画像が表示されます。
print関数では文字を中央に表示させるだけでしたが、HudMessage関数では表示時間、表示する座標などを細かく設定することができます。ただし、HudMessage関数はprint関数と違って、引数で指示しない限り、画面で表示したメッセージがコンソールでは表示されません。
HudMessage関数の一般の形は
hudmessage (text; int type, int id, int color, fixed x, fixed y, fixed holdTime, ...);
textはprint関数で紹介したitem(s)の部分に相当します。
引数typeはメッセージの表示する方法を指定します。
引数idは表示したメッセージに番号を付けます。
引数colorは表示するメッセージの色を指定します。
引数xとyはメッセージを表示する座標を指定します。
引数holdtimeはメッセージを表示する時間を指定します。
また、引数typeの値によって、これより後に新たに引数を指定しなければならない場合があります。(...の部分です。)
これらの引数を引数ごとに紹介していきます。
引数type
引数typeはメッセージを表示する方法を整数(専ら定数)で指定します。
zdefs.acsでは次の様な定数がすでに定義されているのでそのまま定数を使うことができます。
typeに入れる定数 | 値 | 説明 | 新たに増える引数 | 引数の説明 |
HUDMSG_PLAIN | 0 | そのままメッセージを描写します。 | なし | なし |
HUDMSG_FADEOUT | 1 | 文字が消えるときに、新たに増える引数fadetimeに入力した時間の分だけ時間をかけてゆっくりと消えていきます。(フェードアウト) | fixed fadetime (fixed point values) |
メッセージが消え始めてから消え終わるまでのまでの時間を指定します。 単位は秒で、固定小数点数で指定します。 |
HUDMSG_TYPEON | 2 | メッセージを指定した間隔で一文字ずつ順番に表示していきます。タイピングをしているように見えます。 | fixed typetime (fixed point values) |
メッセージの文字と文字を打つ時間の間隔を指定します。 単位は秒で、固定小数点数で指定します。 |
fixed fadetime (fixed point values) |
メッセージが消え始めてから消え終わるまでのまでの時間を指定します。 単位は秒で、固定小数点数で指定します。 |
|||
HUDMSG_FADEINOUT | 3 | メッセージがフェードインして、しばらくしてからフェードアウトします。 | fixed inTime | メッセージが現れ始めてから完全に現れるまでのまでの時間を指定します。 単位は秒で、固定小数点数で指定します。 |
fixed outTime | メッセージが消え始めてから消え終わるまでのまでの時間を指定します。 単位は秒で、固定小数点数で指定します。 |
※新たに増える引数はhudmussage関数の...の部分の引数にあたります。このページの解説で紹介している順番(上から下)に付け加えて下さい。また、付け加える必要が無ければ、この引数自体を書く問題はありません。
例:hudmessage (s:"argument"; HUDMSG_FADEOUT, 1, CR_RED, 0.5, 0.5,
5.0, 2.0);//この場合、新たに1つ引数を付け加えます。
さらにこれらにビット論理和(|演算子)を使用して、次の表示条件を付け足すことができます。
次の表を見るとわかりますが、確かにビット論理和を使用するのに都合の良い値になっていることがわかります。
(その6でビットの並びとしてのint型を紹介しましたよね。)
typeに入れる定数 | 値(16進数) | 値(2進数) | 説明 |
HUDMSG_LOG | 80000000 | 10000000000000000000000000000000 | 画面上で表示したメッセージをコンソール上でも表示させます。 |
HUDMSG_COLORSTRING | 40000000 | 01000000000000000000000000000000 | 引数colorは通常、定数(整数)を入力しますが、この条件を付け加えると、色の名前を書いた文字列を定数の代わりに入力することができます。 |
引数id
引数idに整数を入力することで、画面に表示したメッセージに管理用の番号を付けることができます。
複数のHudMessage関数のメッセージが時間的に重なるように表示してしまうときに、idを決めておくと便利です。
idが0でない、あるメッセージが最初に表示されているとします。そのidと同じメッセージが後から表示されると、前者のメッセージは後者のメッセージの表示と同時に(表示していれば)画面上から消えてしまいます。
また、idの値が小さいメッセージほどより前に表示されます。
引数color
全体の文字の色を指定します。部分的に変えたい箇所があればprint関数のときと同様に、文字列に\c○(○は対応するアルファベット)と入力して色を変えることもできます。\c○で色を何も指定していない場合は、引数colorで指定した色が表示されます。
引数colorに対応した定数の一覧は、print関数を紹介したときの色の表を見て下さい。
引数xとy
これらの引数でメッセージを表示する座標(それぞれx座標、y座標)を指定しますが、少し複雑です。
基本的には0.0〜1.0のように、小数単位で考えますが、整数部分が変わったりマイナス記号がついたりします。
xやyの値の次の表を参考にして下さい。
引数xについて(横方向)
xの範囲 | 指定したx座標を基準にするもの | 値の増減と位置の関係 | 改行されたメッセージの表示方法 |
0.0 <= x <= 1.0 | メッセージの中心を通る部分 メッセージのちょうど真ん中の部分が指定した座標なります。 |
x=0.0のときは左端 (メッセージの左端がちょうど画面の左端に接します。) x = 1.0のときは右端 (メッセージの右端がちょうど画面の右端に接します。) 値が増えるほど位置は右になります。 |
メッセージが改行(\n)されていても全体として左詰に表示されます。 |
-1.0 <= x < 0 | メッセージの左端 指定した座標からメッセージが左詰で表示されます。 |
x = -1.0のときは右端 (メッセージの左端がちょうど画面の右端に接します。つまり、メッセージが完全に画面の右端に隠れます。) 値が減るほど位置は右になります。 |
メッセージが改行(\n)されていても全体として左詰に表示されます。 |
1.0 < x <= 2.0 | メッセージの中心を通る部分 メッセージのちょうど真ん中の部分が指定した座標なります。 |
x = 2.0のときは右端 (メッセージの右端がちょうど画面の右端に接します。) 値が増えるほど位置は右になります。 |
メッセージが改行(\n)されていればその行ごとについて全体として中央揃えになります。行ごとの中心のx座標は同じです。 |
-2.0 <= x < -1.0 | メッセージの左端 指定した座標からメッセージが左詰で表示されます。 |
x = -2.0のときは右端 (メッセージの左端がちょうど画面の右端に接します。つまり、メッセージが完全に画面の右端に隠れます。) 値が減るほど位置は右になります。 |
メッセージが改行(\n)されていればその行ごとについて全体として中央揃えになります。行ごとの中心のx座標は同じです。 |
それ以外 | メッセージの中心を通る部分 メッセージのちょうど真ん中の部分が指定した座標なります。 |
ずっと画面の真ん中に表示されます。 | メッセージが改行(\n)されていればその行ごとについて全体として中央揃えになります。行ごとの中心のx座標は同じです。 |
引数yについて(縦方向)
yの範囲 | 指定したy座標を基準にするもの | 値の増減と位置の関係 |
0.0 <= y <= 1.0 | メッセージの中心を通る部分 メッセージのちょうど真ん中の部分が指定した座標なります。 |
y=0.0のときは上端 (メッセージの上端がちょうど画面の上端に接します。) x = 1.0のときは下端 (メッセージの下端がちょうど画面の下端に接します。) 値が増えるほど位置は下になります。 |
-1.0 <= y < 0.0 | メッセージの上端 指定した座標からメッセージが上詰で表示されます。 |
x = -1.0のときは下端 (メッセージの上端がちょうど画面の下端に接します。つまり、メッセージが完全に画面の下端に隠れます。) 値が減るほど位置は下になります。 |
それ以外 | 画面からはみ出て映りません。 | 画面からはみ出て映りません。 |
この表だとわかりにいので実際に試して理解して下さい(^_^;)
引数holdTime
引数holdTimeに秒数を固定小数点数で入力することで、その秒数だけメッセージを表示します。(ただし、フェードアウト・インなどにかかる時間は除きます。)ここに0.0を入力すると、このメッセージは(同じidのメッセージが表示されない限り)永遠に表示されます。
//例
#include "zcommon.acs"
Script 1 ENTER
{
int monsters = ThingCount(0,999);//Tidが999のモンスターの数を数えます。
SetFont("BIGFONT");
hudmessage (s:"Destory \ch",d:monsters,s:" \cjmonsters!";HUDMSG_PLAIN, 0, CR_WHITE, 0.5, 0.4,4.0);
//文字の色を変えました。
}
が4秒間表示されます。(見えにくいですが青い字は3で、Tidが999のcacodemonが3体います。)
例
Script 1 ENTER
{
hudmessage (s:"\cgmissions:\n \cj\rfind the secret key\n \cj\rescape from this facility";HUDMSG_TYPEON | HUDMSG_LOG, 0, CR_WHITE, -0.2, 0.4, 5.0, 0.1, 1.0);
//x座標が-0.2で左詰に表示します。
//ちなみに、\cjを書かなくても画面には同じように表示されますが、コンソールは色が変わって表示されます。
}
と順番に画面に表示されます。
ちなみに、コンソールを開くと、
と表示されます。
SetHudSize関数
ゲーム中に表示されるメッセージの一つ一つの文字は、ゲーム画面の解像度がどんな値であろうと一定の大きさで表示されます。
つまり、ゲーム画面が高解像でであれば相対的に文字が小さくなり、ゲーム画面が低解像度であれば、相対的に文字は大きくなります。
つまり、ゲーム画面の大きさによってメッセージの見え方が全く変わってしまうという問題が生じてしまいます。
メッセージを表示するだけならあまり問題ないのですが、HudMessage関数を使って画面上に表を作ったりしたときや、全画面が一つの画像で埋まるようにHudMessage関数を使ったりしたときなどに問題が発生します。
こんな時に、メッセージの一つ一つの文字を拡大・縮小することで、メッセージの見え方を統一してくれる関数がSetHudSize関数です。
SetHudSize関数の一般の形は
void SetHudSize(int width, int height, int statusbar);
まず、引数について紹介します。
引数widthとheight
基準となるゲーム画面の解像度を指定します。
widthに横幅を、heightに高さを入力します。
この解像度と異なったゲーム画面でプレイすると、自動的にメッセージを拡大・縮小してくれて、ゲーム画面とメッセージの大きさが相対的に同じになります。
引数statusbar
値が0であれば、ステータスバーを考えずにゲーム画面だけを考えて、拡大・縮小を行います。(ステータスバーの有無によってメッセージの位置が変わります。)
値が1であれば、ステータスバーがゲーム画面に占める領域も考えて拡大・縮小を行います。(ステータスバーの有無にかかわらずメッセージの位置はかわりません。)
//例
SetHudSize(640,480,1);
SetHudSize関数を使用すると、HudMessage関数のx,y座標の入力の仕方が変わってきます。
例えばSetHudSize関数が先ほどの例のようになっているとき、画面の中心にメッセージを表示したいときは次の様にx,yを指定します。
hudmessage (text; int type, int id, int color, 320.0, 240.0, fixed holdTime, ...);
このように、FixedPointValueでSetHudSize関数で指定した縮尺のままで座標を指定しましょう。
ここで、文字の右詰、真ん中揃えなどの指定の方法が変わってきます。
小数第一位の値を変えることで文字のそろえ方を変えることができます。
引数xについて
xの小数第一位 | 指定した座標にくるメッセージの部分 | 改行されたメッセージの表示方法 |
.0 | メッセージの中心 | メッセージが改行(\n)されていても全体として左詰に表示されます。 |
.1 | メッセージの左端 | メッセージが改行(\n)されていても全体として左詰に表示されます。 |
.2 | メッセージの右端 | メッセージが改行(\n)されていても全体として左詰に表示されます。 |
.4 | メッセージの中心 | メッセージが改行(\n)されていればその行ごとについて全体として中央揃えになります。行ごとの中心のx座標は同じです。 |
.5 | メッセージの左端 | メッセージが改行(\n)されていればその行ごとについて全体として中央揃えになります。行ごとの中心のx座標は同じです。 |
.6 | メッセージの右端 | メッセージが改行(\n)されていればその行ごとについて全体として中央揃えになります。行ごとの中心のx座標は同じです。 |
引数yについて
yの小数第一位 | 指定した座標にくるメッセージの部分 |
.0 | メッセージの中心 |
.1 | メッセージの上端 |
.2 | メッセージの下端 |
//例
#include "zcommon.acs"
Script 1 ENTER
{
SetFont("smallfont");
SetHudSize(640,480,1);
hudmessage (s:"x:centers text and aligns right edge\ny:positions bottom edge of box";HUDMSG_PLAIN, 0, CR_WHITE, 320.6, 240.2, 0.0);
}
//x座標・・・それぞれの行が中央揃えかつ右詰
//y座標・・・下詰め
と表示されます。(右下の+は銃の照準(画面の中心)です。)