ページ 11

関数呼び出しのタイミングについて

Posted: 2010年6月16日(水) 23:58
by 紅葉
はじめまして、紅葉と申します。

現在、http://dixq.net/g/28.htmlを参考にさせて頂き、実験用のゲームを作っています。
マップ上を一マス移動する毎に、自分の周囲(5×5)を探索、敵がいたら次の処理へ・・・、
というのを目指しているのですが、一マス移動する毎に関数を呼び出すにはどこで、
どの様に呼び出すのが適当なのでしょうか?
プログラムは常に回っていて、関数を設定しても何度も呼び出してしまうので、
どうすればいいのか分かりません。
どうか、ご教授お願いします。

[2] 環境  
 [2.1] OS : Windows vista
 [2.2] コンパイラ名 : VC++ 2008EE

[3] その他
 ・どの程度C言語を理解しているか → 授業で基本は習いましたが、苦手です。説明されれば、
自分でもそれなりに調べることは出来る・・・と思います。
 ・ライブラリを使っている場合は何を使っているか → DXライブラリ

Re:関数呼び出しのタイミングについて

Posted: 2010年6月17日(木) 00:07
by たいちう
> というのを目指しているのですが、一マス移動する毎に関数を呼び出すにはどこで、
> どの様に呼び出すのが適当なのでしょうか?

関数を二段構えにしてはいかがでしょうか。
何度も一段目を呼び出し、自分が移動している等の条件を満たしていたら、
そこから二段目を呼び出します。

# はじめまして?
# 以前何度かここでお見かけした紅葉さんとは別人なのですね。

Re:関数呼び出しのタイミングについて

Posted: 2010年6月17日(木) 00:21
by シエル
敵がいないかどうかのチェック関数をメインループで呼び出すようにし、
条件を満たしたら、戦闘処理に移す。

Re:関数呼び出しのタイミングについて

Posted: 2010年6月17日(木) 00:22
by 紅葉
たいちうさん

お返事ありがとうございます。

やはり、その方法でしょうか・・・。
考えはしたのですが、条件式がうまく思いつかず、行き詰まっていました。

こちらのページは最近見るようになりました。
名前が重複しているようで申し訳ありません。
以降は「もみじ04」と名乗ります。

Re:関数呼び出しのタイミングについて

Posted: 2010年6月17日(木) 20:07
by もみじ04
シエルさん、アドバイスありがとうございます。

ご意見を踏まえて、以下のように関数を用意してみました。
しかし、②の呼び出しは一歩ごとに行ってくれるようなのですが、①は移動中以外(停止している間)は常にcountが増加します。
a()の呼び出しは一歩ごとなのに、どうなっているのでしょうか?

int a(int x, int y) {

for(int k=y-2;k<=y+2;k++){
for(int l=x-2;l<=x+2;l++){

①DrawFormatString( 0, 0, GetColor(10, 10, 10), "%d\n",count) ; //デバッグ
①count++;

if(hantei[k][[/url]==2){ //敵がいた場合
ple--;
}
}
}
return 0;
}

void idou_check(int x, int y) {

if ((nowx != x) || (nowy != y)) {
②DrawFormatString( 0, 0, GetColor(10, 10, 10), "%d\n",count) ; //デバッグ
②count++;

//移動していたなら、a()を呼び出す
a(x, y);
//更に、現在地を上書き更新する
nowx = x;
nowy = y;
}
return;
}

Re:関数呼び出しのタイミングについて

Posted: 2010年6月17日(木) 20:27
by シエル
デバックのステップインをしてみて、停止中でも実際にa()の関数は実行されていますか?

あと、countを他の関数で加算していないでしょうか? 画像

Re:関数呼び出しのタイミングについて

Posted: 2010年6月17日(木) 21:05
by Dixq (管理人)
全体のプログラムが解らないので何とも言えませんが、
ch.walking_flagが1で、xもyも32で割りきれる座標に居る時に呼んであげればいいと思います。

壁にぶつかってる時は延々と呼ぶと思うので、実際に動いたのかどうかというフラグを用意してあげた方がいいかもしれませんね。

Re:関数呼び出しのタイミングについて

Posted: 2010年6月18日(金) 13:43
by もみじ04
いろいろとアドバイスありがとうございます。

原因は、シエルさんの指摘通り、デバッグ用に用意したcountをほかのところで呼び出していたようです。
初歩的なミスで大変申し訳ありません。

ところで、追加の質問なのですが、壁にぶつかると延々と呼ぶという状況がわかりません。
現在は、移動後の座標をidou_check()に投げて、そこで格納されている座標と違うなら関数を呼び出し、
その時の座標を比較用に更新しています。
一応異常なく動いているように見えるのですが、これで起こりうる不具合などがありましたら
ご指摘いただければと思います。

また、idou_check()の呼び出しは元のプログラムで言うと
----------
    idou_check() ← ココ
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
----------
で行っているんですが、問題ありませんか?

Re:関数呼び出しのタイミングについて

Posted: 2010年6月18日(金) 14:09
by シエル
>>ところで、追加の質問なのですが、壁にぶつかると延々と呼ぶという状況がわかりません。
おそらくですが、
Dixqさんがおっしゃってる判定方法である、
「ch.walking_flagが1で、xもyも32で割りきれる座標に居る時に呼ぶ」
という判定方法をおこなった場合は、壁にぶつかってる時は延々と呼んでしまうと
言っているのだろうと思います。
決して、もみじ04さんの判定方法に対して言っているのではないと思います。

で、関数を呼び出している場所ですが、特に問題ないと思います。


追記:
動作的には問題ないですが、Dixqさんの方法よりは関数が呼ばれる回数が増えるとおもいます。 画像

Re:関数呼び出しのタイミングについて

Posted: 2010年6月18日(金) 14:26
by もみじ04
シエルさん、ご説明ありがとうございます。

とりあえずこの件は解決しました。

皆さんご親切にありがとうぞざいました。
今後もよろしくお願いします。