[前へ] [目次へ] [次へ]

基本的なデータオブジェクトを使ってみる

今回からはFGSに搭載されたゲーム開発用スクリプト言語FGESを使ってプログラミングの入門編です。


●最も基本的なデータオブジェクト
   どんな種類のプログラムを作る場合でも、
   必ず必要になってくる種類のオブジェクトが3種類あります。
種類FGESでの型名概要
整数Integer一つの整数(小数は使えない)
文字列String一つの文字列
真偽値Bool真または偽
   「整数」とは1や10や-10など、小数ではない数値です。
   ゲームで言えばHPやMPといったパラメータは全て整数で管理するのが普通です。
   
   なお、小数は小数で別の型を使用します。
   何故そうなっているかというと、CPUは基本的に整数を扱う方が得意にできており、
   小数の取り扱いはいろいろと厄介なルールがあります。
   また、プログラムで扱う値のほとんどは整数だけで事足ります。
   どうしても小数が必要というのでなければ、整数で扱うことを前提に考えましょう。
   
   「文字列」とはつまり、文字の集合です。
   ゲームで言えばキャラクター名などが文字列として管理されます。
   
   「真偽値」とは真(正しい)と偽(違う)の二値だけを扱う型です。
   これは主に条件判定などで使われます。
   ゲームで言えば命中判定やクリティカル判定の結果を真偽値で表現したりします。
   
   
   まずはこのうちの「整数」について扱ってみましょう。


●練習用にイベントを設置する
   スクリプトを書いて実行するために一番簡単な方法として、
   イベントの実行内容として書いてしまう方法があります。
   まずはそのためのイベントを設置しましょう。
   
   「クエストサンプルマップ」の画像の位置にイベントを新規イベントを設置します。
   (イベントの設置方法は 第5回 を参照してください)

   
   イベントの画像には机の画像を指定しておきます。


   以降、スクリプトを記述する時は赤丸の部分に書いていきます。
   スクリプトの記述が終わったら「テストコンパイル」して確認、問題なければ実行という流れです。



●オブジェクトの値を表示する
   プログラムを実行しても、画面に勝手にその結果が表示されたりはしません。
   それだと何が起こっているのかわからないので、まずは値を表示するスクリプトを書いてみます。
   (直接数値などを書いたとしても、FGESではオブジェクトとして扱われます)
<  1>
<  2>
<  3>
<  4>
ECL::WaitLastMessage("整数  :@d
      文字列:@s
      真偽値:@s"
,
      2,
'テスト',true); 
   ↓入力するとこうなります。
   (なお、FGESでは行頭のタブ文字は読み飛ばされる仕様になっていますが、
   上記のスクリプトはWeb表示用にタブ文字をスペースに置換しているので、単にコピペすると二行目以降がずれます)


   この記述は 第5回 でも使ったメッセージ表示のスクリプトですが、
   この記述中に @d や @s を記述すると後にくっつけた値で置換することができます。(詳細は今はおいておきます)
   ここでは 2 と 'テスト' と true を続けたので、順番に置換されて以下のように表示されます。



●計算式を書いて計算させてみる
   プログラムといえば計算させなければ始まりません。
   直接計算式を書いて結果を表示させてみましょう。
<  1>
<  2>
<  3>
<  4>
<  5>
ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      3+4,5-7,3*8,10/3); 
   計算式を直接4つ書いてみました。それぞれ足し算、引き算、掛け算、割り算です。
   これを実行すると以下のように表示されます。
   
式1:7
式2:-2
式3:24
式4:3


   式4の 10/3 の結果が3になっていることに注目です。
   整数の計算では小数を扱わないので、小数点以下の値はなくなってしまいます。
   一見不便に思うかもしれませんが、実はこの特性は上手く使うととても便利です。
   「端数が邪魔だな〜」とか思ったら「割って掛けなおす」みたいな方法があるのです。
   同じ値で割って掛けるのは数学では無意味ですが、
   整数の計算では割った時点で小数部分がなくなるためちゃんと意味を持つのです。
<  1>
<  2>
<  3>
<  4>
<  5>
ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      12345/10*10,12345/100*100,12345/1000*1000,12345%100); 
   
   実行結果:   
式1:12340
式2:12300
式3:12000
式4:45


   式4に指定した 12345%100 は剰余といって、ようは割った時の余りを求める計算です。
   この二つを組み合わせると任意の桁を取り出すといった操作が容易にできるわけです。
   
   
●ローカル変数を使ってみる
   計算式を直接書いて計算させても、これだけではまだ事前に計算しておけばいいだけです。
   計算した値は使いまわしてこそ意味があります。
   
   そこで登場するのが「変数」です。
   FGESの「変数」ではオブジェクトに名前を付けたように扱うことができます。
   (厳密には名前とオブジェクトを関連付けているだけでオブジェクトに名前が付くわけではありません)
   
   「変数」にもいろいろな種類がありますが、最も基本的な「実体型のローカル変数」を使ってみます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
