シューティングにおける敵の動きについての雑談

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

シューティングにおける敵の動きについての雑談

#1

投稿記事 by dic » 16年前

また、失礼します
今回は雑談なのですが
一通り動くだけのシューティングゲームはできたのですが、
敵の動きがぎこちなくて
市販されているような、プレイヤーめがけて動いて、微妙に複雑な動きをして
上に帰るような、複雑な動きの実装方法について雑談したく思いました。

現在私の動く元となるエンジンの変数は速度v、角度angle、加速度a、時間t、で
構成されていますが、直線、円を描くぐらいしか動きがあまり実装できません、

昔から探しているのですが、ニューラルネットワークで組めば簡単と言われたのですが
ニューラルネットワークは私には難しすぎで
これに似た動きを実現する方法などないでしょうか?

私が考えているものは指定された位置に指定した数で移動する
自動制御システムですが、ちょっと数学の方がおいつかず
どのようにして、おもしろい、もしくはリアルな動きを実現するのでしょうか?

array

Re:雑談

#2

投稿記事 by array » 16年前

> 現在私の動く元となるエンジンの変数は速度v、角度angle、加速度a、時間t、で
> 構成されていますが、直線、円を描くぐらいしか動きがあまり実装できません、

これだけの変数があれば、大抵の動きは実現できると思うのですが、あまりにも複雑だと無理なんですかね^^;

私には市販されてるような、プレイヤーめがけて動いてってのが想像できないのですが
複雑な動きをして、上に帰るような・・・
だったら龍神録の館でも、ウロチョロして上に帰るサンプルがあったと思いますよ~

ニューラルネットワークと聞くと私にも難しすぎて一歩引いてしまいますが、プレーヤーの位置に柔軟に
対応して、敵も(考えてる様に)動くイメージなんですかねw

まぁしかし、dicさんが敵の動きのどんな部分にぎこちなさを感じてるのか知りたいです。

Dixq (管理人)

Re:雑談

#3

投稿記事 by Dixq (管理人) » 16年前

私はニューラルネットワークと聞くと人工知能の分野で問題に対する最適解を導き出すようなイメージしか沸きません・・。
敵の軌道にも使えるんですかね?

--

私もそれだけ変数があれば大抵の動きは出きると思いますよ。
館のコードでよければ「こんな動き」と詳しく教えてもらったらサンプル作ってみます。
その敵の動きが見れるプレイ動画とかありませんかね?
なければペイントとかで書いてもらってもいいですけど。
よほど難解な動きじゃなかったら簡単な計算式の組み合わせで実現出来ると思います。

Justy

Re:雑談

#4

投稿記事 by Justy » 16年前


>プレイヤーめがけて動いて、微妙に複雑な動きをして
>上に帰るような、複雑な動きの実装方法

 「微妙に複雑な動き」というのがよくわかりませんが、
これくらいなら出現時にその時点でのプレイヤーの位置を元に、
移動パスを設定してあげれば、さっくりと出来そうです。

 通過させたい座標を決めて、あとは線形補完するなりスプライン補完するなりする、と。


 或いは、ホーミングアルゴリズムを流用した、仮想ターゲット方式でもいいですね。
 仮想ターゲットとは表示はされない、プログラム内部だけの目標オブジェクトで、
敵はその仮想ターゲットをただひたすら追いかけるように動かします。

 で、仮想ターゲットは最初プレイヤーの付近に配置しておいて、敵が近づいたら
上の方に逃げていくように設定すれば、敵はそれを追っていくので概ね望み通りの
動きになります。

 その際、ホーミングするからといって常にプレイヤーの方を向き進むのではなく、
1回あたりの回転量をある程度制限して、緩やかに追従をさせると良い感じになるかと。

 その制限の度合いと仮想ターゲットの動き次第で、面白い動きをさせることが
できるはずです。



>私が考えているものは指定された位置に指定した数で移動する
>自動制御システムですがちょっと数学の方がおいつかず

 単純に横に並べて移動するだけなら簡単そうですが、
数学的に問題があるというとどういう状況なのでしょうか?

 集団制御的なものでしょうか?
 編隊にリーダがいて、そのリーダの飛行ルートをなぞるように
