「えぐぜりにゃ~」ソース解説4

投稿者: | 2012年5月22日

最後に「敵の生成ロジック」を見ていきます(※バージョンは「exelinya_0214.zip」です)

geneenemy

敵の生成はgeneenemyですね。(1128~1182行目)

まあ、そんなに長くないです。(最新バージョンでは、生成ロジックが強化されているようですが)

敵の生成を構成する要素としては、

  • 生成条件
  • 開始座標
  • 移動量

という3つの要素があります。これらの要素を意識すると理解が早いと思います。

ザコ(なす・たこ焼き)

では、まず、ザコ敵である「なす・たこ焼き」です。ザコ敵であるからには、ゲームバランス上、「生成されやすい」とするのが素直なゲームデザインです。

 

それが、1135行目の

play_timer  20 == 0 & enemy_count < 2

という条件式です。

「enemy_count」というのは、画面内の敵の数です。つまり、画面内に敵がいない場合、サクサク生成されるようになっています。

次に「開始座標」と「移動量」です。(1137~1143行目)

	rr = double(rnd(64)) / 32.0 * MATH_PI
	vx = 6.0 * sin(rr)
	vy = 6.0 * cos(rr)
	xxx = 320.0
	yyy = 240.0
	xxx -= vx * (352.0 / 6.0)
	yyy -= vy * (352.0 / 6.0)

処理の流れとしては、

  1. 「移動量」を決める
  2. 画面の中心から「移動量」を差し引くことで「開始座標」を求める

となっています。

つまり、「移動量」から「開始座標」を逆算する、という面白い手法をとっています。これだと、自然な開始座標が求められていいですね。なるほど。

箱(5箱・X箱)

箱の生成ロジックは、ランダム性が強いものとなっています。(1153~1159行目)

というのも生成の条件式がこうなっているからです。

play_timer  60 == 0 & rnd(8) < 1

12.5%の確率でしか発生しないので、出るときはガンガン出ますが、出ないときは全然出ないです。これは、箱は「特殊アイテム」的な要素が強いためかもしれません。特に超強力なX箱は、「12.5%×20%=2.5%」という低確率です。

このランダム性の強さのため、後半ピンチでギリギリのときにX箱が出ると一発逆転、というように絶妙なギャンブル性が生まれています。

あと、箱は「開始座標」と「移動量」が固定なので、「掴みやすい」というのも特徴です。

ボス

1161~1181行目がボス(牛乳・プリン)です。ボスは生成条件に二重のガードをかけています。

1つ目の条件は、この式です。

	play_timer  (295 - level) == 0

このため、レベルが低いうちは全然出てきません。

もう1つの条件は

	t < (level + 6) / 10

という式です。

「t」は画面内にいるボスの数です。ボスが多く出過ぎないための配慮ですね。

と、ここでの重要なポイントは、「生成に乱数を使っていない」ということです。ボスは、出過ぎたり出なさすぎると、大いにゲームバランスを崩してしまいます。そこで、乱数によるランダム性を排除しているわけです。

「開始座標」と「移動量」については、ザコとほぼ同じロジックなので省略です。

終わりに

個人的に、ゲームプログラム本をよく買って読んだりするのですが、ゲームのバランスや敵の動きなどのアルゴリズムに関する本は、あまりありません。そして、サンプルゲームは、「ゲームを分かってない人」が作った「つまらない」ものがほとんどです。(つまり、面白いゲームを作るための参考にならない)

今回、OMEGAさんのソースを読んだわけですが、それは、ゲームプログラム本よりも何百倍も参考になりました。

ということで、まとめとしては、「面白いゲームを作りたかったら、面白いゲームを作っている人のソースを読め!」ということです。