//←を書くと行末まで「コメント」(プログラム上の意味を持たない部分)になります。

Integer n;//ローカル変数として Integer 型のオブジェクト n を作成する

n=55;//nに55を代入(nの値を55にする)

ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      n,n+10,n*10,n/10); 
   
   実行結果:   
式1:55
式2:65
式3:550
式4:5

   3行目のように「型名 名前」の形で記述すると、「ローカル変数の定義」になります。
   これを記述することで n という名前は「 Integer 型のオブジェクト」を示すようになります。
   この「 Integer 型のオブジェクト」は整数を一つ記憶しておくことができます。

   なお、行の最後についている ; は文(プログラムの解釈単位)の区切りです。
   地味ですが忘れるとエラーになるので、ひとかたまりの指示を書いたら最後に付けます。

   続けて5行目で先ほど作成した n が示すオブジェクトに整数55を「代入」します。
   ここでいう代入は数学における代入とは意味が異なることに注意が必要です。
   プログラミングにおいて「代入」と言った場合、「右辺を左辺にコピーする」という意味になります。
   FGESではこの代入はオブジェクトが保持する値の上書きコピーを意味しますが、
   プログラミング言語によっては代入は「変数名とオブジェクトの関連付けの変更」を意味する場合があります。
   この二つは一見似ていますが本質的に全く異なるため、違う言語を扱う時は最初に確認するようにしてください。
   
   さて、 n に55を代入したことにより、 n のオブジェクトは55という値を記憶しました。
   新たに別の値を記憶させない限り、 n は55という値として扱われます。
   表示に使用する計算式ではあたかも n の部分が55と書いてあるように扱われているのはそのためで、
   n に代入する値を変更するとそれに合わせて結果が変化します。

<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
//←を書くと行末まで「コメント」(プログラム上の意味を持たない部分)になります。

Integer n;//ローカル変数として Integer 型のオブジェクト n を作成する

n=30;//←ここしか変えていません

ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      n,n+10,n*10,n/10); 
   
   実行結果:   
式1:30
式2:40
式3:300
式4:3


   プログラムは原則として、上(1行目)から順番に下に向かって実行されていきます。
   実行する順番を変更するような記述もありますが、特に記述がない限りは 上から下へ 実行されます。
   
   なので↓のように順番を逆にすると結果が変わります。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
Integer n;//ローカル変数として Integer 型のオブジェクト n を作成する

ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      n,n+10,n*10,n/10);

n=30;
 
   
   実行結果:   
式1:0
式2:10
式3:0
式4:0


   また、複数回代入した場合は値が上書きされます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
Integer n;//ローカル変数として Integer 型のオブジェクト n を作成する

n=30;
n=60;
//← nに60を再代入

ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      n,n+10,n*10,n/10); 
   
   実行結果:   
式1:60
式2:70
式3:600
式4:6


   代入は式を記憶しているわけではなく、式の計算結果を記憶しています。
   ↓のように、代入後に式に使った変数の値を変更しても影響しません。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
Integer n;//ローカル変数として Integer 型のオブジェクト n を作成する
Integer n2;//ローカル変数として n とは別の Integer 型のオブジェクト n2 を作成する

n2=40;
n=n2*2;
//←この時点で40*2=80が計算されて、nは80になる
n2=0;//←n2を0に変更してもnに影響が及ぶことはない

ECL::WaitLastMessage("式1:@d
      式2:@d
      式3:@d
      式4:@d"
,
      n,n+10,n*10,n/10); 
   
   実行結果:   
式1:80
式2:90
式3:800
式4:8



●ローカルオブジェクトの寿命
   ローカル変数に対応して作成したオブジェクトを「ローカルオブジェクト」と呼びます。
   「ローカルオブジェクト」は作成したローカル変数を作成したブロックの終端で消滅します。
   (ここではイベント実行内容を記述しているコード全体が一つのブロックになります)
   
   消滅したオブジェクトが記憶していた内容は失われます。
   つまり、先ほどのイベントを二回実行しても、
   一回目の n と二回目の n に対応しているオブジェクトは別のもので、
   値が引き継がれているということもありません。
   
   また、定義したローカル変数名は記述したブロックの中だけで有効です。
   他のイベント実行内容など、記述したブロックの外側では使用できません。
   なお、既に定義されているローカル変数名でローカル変数を再定義することはできませんが、
   記述したブロックの外側であれば、名前が混在しないので独立して使用することができます。
   

●ローカル変数の使いどころ
   ローカル変数は「その場だけで必要な値」を扱うのに適しています。
   ローカル変数はプログラムの他の部分に影響を与えないので、
   好きな名前を使うことができ、名前の衝突などをあまり気にしなくて済みます。
   
   実際、プログラムを組む際に「その場だけで必要な値」は非常に多く現れます。
   必然的にローカル変数を使う機会も非常に多くなります。
   



[前へ] [目次へ] [次へ]

最終更新 2017/09/21