後日クラス化について少し考え直すことがあったのですが,頭の中で思い描く理想的なコードを書き起こすまで至らず,
あるのは目の前にある(形だけ)きちんと動いているごちゃごちゃコードだけ。
考えているのが,自機移動を一定フレームだけ動かす時の処理方法です。
とりあえずこのような自機クラスを私は作りました。(関数外にCjiki jiki というグローバルインスタンスを作っています)
class Cjiki{
private:
int x;
int y;
int count;
public:
int get_x() {return x;}
int get_y() {return y;}
void add_x(int val) { x += val;}
void add_y(int val) { y += val;}
void sub_x(int val) { x -= val;}
void sub_y(int val) { y -= val;}
void init() {x = 100; y = 100;}
void add_count() {count ++;}
void reset_count() {count = 0;}
int get_count() {return count;}
};
また,グローバル変数として f.xxxxxというフラグを別の場所にまとめてあります。(struct f { bool xxxxx; } )
★
具体的な話になってしまうのですが,
左キー入力があったとき,初期位置 x = 100 から x = 0 に移動させようと思ったときに,
jiki.sub_x(100) としたら瞬間移動してしまうので,ゆっくり動かすためにjiki.sub_x(10)を10回,1フレーム1回で実行します
左キーが押されたときにフラグ:f.MoveLeft をオンに,jiki_reset_count()実行
(別のところで)f.MoveLeftがオンならばjiki_sub_x(10)とjiki.add_count(),最後 if(count == 10) のときにf.MoveLeftをオフにしています。
他,左キーが押されたときに当たり判定とキー入力を一時的に無効にするフラグも同時にオンにしています(つまり3本オンに)
最近クラス化の概念を改めて見直し,メンバ関数に上記と同じ挙動を実現するvoid move_left()のような関数があるべきだと思いました。
そうすれば左キーが押される⇒jiki.move_left()を実行するだけで10フレームの間動いてくれて,読むほうも分かりやすいかなと。
しかし,10フレームの間動かすということは同じ処理を10回呼び出さないと行けないので,毎フレームのカウンタの取得と移動処理は必須です。
―という自分の考えだとメンバ関数にするメリットがほとんど感じられず,「じゃあ今のままでもいいか…」と悩んでいます。
この場合,どのようにしておくのが良いでしょう? いろいろと技量不足の状態で作ったプログラム全体を書き換えるのは結構辛いのですが,
自動移動処理を行うナイスな方法があれば教えてください。
また,メンバ関数が大きくなってきたときにちょっと気になったのですが,プログラムで使う全てのクラスの宣言は(上コピペコード) class.h
に書き,メンバ関数の定義を class.cppに書いておいて他ファイルは#include "class.h" するのがいいのか,それとも自機に関する
クラスを jiki.h に書いてクラスも分けた方がいいのでしょうか?
※jiki.cpp/h enemy.cpp/hがあったら,それぞれのヘッダにクラスの宣言,ソースファイルに定義(インスタンス作成)とメンバ関数の定義,その他の一般関数の定義を書いてある状態