東方弾幕風(旧版)について今更かって言いたくなる質問です。
弾幕作り始めてまだ4ヶ月になりますが、実はまだ触っていない関数がありまして、この「SetCommonData」とか言う関数…
多分異なるスクリプトで同じ変数?が使えるのだと思うんですが…
もしよければ代表的な使い方を教えてくれませんか…?
東方弾幕風(旧版)について今更かって言いたくなる質問です。
弾幕作り始めてまだ4ヶ月になりますが、実はまだ触っていない関数がありまして、この「SetCommonData」とか言う関数…
多分異なるスクリプトで同じ変数?が使えるのだと思うんですが…
もしよければ代表的な使い方を教えてくれませんか…?
①SetCommonData系統について
SetCommonData関数を使うと、コモンデータに値をセットできます。
コモンデータとはグローバル変数(同スクリプトのどこからでも参照できる)の更に上位互換版で、仰るとおり全てのスクリプトから参照ができる変数のようなものと捉えて頂ければ大丈夫です。
例えば、SetCommonData(“test”, 2);と記述すると「test」という名前のコモンデータに2が保存されます(このときtestを””で囲む必要があります)。これは変数にtest = 2;と代入するのとよく似ていますが、コモンデータに宣言は必要ありません。ですから、testがまだ無ければ新たに自動で作成されます。
同じくGetCommonData関数を使うとコモンデータを参照できます。上記のSetCommonData(“test”, 2);の後にGetCommonData(“test”, 0);と記述すると2が返ってきます。ここで、「0」という数字が気になるかもしれませんが、これは『まだコモンデータtestが存在しない場合に返す保険』となっています。Setの場合は前述の通り例えtestが見当たらなくても新規で作成されるので問題はないですが、Getの場合だとそうはいきません。ですのでまだtestが存在しないのにGetを書いた場合、第2引数に0と書いていれば0が返ってきます。
②SetCommonDataEx系統について
こちらは先程のコモンデータの更に上位互換版で、最新版ではエリアコモンデータと呼ばれているものです。これは変数のように値を保持するものの中で唯一「保存が可能」なデータとなっています。ですから、ゲーム終了後にも値がそのまま残ります。
関数にはもう1つ引数が増えます。SetCommonDataEx(“Data1”, “test”, 2);と記述すると「『Data1』というエリアにある『test』というエリアコモンデータに値を保存する」という意味を持ちます。この関数でセットしたデータは最後にSaveCommonDataExという関数でセーブできるのですが、その時エリア名.datというファイルで保存されます。このエリアコモンデータはコモンデータと違いロードしたり、未作成の場合は関数で作成したりという違いがありますが、詳しくはリファレンスをご覧ください。
③使い方
前置きが大変長くなりました、使い方を紹介します。
まず、コモンデータはゲームの特殊ギミックに使うと効果的です。例えば、敵が出す霧に触れたら自機の速度を落とす…といったことなどに使えます。
弾幕側でSetCommonData(“IsMist”, true);と記述し、自機側でif(GetCommonData(“IsMist”, false) == true){速度を減らす;}と記述すれば良いでしょう。このとき、Getの第ニ引数はなるべく安全なものにすることが好ましいです(もしSetがされていない時にGetの第ニ引数がtrueになっていたら常に自機の速度が落ちてしまいます)。
エリアコモンデータはスペカのヒストリーやハイスコアの保存に使うと効果的です。上手く使いこなすことができれば原作のようなシステムを作ることができるでしょう。
長文失礼しました。
【追記】私は最新版しか扱っていないためリファレンスを片手に旧版の説明をしたのですが、後でよく見てみるとどうやら旧版ではコモンデータも保存できるようです…(エリア名””(無し)のエリアコモンデータとして)。適宜読み替えて頂けるとありがたいです。
とても分かりやすい回答ありがとうございます!
やっと旧版がまとも使えるようになったのでトランス(ボムではなくスキップキーで)や霧の再現をゆっくりやってみます!
EnemyDamageSoundやCreateEffectObject関数って全部galaxyさんが作っていたのですね!
丁寧で初心者の私にも分かりやすい回答ありがとうございました!