- ベストアンサー
一人プレイから二人プレイ仕様にしたいとき
アクションゲームを作っているんですが、「歩き」や「ジャンプ」などのモーション関数(すべて引数なし)がたくさんあって、当初は一人プレイ用で作っていたので、この関数内のコードはすべて、このキャラの座標や動きに対して直接的に処理していました。 しかし、ある日突然二人プレイができるようにしたいと思い、2個目のジョイスティック値やボタン番号を変数に格納するまではできたんですが、関数はどう改良すればいいのか皆目見当がつきません。ポイントだけでも良いのでご教授お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
元のプログラムが /*グローバル変数でキャラデータの定義*/ int char_x_pos; int char_y_pos; int char_action; /*上に移動する関数*/ void char_up(int step) { if (char_y_pos > step) char_y_pos -= step; 以下略 だったとしたら、以下のようにします。 /*グローバル変数でキャラデータの定義*/ typedef struct _CHAR_DATA { int char_x_pos; int char_y_pos; int char_action; } char_data; /*1P、2P用データ定義*/ char_data char1p; char_data char2p; /*上に移動する関数*/ void char_up(char_data *cdp,int step) { if (cdp->char_y_pos > step) cdp->char_y_pos -= step; 以下略 関数を呼ぶ時は char_up(10); だったのを char_up(&char1p,10); に変えれば1P用データが上に10移動し char_up(&char2p,10); に変えれば2P用データが上に10移動します。 キャラクターの情報を持つグローバル変数の定義を、構造体のメンバ変数の定義に書き替える訳です。 そして、関数内で構造体のポインタ経由で変数にアクセスするように修正すれば、渡された構造体のデータがアクセスされます。 関数内で修正し忘れた場所があれば、コンパイル時に「その変数は定義されてない」とエラーが出るので、修正を忘れる事は無いでしょう。
その他の回答 (1)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
直接の回答ではありませんが……。 この問題が解決すれば、オブジェクト指向が理解できるかもしれません。 比較適安直な方法。 まず、一連のモーション関数が、「どのデータをもとに」「どんな処理をしてい る」のか洗い出します。 この、「どのデータ」をたとえば、構造体としてひとまとめにします。 それぞれのプレーヤーに対して、この構造体を一つ準備します。 各関数に対しては、この構造体(へのポインタ)を引数としてわたせば、わたさ れた構造体から正しい処理を実行できるはずです。 わたされた構造体のデータだけで完全に処理ができるようにすれば、構造体をプ レーヤーの数だけ準備することで、原理的には、何人でも取り扱うことができま す。 次、おすすめの方法。 各プレーヤーを、「クラス」の「インスタンス」として構築してみることをおす すめします。 それぞれのプレーヤーは、「現在地(の座標)」などのデータを固有のデータと して持っています。 そして、一連の動作を(自分の持っているデータに従って)こなすことができる はずです。 この「自分のデータ」が、C++では、クラスの「メンバ変数」に、「一連の動 作」が、クラスの、「メンバ関数」に相当します。 この仕掛けを使えば、 player kimi(0, 0); // たとえば、初期位置が(0,0)だったりする。 player boku(10, 10); kimi.move(3, 2); // kimi に、(3, 2) だけ動いて欲しい。 boku.jump(); // boku は、ジャンプした のような記述ができるようになります。
お礼
分かりやすいアドバイスありがとうございました。クラスは難しいという先入観がありましたが、やはり使うしかなさそうですね。がんばります。
お礼
大変詳しい説明ありがとうございます。 構造体やクラスの仕組みが分からなかったので、とても勉強になりました。参考にして作ってみようと思います。