原因を知りたい、バグを解決したい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ouxiy
記事: 173
登録日時: 4年前

原因を知りたい、バグを解決したい。

#1

投稿記事 by Ouxiy » 4年前

環境
DXライブラリ
C言語
visyual studio 2019

以下はコードです。

コード:

#include "DxLib.h"



int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey() {
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i < 256; i++) {
		if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	SetGraphMode(1300, 680, 32); // ウィンドウの大きさを指定
	ChangeWindowMode(TRUE);

	if (DxLib_Init() == -1)        // DXライブラリ初期化処理
	{
		return -1;            // エラーが起きたら直ちに終了
	}


	//キー取得用配列
	//char key[256];
	//x座標
	int playerX = 0; // X座標
	int playerY = 300; // Y座表
	int a[2][2];//移動制限のための配列の変数


	//グラフィックハンドル格納用配列
	int gh[12];
	LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
	DrawGraph(playerX, playerY, gh[8], FALSE);// プレイヤーの画像を描画



	while (ScreenFlip() == 0 && ProcessMessage() == 0 && gpUpdateKey() == 0) {

		int 加算 = 70;
		int b = 70;


		// カーソルキーの右が押されている
		if (Key[KEY_INPUT_RIGHT] == 1) {

			playerX = playerX + 加算; // プレイヤーのX座標を加算//左だけplayerX2とするとfor文ではないので、一回しか起きない、playerXだとplayerX = playerX + 加算より、加算されたあとのplayerXが再び右辺のplayerXに入り加算されるを繰り返すため∞に右に行けるのだ
			// 画面に出力
			ScreenFlip();
			// 画面をクリア
			ClearDrawScreen();
			// プレイヤーの画像を描画
			DrawGraph(playerX, playerY, gh[2], FALSE);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。

		}
		else { DrawGraph(playerX, playerY, gh[8], FALSE); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。

		if (Key[KEY_INPUT_UP] == 1) {
			playerY = playerY - b; // プレイヤーのY座標を加算

			// 画面に出力
			ScreenFlip();
			// 画面をクリア
			ClearDrawScreen();
			// プレイヤーの画像を描画
			DrawGraph(playerX, playerY, gh[5], FALSE);
		}


		if (Key[KEY_INPUT_LEFT] == 1) {
			playerX = playerX - 加算; // プレイヤーのX座標を加算


			// 画面をクリア
			ClearDrawScreen();
			// プレイヤーの画像を描画
			DrawGraph(playerX, playerY, gh[1], FALSE);

		}


		if (Key[KEY_INPUT_DOWN] == 1) {
			playerY = playerY + b; // プレイヤーのY座標を加算

			// 画面に出力
			ScreenFlip();
			// 画面をクリア
			ClearDrawScreen();
			// プレイヤーの画像を描画
			DrawGraph(playerX, playerY, gh[11], FALSE);
		}

	}

	DxLib_End();                // DXライブラリ使用の終了処理

	return 0;                // ソフトの終了 

}
は自分で書いたプログラムです。ですが、少し原因がわからないことがあります。
問題1、

コード:

DrawGraph(playerX, playerY, gh[2], FALSE);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。

		}
		else { DrawGraph(playerX, playerY, gh[8], FALSE); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。
とelseでKey[KEY_INPUT_RIGHT] == 1の時のみにでつけたのですが、他のUPやDOWN、LEFTの関数にも反映されます。
なぜでしょうか。理由が知りたいです。

質問2、バグに関してなのですが、キャラが下向きに行くとなんだかキャラが被って変に見えます。
解決方法となぜそうなったのか理由が知りたいです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 原因を知りたい、バグを解決したい。

#2

投稿記事 by みけCAT » 4年前

まず、どうして描画先を裏ページにせずにScreenFlip();を使うことにこだわるのですか?
ScreenFlip関数のリファレンスを見ると、
概略  フリップ関数、画面の裏ページ(普段は表示されていない)を 表ページ(普段表示されている)に反映する
解説  裏ページの内容を表ページに反映します。
(裏ページ、表ページについては 『SetDrawScreen』関数の解説を参照してください)

注…この関数を使用した後の裏ページの内容は環境によって変わりますので、ScreenFlip 関数を使用した後は ClearDrawScreen 等を使用して裏ページを初期化して下さい
となっています。
ここから、ScreenFlip()を使う時は裏ページに描画することが前提であると考えられます。
今回提示されたコードには、ScreenFlip()を呼び出したあと、ClearDrawScreenなどの初期化をせずに
(環境によって変わる裏ページの内容が反映された表ページに)そのまま描画している場面もあり、
環境依存になってよくないと思います。
どうしてもライブラリの変な使い方をしたいというのであれば無理にやめろとはいいませんが、
  • SetDrawScreen関数で描画先を裏ページにした上で、ScreenFlip関数を使う (推奨)
  • 描画先は表ページのままで、ScreenFlip関数を呼び出すのもやめる
のどちらかにすることをおすすめします。
Ouxiy さんが書きました:
4年前
問題1、

コード:

DrawGraph(playerX, playerY, gh[2], FALSE);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。

		}
		else { DrawGraph(playerX, playerY, gh[8], FALSE); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。
とelseでKey[KEY_INPUT_RIGHT] == 1の時のみにでつけたのですが、他のUPやDOWN、LEFTの関数にも反映されます。
なぜでしょうか。理由が知りたいです。
この部分は右キーが押された時でなければ他のキーの状態にかかわらず実行されるため、
他の条件が成り立たなければそのまま表示される…ということを「反映されます」と言っているのでしょうか?
Ouxiy さんが書きました:
4年前
質問2、バグに関してなのですが、キャラが下向きに行くとなんだかキャラが被って変に見えます。
解決方法となぜそうなったのか理由が知りたいです。
特殊な処理をしているようなので、もしかしたら解析が難しいかもしれないですね。
上に行くときも下と同じような処理になっているようですが、
この現象が起こるのは下向きに行くときだけですか?それとも他の方向でも発生しますか?
また、これは下向きに行くといつも発生しますか?それとも時々ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ouxiy
記事: 173
登録日時: 4年前

Re: 原因を知りたい、バグを解決したい。

#3

投稿記事 by Ouxiy » 4年前

>>この部分は右キーが押された時でなければ他のキーの状態にかかわらず実行されるため、
他の条件が成り立たなければそのまま表示される…ということを「反映されます」と言っているのでしょうか?
えーと、右のキーを押したときのみ、反映させるように書いたのに
なぜか右のキー以外のキーを押したときも反映されているので、その理由が知りたいです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 原因を知りたい、バグを解決したい。

#4

投稿記事 by みけCAT » 4年前

Ouxiy さんが書きました:
4年前
えーと、右のキーを押したときのみ、反映させるように書いたのに
なぜか右のキー以外のキーを押したときも反映されているので、その理由が知りたいです。
「反映させる」「反映されている」の意味がよくわからないので、教えてください。
具体的に、「どうなると予想したのに」「どうなってしまう」のですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ouxiy
記事: 173
登録日時: 4年前

Re: 原因を知りたい、バグを解決したい。

#5

投稿記事 by Ouxiy » 4年前

すいません、伝え方を考えます。わかりにくくてすいません。

返信

“C言語何でも質問掲示板” へ戻る