関数化と変数の有効範囲
Posted: 2007年2月28日(水) 17:22
こんばんは。りむです。
着々と進んでいます。アクションの部分は、坂・ジャンプで登る時に下からすり抜ける足場…等、地形関係の部分は、まだ手をつけていませんが。。。
→or←…左右移動(二度押しでダッシュ)
↑…ジャンプ(ジャンプ量は調節可)
Z…防御
Z&(向いてる方向のキー)…プッシュガード(敵を押せる)
Z&(背中の方向のキー)…バックステップ(素早く後ろへ小さくジャンプ)
Z&↓…エフェクトつき防御(中身はまだ無し)
C…中段攻撃
C&↓…下段攻撃
C&←or→…上段攻撃
(ジャンプ中に)C…空中攻撃
こんなかんじになっています。細かい仕様をあげて言ったらきりがありませんけれど…。
まあ、こんなかんじで、次は敵を出現させる段階まできました。
現段階では、自由に移動するのみでAIも全くない状態ですが、
プレイヤーが重なろうとすると重なり防止のため押し戻されたりそれ以上進めなくなったりと存在感を出してあったり、
攻撃するとちゃんと当たったらダメージ受けて、仰け反ります。(HP設定とかはまだですが)
とりあえず、「敵がいる」状態にまではしました。
ここからが問題なのです。
敵というのは、同じマップに敵が何匹もいたり、同じ敵が2匹3匹といる場合が多いです。
その場合に、逐一敵の処理や情報を書いていたのではソースが超大ボリュームになるだけでなく、
把握も大変な上に同じ敵を出すとなるとまた同じソースをコピー添付しないといけなくなってしまいます。
なので、大した考えもなしにですが、
まず敵の情報に関するものをほとんど集めて構造体として、さらにその構造体を配列で定義してみました。
typedef struct enemy_data{
int enemy_id;
double x;
int y;
double vx;
double vy;
int muki;
int enemy_hp;
....
}enemy_data;
enemy_data en[100];
のような感じです。
各要素を使う時はen[0].vx*=0.9;のようにして、敵100体までを配列で扱えるようにしてみたのですが、
この場合もやはり全ての敵に関して処理をコピーあるいは作成していく必要があり、
さらにその時に同じ種類の出現位置以外は全くデータが同じの敵を作る場合に、
ソースが重複する部分が大量に出てきてしまい、とても勿体無くなってしまいます。
最低、敵の種類分だけのソースは用意して、同じ種類の敵が複数出た場合は、同じ処理を再利用できるようにしたいのですが…
こんな場合、どうしたらうまく処理することが出来るでしょうか…?
また、私の場合ほとんど自作関数を作ることをしない性質でして、
WinMain関数の中に処理をずらずらずらずらと書き記していってます。
今のところ、使っているのはマップとの衝突判定、敵[0]のマップとの衝突判定、プレイヤーの攻撃と敵との当たり判定(バウンディングボックスとか言うもの)をするものぐらいです。
自作関数での変数や処理の扱いがよくわからないせいですが…。
・自作関数では引数に指定した変数しか、WinMain関数の中の変数は扱えない?
・自作関数で行った処理で、どこまでが反映されるのかわからない。
(自作関数で他の関数を呼び出したり、画面表示等の処理をさせたり…の実行可能範囲がわからない)
・自作関数で得た結果をWinMain関数に反映したい時、複数の結果を戻したい
・そもそもどれぐらいの処理を関数にすると良いのか
…など、今までプログラミングで習ってはいても、いまいち手がおぼつかないといいますか、手が出ないと言いますか…どうしても積極的に使おう、と思うことが出来ません。ちなみに、今は
変数宣言→マップ・画像や音楽のメモリ読み込み→(ここからループ開始)→プレイヤー移動処理→着地や慣性等の処理→防御関係の処理→攻撃関係の処理→ジャンプの処理→敵の処理(移動処理からダメージ処理まで多数)→画像の表示等→(デバッグ用の変数表示処理)→(ループ最初へ戻る)
のような一連の流れになっています。コメントアウトやデバッグ用数値表示機能を入れると、今では1800行ぐらいです。インテンドや改行は教科書みたいに整えてあります。
…なので、と言うか…、自作関数に関して説明していただけるか、もしくはわかりやすい解説ページなどの紹介をお願いしたいのです。
よろしくおねがいします><
着々と進んでいます。アクションの部分は、坂・ジャンプで登る時に下からすり抜ける足場…等、地形関係の部分は、まだ手をつけていませんが。。。
→or←…左右移動(二度押しでダッシュ)
↑…ジャンプ(ジャンプ量は調節可)
Z…防御
Z&(向いてる方向のキー)…プッシュガード(敵を押せる)
Z&(背中の方向のキー)…バックステップ(素早く後ろへ小さくジャンプ)
Z&↓…エフェクトつき防御(中身はまだ無し)
C…中段攻撃
C&↓…下段攻撃
C&←or→…上段攻撃
(ジャンプ中に)C…空中攻撃
こんなかんじになっています。細かい仕様をあげて言ったらきりがありませんけれど…。
まあ、こんなかんじで、次は敵を出現させる段階まできました。
現段階では、自由に移動するのみでAIも全くない状態ですが、
プレイヤーが重なろうとすると重なり防止のため押し戻されたりそれ以上進めなくなったりと存在感を出してあったり、
攻撃するとちゃんと当たったらダメージ受けて、仰け反ります。(HP設定とかはまだですが)
とりあえず、「敵がいる」状態にまではしました。
ここからが問題なのです。
敵というのは、同じマップに敵が何匹もいたり、同じ敵が2匹3匹といる場合が多いです。
その場合に、逐一敵の処理や情報を書いていたのではソースが超大ボリュームになるだけでなく、
把握も大変な上に同じ敵を出すとなるとまた同じソースをコピー添付しないといけなくなってしまいます。
なので、大した考えもなしにですが、
まず敵の情報に関するものをほとんど集めて構造体として、さらにその構造体を配列で定義してみました。
typedef struct enemy_data{
int enemy_id;
double x;
int y;
double vx;
double vy;
int muki;
int enemy_hp;
....
}enemy_data;
enemy_data en[100];
のような感じです。
各要素を使う時はen[0].vx*=0.9;のようにして、敵100体までを配列で扱えるようにしてみたのですが、
この場合もやはり全ての敵に関して処理をコピーあるいは作成していく必要があり、
さらにその時に同じ種類の出現位置以外は全くデータが同じの敵を作る場合に、
ソースが重複する部分が大量に出てきてしまい、とても勿体無くなってしまいます。
最低、敵の種類分だけのソースは用意して、同じ種類の敵が複数出た場合は、同じ処理を再利用できるようにしたいのですが…
こんな場合、どうしたらうまく処理することが出来るでしょうか…?
また、私の場合ほとんど自作関数を作ることをしない性質でして、
WinMain関数の中に処理をずらずらずらずらと書き記していってます。
今のところ、使っているのはマップとの衝突判定、敵[0]のマップとの衝突判定、プレイヤーの攻撃と敵との当たり判定(バウンディングボックスとか言うもの)をするものぐらいです。
自作関数での変数や処理の扱いがよくわからないせいですが…。
・自作関数では引数に指定した変数しか、WinMain関数の中の変数は扱えない?
・自作関数で行った処理で、どこまでが反映されるのかわからない。
(自作関数で他の関数を呼び出したり、画面表示等の処理をさせたり…の実行可能範囲がわからない)
・自作関数で得た結果をWinMain関数に反映したい時、複数の結果を戻したい
・そもそもどれぐらいの処理を関数にすると良いのか
…など、今までプログラミングで習ってはいても、いまいち手がおぼつかないといいますか、手が出ないと言いますか…どうしても積極的に使おう、と思うことが出来ません。ちなみに、今は
変数宣言→マップ・画像や音楽のメモリ読み込み→(ここからループ開始)→プレイヤー移動処理→着地や慣性等の処理→防御関係の処理→攻撃関係の処理→ジャンプの処理→敵の処理(移動処理からダメージ処理まで多数)→画像の表示等→(デバッグ用の変数表示処理)→(ループ最初へ戻る)
のような一連の流れになっています。コメントアウトやデバッグ用数値表示機能を入れると、今では1800行ぐらいです。インテンドや改行は教科書みたいに整えてあります。
…なので、と言うか…、自作関数に関して説明していただけるか、もしくはわかりやすい解説ページなどの紹介をお願いしたいのです。
よろしくおねがいします><