且つ各々がぶつからないようにフロッキングしながら飛ぶ、みたいな。




余談
>ニューラルネットワーク

 私も詳しくはないのですが、シューティングゲーム等の AIとして
ニューラルネットワークを使うというのは最近ちらほら聞きますね。
 といっても実験段階のものがほとんどですが。

 ニューラルネットワークは何でも勝手に学習してくれる夢の技術ではないですし、
デバッグもし辛くある意味運も必要で、ゲームとして調整して形にするまでに結構な時間が
かかるので、誰もが簡単に使えるほど実用段階にはなっていないようです。

dic

Re:雑談

#5

投稿記事 by dic » 16年前

そうですねぇ
やはりみなさん良い学校を出られてるんですね
私は専門ですが、金払えば誰でも入れる学校だったんで
しかもろくに勉強もしてこなかったので
今、しっぺ返しをくらってますよ

複雑な動きというのが伝わらないのでYouTubeに上げました
http://jp.youtube.com/watch?v=UiTepP87hk4

ニコニコが推薦のようですが、なぜか私ははじかれるので・・・(謎

たしかに速度、角度、加速度、時間だけでもちょっとした動きはできるのですが
ソースコードの量は半端なく増えるのでどうしたものかと
考えているところです

array

Re:雑談

#6

投稿記事 by array » 16年前

確かに敵の出現数を多くすると、複雑になり、イメージ通り動きを管理するのも面倒になってきますね~

動画を見た感じ、敵の動きはそんなに複雑ではないんじゃないでしょうか
もしかしたら、艦隊(?)としてグループごとに制御してるのかもしれませんが
個人的には、面倒だと思うので出現位置をずらしてるだけに見えます。

あとは、動きですが、動きなんかも管理人さんが解説して下さってる、シューティングの館の敵の動きを
組み合わせるだけでも、大丈夫そうです。
http://dixq.net/s/

dic

Re:雑談

#7

投稿記事 by dic » 16年前

なるほど、リンク先参考になりました
一応補足ですが艦隊としては管理してません
常に一匹一匹で管理してます
ただ単に出現する数を8体で数フレームずつずらして出現させているだけで
そのように映ったのかもしれません

しかし、case文に100間隔で管理されているところを見ると
N88-BASICを思い出させます

敵の動きにこるよりも
敵の弾のだし方にこった方がいいかもしれませんね

Dixq (管理人)

Re:雑談

#8

投稿記事 by Dixq (管理人) » 16年前

全く難しくないと思いますよ。
右に進むだけの奴は、

.角度 = 0;
.速さ = 1;

とやれば速さ1で右に進みますし、
200カウントで回転する動きは

.角度 = 円周率*2 / 200 * カウンタ;

でokです。
youtubeの動画を見ながら動きを再現してみました。

http://dixq.net/zip/bbs/project_dic.zip

龍神録プログラミングの館のコードで作りました。「dic章」にある、プロジェクトを開き、実行してみて下さい。
内容は50章のプログラムです。変更した箇所には全て「dicさん用変更箇所」のように書いておきましたので、
Ctrl + Fで対象を「現在のプロジェクト」にし、検索ワード「dicさん」で検索していけば、どこを変えたかわかります。

敵の動きは
enemy_act_pattern.cpp

にある関数を追加していくだけです。
敵に行動させたい行動パターンはエクセルで指定します。
dat\csv\dic\にあるエクセルファイルも確認しておいて下さい。ここに書かれたとおりに敵が出現します。

館の基本的なコードについての説明はここでは割合します。
何かわからないことがあれば聞いて下さい

Dixq (管理人)

Re:雑談

#9

投稿記事 by Dixq (管理人) » 16年前

今見てみたら

.spd = 2 //スピードは1

みたいに注釈がいくつか間違ってますが、気にしないで下さい^^;

dic

Re:雑談

#10

投稿記事 by dic » 16年前

おお、なんとシンプルな!
管理人さんサンプルありがとうございます
キリがないんで解決押しときます

閉鎖

“C言語何でも質問掲示板” へ戻る