ページ 1 / 1
C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月24日(木) 21:06
by cupa
度々失礼します。
C言語の館(26. シューティング基本)のソース書き写してやっているのですが、
動作しません。
画像のファイルパスなども確認したのですが、大丈夫でした。
また、書き間違えをしたのかな?と思い、コピペで試してみたのですがダメでした。
実際には、ウィンドウは表示されるのですが何も表示されません。
毎度お願いします。
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月24日(木) 21:06
by cupa
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月24日(木) 23:12
by prog
コード:
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
while(1){
↑
"26. シューティング基本"のプログラムの中のこちらの while(1){ の行にブレークポイントを置いて(while(1){ の行にカーソルを移動してF9キーを押す)実行(F5キーを押す)して、ブレークしたら配列imageに-1以外の値が格納されているか確認してみてください。
-1が格納されていたら画像が正常に読み込まれていません。
(その場合、画像が読み込まれていないので何も画面に表示されないということになります)
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月25日(金) 00:04
by cupa
すみません。
普段はVSを使わない(重いので)ので今回だけ使用してみたのですが、
ブレークポイントを作った後にどうやって確認すればいのでしょうか?
コード:
DrawFormatString(0,0,GetColor(255,255,255),"%d",image);
このようにしてみたのですが変な値が出てダメでした。
また、いつのタイミングに呼べばいいのでしょうか?
whileの前か後か・・・この機能を使ったことがなかったので使い方がわかりません・・・
お定数かけますがよろしくおねがいします
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月25日(金) 00:45
by prog
ブレークした状態でVSのメニューから
[デバッグ(D)]->[ウィンドウ(W)]->[ローカル(L)]
を選択するとローカル変数のブレークした時点での値の一覧が表示されますので、その中のimage配列を見ると配列要素の値を確認することができます。
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月25日(金) 03:47
by みけCAT
cupa さんが書きました: ↑3年前
コード:
DrawFormatString(0,0,GetColor(255,255,255),"%d",image);
このようにしてみたのですが変な値が出てダメでした。
imageは配列のはずなので、それぞれの要素を出力しないとダメですね。
例えば↓
コード:
for (int color = GetColor(255, 255, 255), i = 0; i < 16; i++) {
DrawFormatString(20 + 300 * (i / 8), 50 + 30 * (i % 8), color, "image[%d] = %d", i, image[i]);
}
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月25日(金) 21:43
by cupa
思いですが、progさんが教えてくださった方法をやってみました。
そしたら
コード:
image 0x000000b9a32ff820 {67633153, 67895298, 68157443, 68419588, 68681733, 68943878, 69206023, 69468168, ...} int[16]
このようなものが入ってました・・・(一番はじめのは多分16進数だと思うのですが、変換しても波括弧の中と同じような桁が多い数でした)
みけCATさんのやりかたでも、波括弧に入っている値が出力されました。
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月26日(土) 03:47
by prog
載せていただいた値を拝見する限りではロードは成功しているようです。
(最初の16進数はimage配列が格納されているメモリアドレスです、波括弧の中が配列要素の値で、67633153 や 67895298 などはグラフィックハンドルの値です)
もしかしてプログラムは問題なく動作しているのではないでしょうか?
手元で試してみたのですが、このプログラムは起動しただけでは真っ暗の画面で何も表示されません。
”エンターキーを押すとchar.pngの画像が画面下から上に飛んでいく”というプログラムなので、プログラムを起動した後にエンターキーを押してみてください。
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月26日(土) 10:47
by cupa
すみません、そのようでした。お手数おかけして申し訳ございませんでした。
ありがとうございます。
追加でもう一つ質問よろしいでしょうか?
コード:
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}
ここで、breakしてると思うのですが、何故でしょうか?
また、この場合抜けるのはFOR文ですよね?While文は抜けないですよね?
0番目の弾のフラグが0だった場合、他の弾はみられず後は飛ばされるのではないのでしょうか?
よろしくおねがいします。
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月26日(土) 12:57
by みけCAT
cupa さんが書きました: ↑3年前
この場合抜けるのはFOR文ですよね?While文は抜けないですよね?
はい。
cupa さんが書きました: ↑3年前
0番目の弾のフラグが0だった場合、他の弾はみられず後は飛ばされるのではないのでしょうか?
飛ばされます。
cupa さんが書きました: ↑3年前
ここで、breakしてると思うのですが、何故でしょうか?
最初に見つかった空き枠1個だけを利用し、弾を1個だけ出すためですね。
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月26日(土) 22:30
by cupa
もしエンターが長押しされたときは、i番目(0,1,2,3,4,5,6,,,)のフラグがどんどん立っていくのでしょうか?
一番はじめの0番目が1になって次の処理で0に戻してるのでずっと0番目でループしているのではないのか、
と思うのですがどうでしょうか・・・
みけCATさん>最初に見つかった空き枠1個だけを利用し、弾を1個だけ出すためですね。
空き枠を、一つだけしか利用しないのなら、配列にする必要はないのではないでしょうか?
エンターが推し続けられた場合、どうなるのかがよくわかってなくて・・・
Re: C言語の館のソースのある部分ができない・わからない(2)
Posted: 2022年2月27日(日) 00:59
by prog
> もしエンターが長押しされたときは、i番目(0,1,2,3,4,5,6,,,)のフラグがどんどん立っていくのでしょうか?
はい
> 一番はじめの0番目が1になって次の処理で0に戻してるのでずっと0番目でループしているのではないのか
tama
.flag=0; が実行される条件は上の行の if(tama.y < -32) が成立した場合(画像が画面上端から見えなくなった場合)ですので、0番目しか使用されない、ということはありません。
試しに
コード:
tama[i].flag=1; //発射フラグを立てる
↑
こちらの行にブレークポイントを置いてプログラムを実行して、エンターキーを押してみてください。
上記の行でプログラムが止まったら、F10キーを押して1行づつプログラムを実行してみてください。
コード:
tama[i].flag=0; //発射フラグを戻す
↑
tama
.flag=1;を実行した直後ではこちらの行には処理が辿り着かないことが確認できると思います。