GMS で使えるアクセサリ=「データ構造」とは?
データを保持する形式や仕様をデータ構造と呼びます。
Data Structures
= データ構造
です。
GMS ではデータ構造にまつわる関数群を「アクセサリ」と呼んでいて、GMS/GML では関数名のプレフィックス (prefix=接頭辞) に DS と付いていたら DataStructures の略。
参考(YoYoGames):Accessors 参考(YoYoGames):Data Structures 参考(YoYoGames):yoyogames.com_accessors-for-data-structures-and-arrays 参考(YoYoGames):Data Types
データ構造を扱う前に GMS/GML におけるデータ型についておさらいしておきます。
GMS/GML のデータ型について
スクリプト言語である GML には変数のデータ型として「文字列型」と「数値型(実数型)」と「ブーリアン型(厳密には型として存在していない)」「Undefined(Void型)」「ポインタ(ただし特殊仕様)」があり、データ構造型として「配列型 (Arrays)」「Enums (enumerator/これも型としては存在しない)」が扱えます。
配列型は大量のデータを効率的に扱うため利用される「型」であり、データ構造とは、配列の諸機能をどのように利用するかを定めた「仕様/まとめ」のことです。基本型とその処理・手続きを結び付けた抽象的な型として、データ構造は「抽象データ型」あるいは「クラス」とも呼ばれます。
ここちょっとややこしいかもしれないけれど、GML におけるアクセサリは配列を利用しているけれど「データ型」として調べる手段は用意されておらず、is_array 関数ではアクセサリかどうかを判定できません(アクセサリは GMS 内部で ID 管理されるから、型として調べると実数型になってしまう)。※
※ アクセサリ用の関数である ds_exists を利用してデータ構造のタイプは判定します
GMS における六つの「アクセサリ」
汎用的な開発言語で扱う伝統的な各「データ構造」を GMS/GML から簡単に扱えるようにした機能や関数群のことを「アクセサリ」と呼称しています。
データ構造は原理として「配列」の諸機能を利用しています。GMS/GML のアクセサリを利用しなくとも、自力でアクセサリと同等機能を実装することも可能ですし、アクセサリとして実装された機能以外の機能が欲しい場合は自分で機能を追加することもあるでしょう。
配列で扱う大量のデータを「目的に応じてどのように処理するか」、その仕様を定めたものが各データ構造であり、データ構造はアルゴリズム(問題とその解決のための手順・算法のこと)との関係が深いものでもあります。
GMS/GML が提供するデータ構造の一覧は以下6つ。
DS Lists、DS Maps、DS Grids、DS Stacks、DS Queues、DS Priority Queues。
DS Lists/リスト(配列と似てるが要素数が予め決まって無い、挿入と削除が容易な一次元配列)
- An ordered list of values, called a
ds_list
in GameMaker: Studio but this can also be called an "array" or "sequence".
シャッフルやソートなど便利関数も内蔵。DS Maps/マップ(連想配列、ハッシュテーブル、辞書、言語によって呼び方が違う)
-
A collection of name/value pairs, called a
ds_map
in GameMaker: Studio but also known as a "dictionary" or "object".
ソートはできないけど探索は可能、簡易データベースとして利用できます。セーブ/ロード用にデータの暗号・復号化もサポート。
ds_map_secure_save
ds_map_secure_load
JSON (JavaScript Object Notation) と組み合わせた利用も可能。
json_encode
json_decode
DS Grids/グリッド(表・二次元配列) シャッフルとソート、範囲内の最大/最小値抽出、値の計算など便利な関数込みの機能。パズルゲームやグリッド移動などゲームで利用できる用途は多い。グリッドに二次元配列として格納された値は ini を経由することで保存と読み込みが可能。ただし保存は独自形式なので、ini に保存されたグリッドのデータは人間には意味が読み取れないような難読化が施されている。標準で JSON や CSV 形式の入出力が利用できない。
DS Stacks/スタック(LIFO
( Last In, First Out ) データ構造:一次元配列)
挿入と削除が容易という点では「リスト」と似ているが、スタックの特徴として以下
- 常にデータ列の端っこ(最後尾)だけを扱う
- 列の中途にデータを割り込ませない
- データの追加は列の最後尾へ
- データの削除は列の最後尾から
DS Queues/キュー(FIFO
(First In, First Out)=ところてん式データ構造:一次元配列)
常にデータの端っこを扱うという点でスタックと似ているが、スタックは Last In, Fast Out、つまりスタックで扱う端っことは常に列の最後尾。
キューは First In, First Out、追加されるデータは常に列の最後尾、削除されるデータは常に列の最前列。そして列の中途にデータを挿入することができない仕様となっている。この仕様のため「待ち行列」とも呼ばれる。
DS Priority Queues/優先順位付きキュー/キューのバリエーションであり、データの挿入された順番に関係なく、優先順位によってソートが実行される。 優先度を決定して選別を行う処理が組み込まれているため、データを挿入した順番は無視される仕様。