ソフトウェアでデータを扱う場合、大規模な物だと一つのクライアント内ですべてが行われているような物ではないので、データ管理用のサーバとサーバサイドで動いているアプリケーションを起動させているサーバは異なります。この状態は、挙動制御用のプログラムとデータ用のプログラムは分かれているという事になるのですが、実際にデータをソースコードの包含した場合、規模が大きくなると無駄に容量が増大するので問題が出てしまいます。その為、データは外部から読み込むようなスタイルになります。
■ データ
プログラムにおけるデータというのは、関数やサブルーチンやメインルーチン内で仕様する文字列や数値に該当するのですが、状況変化を実装する場合に用意するリテラル(変数の値)がそれに該当します。つまり、代入する値の塊がデータになります。
代入というと【 法則性を等式で示した物 】である【 方程式 】がそれに該当しますが、方程式において数値の指定がある場合、その値を代入して解を導き出しますが、この時の代入する値がデータに該当します。つまり、【 法則性が決まっている場合、その時の状況である数値を代入すると定数の解が返ってくる 】というのが方程式です。プログラミングも基本的に数学によって動いている物ですから、基本的にそうした数学の基礎的な物は条件として存在しています。その為、数列や等式・不等式や命題(論理演算)なども存在します。しかし、この内容は、【 条件判定 】で使用されるものになるのですが、等式については、変数の指定などにおいて使用することになります。
例えば、
【 問1 】
xが10の時、yはいくつになるでしょうか?
y = 10x + 2
というような問題が数学で出てくると思いますが、この場合、
【 xに10を代入する 】
ので
【 10×10+2 】
で答えは102になります。この時に
Y=10*x+2
という処理が存在しており、変数だと、
x = 10
という変数宣言がされているので、その数式を演算すると、先ほどの解と全く同じものが出てくるわけです。
プログラムを組む場合、方程式のような物は数式で実装できますが、前述のように【 方程式とは解が出るものだと-∞~∞までの数列の中の任意の数値が代入できる物 】になっていますから、その条件で考えると、少なくとも解を出す場合には代入された数値が必要となります。
プログラムの場合、数値というのは数式と同様に定数指定で数式の構築ができるので計算機みたいな処理もできますが、変動をさせる場合には、その数値も代入する値の変動させることができたほうがいいので
【 定数指定をしたものを変動可能な項に置き換えて使う 】
ことになります。
つまり、小さなプログラムでも変数という単位で【 データ 】が存在し、【 初期値 】という形で定数の形でそれが指定されています。
■ 外部参照
変数を用意する場合、仮に
X=1
という定数指定を行ったとします。この条件だと、
For a = 1 To 30
X = X + a
EndFor
のような記述をすると、2~31までの数値の推移を実行できますが、この時に、
■ 変数 X (初期値:1)
■ 変数 a (1~30までの推移)
という複数の変数が存在しますされています。 こうした変動を考える場合に変数指定は必要になるのですが、この条件が、
■ 変数a : 等差数列
■ 変数X : 定数
という状態になりますが、これは内部データである必要があります。では、このデータが数の多い物だとどうでしょうか?例えば、
10,30,20,40,55,60,80,48,22...
のような数値であり、それが大量に存在した場合、プログラム内部に包含するメリットがあるだろうか?と考えると、インタプリタ言語を用いる場合だとその利点はありません。また、ソースコードの構成から考えても
【 単体のコードにして仕上げるというお題でも出ていない限り
そう言う構成にする事はない 】
ので、学習段階で一つにまとまっている場合もありますが、外に出して参照したほうが扱いやすい場合が多いです。ただし、学習をする上において、どういうデータでどうやって読み込むのか?を学ぶ上で単一のデータも包含されている場合があったり、データ自体が変数の範囲や配列を用いるとしても小規模な物だと内部に配置して、変数としてリテラル(変数の値)を呼び出して使用するという方法もありますが、データが巨大になるとその選択は存在しません。
そうなると、どういうデータでどう読み込むか?という話になりますが、現在のようにグラフィックを当たり前に誰でも使える時代になるとラスターグラフィックだけでなくベクターグラフィックのような座標の塊も使うことになりますから、結構なデータになります。こうしたものをブラウザで表示する場合だと、Three.JSを用いることになりますが、この時に任意の形式を用います。当然、ゲームエンジなどで使用するCollada形式やFBX形式なども使用できますが、JSONファイルも用いることが可能なので、実際に、こうしたデータは外部ファイル参照になります。データについては、変数参照を行う上のリテラルとして利用するものもありますから、当然、文字列や数値も存在する訳ですが、この場合のデータに関しても、JSONやSQLやCVSなど様々な物が存在します。
そうした物を用いてデータ参照をする場合に、データが巨大になる場合、処理を行うコードとそのデータが一体化していると不都合があるのでデータは外部読み込みになります。外部読み込みの利点と言うのは、JavaScriptとCSSを外部に配置すると別のHTMLファイルで参照できるので、単体のファイルの記述を短くできる利点があります。これと同様に、参照するデータを外部に用意しておくと、異なるプログラムで同一のデータを参照する場合にはデータを外部に配置したほうがコードの肥大化を抑制できます。
また、参照データの数が多く、種類も複数ある場合には個別のファイルにしたほうがいいので必然的にデータファイルは外部に配置することになります。
■ パターンと表示
データを用いる場合、座標データのような変数だけではなく、パターン解析などでも利用できますが、パターンを読み込んでそれを使用する方法もあります。例えば、
1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 1
のようなデータがあったとします。この場合、
〇 0の場合 : ”□”を適応
〇 1の場合 : ”■”を適応
とすると
■ ■ ■ ■
■ □ □ ■
■ □ □ ■
■ ■ ■ ■
のようなパターンを作ることができます。つまり、オブジェクトパターンが二種類だとこの設定で可能になります。では、
1 1 1 1
1 2 0 1
1 0 2 1
1 1 1 1
のようなデータにして、
〇 0の場合 : ”□”を適応
〇 1の場合 : ”■”を適応
〇 1の場合 : ”△”を適応
とすると
■ ■ ■ ■
■ △ □ ■
■ □ △ ■
■ ■ ■ ■
のようなパターンを作ることができます。つまり、この時の数値に対応した表示対象を変数化して異なるものに差し替えることが可能にしておけば、表示できるので、
表示キャラ
CH0 = "□"
CH1 = "■"
CH2 = "△"
のように宣言をしておけば、変数の値を変更するだけで異なるパターンの生成ができます。つまり、【 表示対象を数値以外に出来る 】わけです。
そう考えると、
■ キャラクターの指定用の変数
■ 配置を行うパターン用の変数
によって表示をコントロールできます。
この内容ですが、ゲーム制作時のタイルサイズを決めておいてその範囲で画像を配置することもできます。
また、同じサイズに指定しておくと、読み込みデータを配列から読み込んでいデータを切り替えることもできますから、この辺りもデータの山がプログラム内部にあるよりも制御しやすくなります。
また、数値の参照は前述のようにパターンを変数制御で指定できるので、ステージ数と読み込んだ外部データにおいて特定の場所だけパターンを差し替えることも可能です。
■ データの比較
プログラムにおいて条件式を用いる場合、等式と不等式で比較をして判定をすることができるので、数値の対比が可能です。これは数値に違いだと算数で習う等式不等式の話になりますが、先ほどのパターンで考える場合も同様です。
通常の等式不等式というのは単一条件の比較というIFによる判定になるので
A = B
A > B
A < B
A >= B
A <= B
A <> B
のような物になりますが、この条件判定ですが、二つの物を比較する場合、こうした変数も比較ができます。
a="00001"
b="10001"
のような物があった場合、全体的な違いだと条件判定で出来ますが、これが
□□□□■
■□□□■
でa<>bの条件だけを抽出するとなると、前者だとデータが少ないので問題がないかもしれませんが、これがピクセルで1920列で1080行のデータの塊だとすると結構大変です。つまり、それを先ほどの数値の山で生成するととんでもないデータの書き換え作業が発生しますが、違う部分が少ない場合だと、データを解析してその違う部分だけを処理したほうが処理自体は軽くなります。この場合、
【 文字列の何番目の物を取得する 】
という処理になるのですが、こうした事はどの言語でも可能になっていますが、そこで数値を取得して条件判定をすれば書き換える場合の処理も少なくなります。この条件だと
■ データの文字列からの変数の取得
(元データ&更新データ)
■ 変数の比較
■ 異なる部分のみ変数の書き換え(後者にする)
という処理になります。その為、
□□□□□
□□□□□
□□□□□
□□□□□
□□□□□
を
□□□□■
□□□□□
□□□□□
□□□□□
□□□□□
にする場合、条件分岐が発生するのは、最初の行の一番端の実ですから、書き換え処理は一度のみで済みます。しかし、
□□□□□
□□□□□
□□□□□
□□□□□
□□□□□
を
□□□□■
□□□■■
□□■■■
□■■■■
■■■■■
にする場合、条件判定の数が前者よりも増えますから書き換えを行う場合には処理が増えます。
この場合、0と1の条件ですから、二値のシルエットのピクセルと同じですが、これにRGBのピクセルのカラーをそれぞれの色に256階調のデータを追加すると、それぞれの判定に256の差が発生するので、このデータの判定よりもより多くの条件判定が必要になります。その為、2値のピクセルの判定よりも8bitの情報を各色で持つピクセルのデータのほうが比較と書き換えの処理を想定すると処理の工程が増えるので重くなります。当然、このデータの差は前述のように
■ シルエット
■ 色彩情報
でも変化しますが、ピクセルの行単位で解析をして比較を行う場合、解像度が高いほど処理が増えますから、解像度の差異による解析及び書き換え時間の差も発生します。
デジタルのラスターグラフィックのデータでは、RGBではなくRGBAのアルファーチャンネルを持った透過の仕様も選択が可能です。これも8bitの256階調で指定できるので【 RGB8888 】の場合だとさらにそのチャンネルの情報も入ってきますから透過素材を用いる場合の処理とその情報を考慮しない処理では処理そのものが異なるわけです。
とりあえず、書き換えの場合だと、A<>Bでいいのですが、
221122
211222
112222
211222
221122
のようなデータがあって、
221122
211222
112202
211222
221122
のように明らかに違う物が混ざっていたとします。その場合
■ ディテールがそうなっている条件
■ ノイズの類
の二通りが考えられます。では、これを仮にノイズと仮定した場合、解析をした場合に
【3】【4】=2
【3】【5】=0
【3】【6】=2
という条件が存在しますが、これと同様に
【3】【4】=2
【3】【5】=0
【3】【6】=2
のような周辺の状況の差異を確認できます。では、ディテールとしてドットのデータをもう少し広げてこの周辺解析の状態を
【3】【4】=2
【3】【6】=2
【3】【4】=2
【3】【6】=2
の四つの項目に対して行った場合、さらに周辺の情報が得られますが、その条件で周囲が2だと仮定委した場合にそれがノイズという条件を前提とした判定だとすれば、
【3】【5】=0 → 【3】【5】=2
とすれば、その場所のディテール外のイレギュラーなパターンを除去できます。
画像を基準で考えると、ピクセルの配列になりますが、座標というのは、二次元配列ですから、これについてはArrayを組んで配列をループして検索することが可能になります。この条件で考えると、その解析対象のデータというのはコードに包含する必要はないので、データというのは外部に存在することになります。
■ とりあえず。。。
通常の言語だと配列を用いると
【 配列の何番目のリテラル(値) 】
という形で文字数に関係なく呼び出せるのでCVSだと” ”の部分を読み込み後に除去する必要がありますが、数値を一旦読み込んでアレイに配置して使うという方法もあります。こうした場合、コード内に配列として初期配置をするよりもコードを短くできるのと、そのデータをほかのプログラムでも使えるので、処理を行うコードとデータは別の場所に置くことになります。また、画像呼び出しをするとしても、変数管理が可能なので、画像ファイルの名前+インデックスのような保存をしておくと、管理がしやすくなりますが、
■ マップデータ : 配列
■ 配列のデータ : タイルの番号
■ イメージデータの名前 : インデックスがタイルの番号
とすると、配列の読み込み維持にマップの構成データが読み込まれ、その数値を参照してタイルの選択ができるようになります。