ゲームオブジェクトを一つの構造体

これは、二つの考えがある
タイトルのように、
1 「 ゲームオブジェクトを一つの構造体 」 として考えるのと
2 「 ゲームオブジェクトを一つ一つの物 」 として考えるもの

おそらく、慣れてない人は、
まとめようとしても、1の方法をとってしまって、途中で死ぬ

そのあとに、テンプレ的な
player構造体 enemy構造体 という考えに行き着くはず

で、そこから
ゲームオブジェクトを一つ一つの物として、 バラバラに動かせる仕組みを、
player構造体 enemy構造体で、それぞれ作るかもしれない


それは、解りやすいとは思う。
けれど
  
一人ゲーム開発において解りやすさなんてどうでも良くて!!
第一に開発速度
第二に再利用性
第二に柔軟性!!

これが重要になってくる

player 構造体だの shotだの、 宣言し、 それぞれの描画、 初期化、

そんなものをやってる暇は、無いんだよ


ほんっとーに、これらは時間がかかる作業  ゼロから何度も何度も作ってきた俺は、それを知っている
だから、ゲームを創る仕組みを知っていてもゲームを創れる人が少ない


どうすればいいか??

構造体を一々分けるのなんてのは丁寧な時間のかかる、可読性に優れた、大勢開発向けの書き方



一人ゲーム開発には、そんなテンプレいらねぇ!!

その気になりゃ、背景オブジェクトも、何もかも、 描画も移動も生成も 一構造体でやらす事も、
今の俺の書き方なら可能だ


つまり、、結局は、 「 絵 」 なんだよ!!!!!!!!



だから・・・2の方法をとる



まず、画像オブジェクトのみの構造体を創る
そしてそれを、
「 ゲームオブジェクトを一つ一つの物 」
として考える
巨大構造体の中で、配列にする
xやyと、同じレベルの配列にする


そして、全てのオブジェクトに、

移動する予定のある全てのオブジェクトに 関数 をもたせる・・・


その関数が playerのものならば、 こうだ

void player(){
→ x++
← x--
}
とかいう、いつもどおりの関数を作る
それを、オブジェクトの生成時に、

Create( type Player ,x100 , y200 , 関数player)

こうやって生成する


変数なんて、いらねーんだよ!!



そうして、その関数ポインタを、


超巨大構造体の描画や、移動の部分で、

登録した関数ポインタを実行する


そうすると、 超巨大構造体の1要素が、
完全に、
たったの一関数によって、自機と化す


2Pでも3Pでも5Pでも、
パッドがあるだけ作れば良い




次、ショットの生成


このさっきの、登録した関数の中で また Create関数を呼ぶ
void player(){

create( shot , x, y, speed, angle ,shot_func);

}

たったこれだけで打てる!!!

そしてshot_func

void shot_func(){
自由自在な動きを記述可能 ホーミングだろうが、 逆ホーミングだろうが 時間停止だろうがなんだって出来る

}

もし、!!! 一定条件によって、 ショットがそのまま敵になったりとか、


type = teki;


たったこれだけの記述なのである
ああ、 移動する為の関数ポインタも変えなくちゃね?
じゃぁ
func = teki_func;

これだ。


たったの2行でプレイヤーショットが敵に寝返ってしまうのですよ!!!!


もしも、 ショット構造体と、 的構造体をわけていたら、、、
まずショット構造体のフラグをさげて、
敵構造体のフラグをあげて、

必用なものだけを代入・・・・ といった、手続きが必要になる。。。



この、超巨大構造体の強さわかった?


まとめて、これを動かす仕組み創るのは、、本当に一筋縄ではいかない、

けれど、一度作ってしまえば、無敵になる


こういう仕組みでシューティングをゲーム作ってる人は少ないのかもしれない




C++では、switchの代わりにfor一個で処理したりする。。。

実はあれと同じなんだよ

あれの超巨大Verなんだよ

結局は、「 もの 」 を一つにまとめる事

それがプログラミングの効率化




次の効率化  NExt効率化

漏れがどうやって、画像オブジェクトの変数の隠蔽したかは、また今度かく