さて、早速今の時刻を調べて表示してみる事にしましょう。
;ウインドウの準備
title "デジタル時計"
width 24/2*12,24
color 0,0,0
;文字表示の準備
boxf 0,0,319,24
color 255,255,255
font msgothic,24,16
;★時刻の取得
hor=gettime(4)
min=gettime(5)
sec=gettime(6)
;表示
mes " "+hor+":"+min+":"+sec
例の如く、打ち込んで動作を確認してみてください。
まず、;
という記号が出てきていますが、これは「コメント」といって、「この行のこれより先はスクリプトとは関係ありませんよ」という目印です。コンパイラもプログラムなので、このようにちゃんと目印をつけてやらないと、関係のない日本語とソースコードの区別がつかずにエラーを出してしまいます。
また、width 24/2*12,24
の24/2*12という部分は、「24÷2×12」という計算をして、その計算結果(つまり144)をパラメータに指定しています。HSPでは×を*
、÷を/
で表します。計算順序を変えるために()
を使用することも出来ます。何故一々計算にしているかというと、フォントサイズ÷2で文字の横幅を出し、その12文字分にしたかったからです。
そんな細かい事より、今回重要な部分はここです。
;★時刻の取得
hor=gettime(4)
min=gettime(5)
sec=gettime(6)
この部分は簡単に言うと、「関数によって現在時刻を取得し、変数に代入する」ということをやっています。この部分を理解するためには、まず変数について理解する必要があります。
「変数」とは、簡単に言えば数値や文字列などの「値」を入れておくための「入れ物」です。変数に情報を入れることを「代入」といいます。変数に値を代入すると、その変数はその値と同じものとして扱えます。
hp=100 ;変数hpを用意して数値100を代入する
mes hp ;hpの中身を表示する
hp-=10 ;hpから10引く
mes hp ;hpの中身を表示する
hp+=20 ;hpに20足す
mes hp ;hpの中身を表示する
この短いソースコードでは、hpという変数を用意して、そこに100という数値を代入し、その後値を増やしたり減らしたりしてhpを表示しています。各行の意味はコメントの通りです。ちなみにmesの第一パラメータは数値でも文字列でもいいという事になっています。
これだけならそこに100と書けばいいので変数なんていらないように見えます。しかし、変数は非常に重宝するのです。例えばRPGを作ることを考えると、hp=100を初期値として、攻撃を受けたらhpを減らす、回復アイテムを使ったら増やす、0になったらゲームオーバー、というようなことが可能なのです。
変数の名前は半角英数と_
を使用して好きに作っていい事になっています。ただし、大文字小文字は区別されません。
変数に関して、一つだけ注意があります。それは、変数には「数値型」と「文字列型」という二つの種類があるという事です。数値型には数値しか代入できず、文字列型には文字列しか代入できません。どういうことかといいますと、例えば次のようなものはエラーになります。
hp="100"
hp-=10
これは、「"100"という文字から10をひく」という意味不明な文になってエラーになります。また、次のようなものは、エラーにはなりませんがおかしなことになります。
a=10
mes a
a="aの中身は"+a
mes a
これは、前半ではaに数値が代入されて数値型変数になっていますが、後半では新たに文字列が代入されて文字列型変数に作り直されている、という例です。HSPでは「計算結果の型は一番左の型に合わせられる」と決まっているので、このような事が発生します。「a」と「"aの中身は"+a」が等しい、というのは何となく変な感じがしますが、プログラムの上では=は代入を表す記号なので、「"aの中身は"+a」を「a」に代入する、という事になります。
普通は数値は数値、文字列は文字列で意識しているので間違う事はあまりないのですが、このように数値型変数が文字列型変数に、文字列型変数が数値型変数になってしまうことがあり、そうするとたまにエラーが発生するので注意してください。
時計のソースコードに戻ってみましょう。変数の知識を使って先ほどの重要部分を見てみると、例えばhor=gettime(4)
は、horという変数を用意して、そこにgettime(4)
を代入する、という事です。なんじゃこりゃ。これは、結論から言うとその時の時刻の何時の部分が数値でhorに代入されます。
このgettigmeというのは、実は「関数」というものになっています。関数は、変数と命令の中間のような存在です。自由に作ったり代入したりはできませんが、コンピュータの情報など何らかのデータが入っているもの、でみなすことも出来るのです。
(普通の高級言語では、関数と命令はあまり区別されないのですが、HSPの場合は区別しています。もちろん、数学でいう「関数」とは意味が全く異なります。)
関数には命令と同じように引数があり、コンピュータに対して指示が出されます。例えばgettime(4)
の場合は、「今の時刻の時の部分を教えてねー」なんて感じです。すると、コンピュータは当然自分の内部の時計を見に行って、その時の部分を確認します。
すると、プログラムに対してコンピュータはその結果を値で返します。例えばこの場合は時刻の時の部分です。この返す値を「戻り値」と言います。その時刻が21時だったら、hor=gettime(4)
がhor=21
となるわけです。
又は、好きに中身を変えることはできないが、引数に対応する意味のある値が入っている変数、と考えてもいいでしょう。gettimeの場合は、gettime(4)が「時刻の時の数値」という具合です。
さて、時計のソースに戻りましょう。
;★時刻の取得
hor=gettime(4)
min=gettime(5)
sec=gettime(6)
結局のところ、この部分はコンピュータの時刻を聞いてきて、ひたすら変数に代入しているだけだったという事です。つまり、もし23時56分32秒だった場合は、こう書いてあるのと同値になります。
hor=23
min=56
sec=32
変数にはこのように、コンピュータ(本当はOS)から聞いてきた情報を受け取ったりする役目もあります。
ところで、最後の行を見てみましょう。
;表示
mes " "+hor+":"+min+":"+sec
文字列と数値が足されています。これは妙です。文字と数を足すなんて普通に考えたら不可能です。しかし、実際には何の問題もなく動いています。
これは単純に、文字列の足し算は「文字列の連結」と考えれば問題ありません。まず、HSPには「計算結果が一番左の型に合わせられる」という決まりがあるので、horは一番左の空白文字列に合わせて文字列に変換されます(12時ならhorの中身は12という数値ですが、変換されて"12"という文字列になります)。そして、文字列同士の足し算はただの連結なので、文字列同士がくっついたものになります。
さて、これで一応現在時間が表示されました。しかし、もちろんデジタル「時計」なのですから、時刻が変わって行ってくれないと意味がありません。次は、刻々と時を刻むようにして行こうと思います。
正直、ここまで出てきた命令をいきなりパラメータも含めて完全に暗記するのはめんどくさいです。そんなことしてたらプログラミングが辛くなってしまいます。よく使う命令などは、使っていく中で自然と覚えられるので、あまり気にしなくても大丈夫です。
とはいっても、「あの命令って何て名前だっけ?」とか「fontのパラメータってどうだっけ?」なんて状態ではプログラミングが進みません。こういう時は、HSPのヘルプとHSPアシスタントを活用しましょう。
ヘルプは、スクリプトエディタ上でキーボードのF1を押すか、メニューの[ヘルプ]-[HSPキーワード検索]から起動できます。日本語で検索できる上、サンプルスクリプトや添付されたドキュメントまで検索対象になっているので、使用例などの詳細な情報が入手できます。また、スクリプト上でF1を押すと、その部分の単語を自動で検索してくれるので、例えば忘れた命令の部分でF1を押せば、その命令を確認することが出来ます。
HSPアシスタントは、スクリプトエディタのメニューの[ツール]-[HSPアシスタントの起動]で起動できます。こちらはサンプルスクリプトの実行のほか、「EZInput」という機能があります。これを使うと、パラメータや命令など全く暗記しなくても問題なくプログラミングが進められます。
このあたりの詳しい事も、HSPのマニュアルに詳しく載っているので(プログラミングマニュアル・基本仕様ガイド)、そちらを読まれることをお勧めいたします。