p2k8 blog mini

イラストを中心にその他色々紹介**天体写真はこちらに移転しました→https://p2k8-net.fc2.net/

【AS】RPGエンカウント率の算出if文

【AS】RPGエンカウント率の算出if文

敵遭遇カウントダウン方式

今日の話題はFLASH作る人にしか判らないかもしれませんが、RPGフラッシュのActionScriptです。これまではずっと戦闘シーンのプログラミングをしていましたが、本日新たにフィールドシーンを歩いていてランダムでモンスター出現、というエンカウントの流れを自分の腕で組み込むことに成功! パブリッシュしてうまくいった時の達成感は大きかったです。

ゲーム全体のAction Scriptの仕組みを全て解説するとなるととても複雑になるので、ここではエンカウントまでの残り歩数の変数を算出するif文だけ載せておきます。

まず、グローバル変数として1~99までのランダム値を代入する「mainransu」を1ターンの始まりに算出して、ターン毎に変わるように仕組んでおきます。これは、攻撃や防御の数値のターンごとの揺らぎとしても使っています。

さらに戦闘終了時に読み込むフレームにて、以下のようなif文によるエンカウント率の計算を行います。変数「encmode」はエンカウントまでの残り歩数量のパターン、つまり出現頻度グループ分けです(1~6)。7割が下限値20、上限値44のエンカウントの歩数になりますが、7%の確率で起こる「超長」ですと下限値105歩、上限値120歩とかなりの範囲を歩けます。最初から3~120の間でランダムを取ると、均一に散らばって面白みがありません。歩数のランダム範囲にバラつきを発生させるために「6つのグループ」と「グループの範囲内での乱数」という二重構造にしているのです。


if (_global.mainransu<=70) {
encmode = 3;
//【確率70%】 出現頻度3/5(普通)。
encmas = Math.floor((Math.random()*10)*2.2)+20;
//【範囲20~44】 *2.2は、1~10 の乱数を 2~22 の間に変換するため。末尾の+20は計算結果が下限22、上限42になるように。
} else if (_global.mainransu<=80) {
encmode = 4;
//【確率10%】 出現頻度4/5(長い)。
encmas = Math.floor((Math.random()*10)*2)+60;
//【範囲60~80】 *2は 2-20 の間に変換するため。+60は 60-80 の間にするため。
} else if (_global.mainransu<=81) {
encmode = 6;
//【確率1%】 出現頻度「スペシャルランダム」(1~271。適用範囲広い)。
encmas = Math.floor((Math.random()*10)*30)-29;
//【範囲1~271(30増分)】 *30は 30-300 の間に変換するため。-29は ランダムで0.1出た場合に30となり、これを1にしたいから(1マス出現。最終的に1/1000の確率)。
} else if (_global.mainransu<=83) {
encmode = 1;
//【確率2%】 出現頻度1/5(超短)。
encmas = Math.floor((Math.random()*10)*0.5)+3;
//【範囲3~8】
} else if (_global.mainransu<=93) {
encmode = 2;
//【確率10%】 出現頻度2/5(短い)。
encmas = Math.floor((Math.random()*10)*0.9)+10;
//【範囲10~19】
} else {
encmode = 5;
//【確率7%】 出現頻度5/5(超長)。
encmas = Math.floor((Math.random()*10)*1.5)+105;
//【範囲105~120】
}

戦闘終了から次のエンカウントまでの残り歩数

上のif文を流すと、encmode(頻度グループ)が1~6、encmas(実歩数)が3~120の範囲で算出されます。

1:「超短」: 2% 3~8 歩
2:「短い」:10% 10~19 歩
3:「普通」:70% 20~42 歩
4:「長い」:10% 60~80 歩
5:「超長」:7% 105~120 歩
6:「スペシャル」: 1% 1~271

encmodeが6になる「スペシャル」は確率が1%ですが、もっと確率を上げても面白そうです。ちなみに1歩だけでエンカウントする確率は1/100×1/10で1/1000となります。

変数「encmas」はエンカウントまでの残り歩数になります。キャラが1歩歩くアクションはモーショントゥイーンではなくAS制御(if文によるループ処理)で行っています。条件を満たしてif文を脱出する際に一歩進むのも完了するので、そのタイミングでエンカウントまでの残り歩数(encmas)を減算 (encmas--;) します。さらに一歩歩くアクションの一番最初に読み込むフレームでencmasが0になったかをif文でで検査して、trueであればgotoAndPlay(~)で戦闘インスタンスをスタートさせます。これでランダムなエンカウントまでの歩数を経て、戦闘スタートとなります。


------
p2k6◇MX2004

開始日: 2005/2/9(水)