環境
- Windows10
- C++
- X64
- visual studio 2019
if (Pad[PAD_RIGHT] == 1 && playerX < 2)とif (Pad[PAD_LEFT] == 1 && playerX > 0)にzannzoulock = 1と書きました。
例えば十字キーの右を押すと、zannzou = 30となりzannzoulock = 1となります。
すると892行から917行内に書いた以下のプログラムが動きます。
if (zannzou <= 5 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (27) * zannzou / 1, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 10 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (25) * zannzou / 3, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 15 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (20) * zannzou / 4, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 20 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (15) * zannzou / 5, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 25 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (10) * zannzou / 6, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 30 && zannzou > 0) { //★残像を出すためにRキーでAを押したら変数zannzouが20になり、zannouの変数が0より大きいならば—1をしていき、その間だけ画像を描画する。 --zannzou; DrawRotaGraph(pos[playerY][playerX][0] + 20 - (1) * zannzou / 7, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); }//移動した一瞬に元の位置に自分を描画したい、しかしうまく機能していない。 ///★多分一瞬過ぎるのであえてcount < 8と範囲を付けることでほんの一瞬だが残像が見えるようにした。 ///攻撃してcountが50に溜まるまでの期間を利用した。 if (zannzou < 1) { zannzou = 0; zannzoulock = 0; }
しかし、変数zannzoulockはずっと0のままで、描画して変数の変化を見ましたが、何も変化が見られませんでした。(※左ボタンでの変数zannzoulockも変化がありません)
大変お手数おかけしてしまうのですが、このようなエラーを解決するときにブレークポイントという方法があることは知っています。ですが、サイトを参考にいじってみても何をどうしていいのか未だにわからず唯一知っているdebug方法は描画してエラーを見る方法しか知りません。
なので、ブレークポイントをどのように利用することで今回の問題が解決するのか教えて頂けないでしょうか。
以下は全体のプログラムです。
全体のプログラム
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
そのif文のところでブレークポイントを設定して実行を止め、各変数のナカミを見てみましょう。
そして、1行づつステップ実行させて、その変数のナカミがどう変化するのかを見ていきます
投稿2019/12/09 22:55
総合スコア88038
0
例えば十字キーの右を押すと、zannzou = 30となりzannzoulock = 1となります。
(1)想定では値が1になるはずの処理である
しかし、変数zannzoulockはずっと0のままで、描画して変数の変化を見ましたが、何も変化が見られませんでした。
(2)確認を入れた個所では0になってしまっている
↓
ここから原因を推測してみると,とりあえず
zannzoulock = 1
という処理が何らかの理由(例えば条件分岐の記述の間違いとか)で実行されていないzannzoulock = 1
は実行されているんだけど,前期(2)の確認箇所までの間に0に上書きされてしまっている
くらいが考えられます.
(ほかにも,1にしたzannzoulockと確認しているzannzoulockが実は別の物だったとか,いろいろと考えられるでしょうけど)
まず,前者を疑うとしたら,
zannzoulock = 1
が書かれている行にブレークポイントを設定して実行してみればよいです.
そこをちゃんと通っているかどうかは,まずはこれでわかるでしょう.
前者が大丈夫そうなら,後者を調べます.
- 値を1にしている個所と描画して調べている個所とが(コードの行の位置的に)近いならば,とりあえず前期のブレークポイントで止まったところからステップ実行でもしていきながら,zannzoulockの値が変化しないかどうか見てみるだけでも怪しい箇所が見つかるでしょう.
zannzoulock
の値を変更しているような箇所すべてにブレークポイントを設定してやれば,手っ取り早く想定外のタイミングでzannzoulockの値が書き換えられてしまうことを見つけることができるかもしれません.- あるいは,データブレークポイントというのを使えば,zannzoulock(のメモリ位置)の値が変わった瞬間を見つけることもできます.
で,想定外の箇所が実行されている(あるいは想定した処理が実行されていない)ということが分かったなら,今度はその実行条件に関連する箇所にブレークポイントを設定して,条件に関連する変数の値を見てやる……
ということをしていき,根本原因を辿ります.
あと,描画して変数の変化を見るような方法だと,毎度それ用の描画コードを仕込んだり除去したりが大変ですし,その描画処理自体がバグっていて状況を見誤る可能性もあります.
複雑なデータならば描画しないと意味がわからないという場合もありますが,今回のような単体の変数の値を見るような場合にはあまりお勧めしません.
VisualStudioにはトレースポイントなる機能があるので,これを使うと便利です.
投稿2019/12/10 07:52
編集2019/12/10 07:54総合スコア11985
0
自己解決
debugしたところ、値が変わっていないのでプログラム自体に問題があると考え、以下の部分
if (zannzou <= 5 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (27) * zannzou / 1, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 10 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (25) * zannzou / 3, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 15 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (20) * zannzou / 4, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 20 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (15) * zannzou / 5, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 25 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - (10) * zannzou / 6, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); } if (zannzou <= 30 && zannzou > 0) { //★残像を出すためにRキーでAを押したら変数zannzouが20になり、zannouの変数が0より大きいならば—1をしていき、その間だけ画像を描画する。 --zannzou; DrawRotaGraph(pos[playerY][playerX][0] + 20 - (1) * zannzou / 7, pos[playerY][playerX][1], 2.0, 0, playerGHandle[5], TRUE); }//移動した一瞬に元の位置に自分を描画したい、しかしうまく機能していない。 ///★多分一瞬過ぎるのであえてcount < 8と範囲を付けることでほんの一瞬だが残像が見えるようにした。 ///攻撃してcountが50に溜まるまでの期間を利用した。 if (zannzou < 1) { zannzou = 0; zannzoulock = 0; }
を以下のように逆にして実行したところうまくいきました。
//右コマンドの残像 if (zannzou <= 30 && zannzou > 0) { //★残像を出すためにRキーでAを押したら変数zannzouが20になり、zannouの変数が0より大きいならば—1をしていき、その間だけ画像を描画する。 --zannzou; DrawRotaGraph(pos[playerY][playerX][0] + 20 - 15 * zannzou / 2, pos[playerY][playerX][1], 2.0, 0, playerGHandle[3], TRUE); }//移動した一瞬に元の位置に自分を描画したい、しかしうまく機能していない。 ///★多分一瞬過ぎるのであえてcount < 8と範囲を付けることでほんの一瞬だが残像が見えるようにした。 ///攻撃してcountが50に溜まるまでの期間を利用した。 if (zannzou <= 25 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - 13 * zannzou / (11 / 5), pos[playerY][playerX][1], 2.0, 0, playerGHandle[3], TRUE); } if (zannzou <= 20 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - 10 * zannzou / (24 / 10), pos[playerY][playerX][1], 2.0, 0, playerGHandle[3], TRUE); } if (zannzou <= 15 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - 6 * zannzou / (26 / 10), pos[playerY][playerX][1], 2.0, 0, playerGHandle[3], TRUE); } if (zannzou <= 10 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - 1 * zannzou / (28 / 10), pos[playerY][playerX][1], 2.0, 0, playerGHandle[3], TRUE); } if (zannzou <= 5 && zannzou > 0) { DrawRotaGraph(pos[playerY][playerX][0] + 20 - zannzou / 3, pos[playerY][playerX][1], 2.0, 0, playerGHandle[3], TRUE); if (zannzou <= 1) { zannzou = 0; zannzoulock = 0; } }
原因は
if (zannzou < 1) {
zannzou = 0; zannzoulock = 0;
}
の部分でした。
if (zannzou == 1) {
zannzou = 0; zannzoulock = 0;
}
としたところ変数のバグはなくなり書いた通りに動きました。
低評価を押した(凄腕?の)プログラマーの方、押すのは結構ですけど、せめて理由くらい書いてください。
まさか、理由なしに低評価を押すようなチンパンじゃないはずですよね?
そうでなければ、お願いしまーす。
回答のアドバイスは実行しました。そして、「自己」解決にいたりました。
投稿2019/12/10 00:56
編集2019/12/10 03:18総合スコア60
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/10 03:07
2019/12/10 03:15 編集
2019/12/10 03:10
2019/12/10 03:12
2019/12/10 03:16
2019/12/10 03:21
2019/12/10 03:21
2019/12/10 03:23
2019/12/10 03:34 編集
2019/12/10 03:33
2019/12/10 03:39 編集
2019/12/10 03:40 編集
2019/12/10 03:47 編集
2019/12/10 03:47 編集
2019/12/10 03:49 編集
2019/12/10 03:48
2019/12/10 03:50
2019/12/10 03:51
2019/12/10 03:52
2019/12/10 03:54
2019/12/10 03:56
2019/12/10 04:05
2019/12/10 04:25 編集
2019/12/10 04:24
2019/12/10 04:27
2019/12/10 04:32 編集
2019/12/10 04:33
2019/12/10 04:36
2019/12/10 04:49 編集
2019/12/10 04:50
2019/12/10 04:51
2019/12/10 04:52
2019/12/10 04:58 編集
2019/12/10 04:57
2019/12/10 04:57
2019/12/10 05:07 編集
2019/12/10 05:04
2019/12/10 05:07
2019/12/10 05:14 編集
2019/12/10 05:14
2019/12/10 05:18
2019/12/10 05:33 編集
2019/12/10 05:25
2019/12/10 05:25
2019/12/10 05:28
2019/12/10 05:33
2019/12/10 05:33
2019/12/10 05:34
2019/12/10 05:41
2019/12/10 06:38 編集
2019/12/10 06:20
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/10 00:54
2019/12/10 03:48