dxライブラリのグラフィックハンドルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
名無し

dxライブラリのグラフィックハンドルについて

#1

投稿記事 by 名無し » 6日前

グラフィックハンドルをLoadGraph,LoadSoundMem関数で出力させる際、全て-1が返り値となり、ハンドルが変数に渡せません。何かソースコードの問題点、考えられる原因等を教えて頂きたいです。尚、ファイル名やファイルの場所、拡張子には特に問題は見受けられませんでした。

ソースコード↓

コード:

#include "DxLib.h"
#include "SceneMgr.h"
#include "Keyboard.h"
#include "cstdio"
#include "cstdlib"

void set_handle(int menu_graph[64], int menu_snd[64], int game_graph[64], int game_snd[64], int config_graph[64], int config_snd[64]);

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

	SetGraphMode(1920, 1080, 16);

	SetMainWindowText("Tetris");
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	int x, y, Mouse,end = 0;
	double size = 1.0;

	SetDrawArea(0,0,1919,1079);

	int screen_x, screen_y;
	int *p_sx, *p_sy;

	p_sx = &screen_x;
	p_sy = &screen_y;


	int menu_graph[64];		//メニューの画像ハンドル
	int menu_snd[64];		//メニューの音ハンドル

	int game_graph[64];		//ゲームの画像ハンドル
	int game_snd[64];		//ゲームの音ハンドル

	int config_graph[64];	//コンフィグ画面の画像ハンドル
	int config_snd[64];		//コンフィグ画面の音ハンドル


	set_handle(menu_graph, menu_snd, game_graph, game_snd, config_graph, config_snd);		//画像及び音のハンドルを格納

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && end == 0) {	//画面更新 & メッセージ処理 & 画面消去 & 終了判定

		ClearDrawScreen();						//画面上の画像をクリア

		Keyboard_Update();						//キーボードの更新
		Mouse = GetMouseInput();                //マウスの入力状態取得
		GetMousePoint(&x, &y);                  //マウスの座標取得

		end = SceneMgr_Update(menu_graph, menu_snd, game_graph, game_snd, config_graph, config_snd);	//更新
		SceneMgr_Draw(menu_graph, menu_snd, game_graph, game_snd, config_graph, config_snd);			//描画

		ScreenFlip();							//裏画面処理をした画像の表示(現在は画像なし)
		
	}

	InitGraph();
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

void set_handle(int menu_graph[64], int menu_snd[64], int game_graph[64], int game_snd[64], int config_graph[64], int config_snd[64]) {

	/* メニュー */

	menu_graph[0] = LoadGraph("画像/game_no.png");
	menu_graph[1] = LoadGraph("画像/game_cursol.png");
	menu_graph[2] = LoadGraph("画像/finish_cursol.png");
	menu_graph[3] = LoadGraph("画像/finish_no.png");

	menu_snd[0] = LoadSoundMem("サウンド/選択.wav");
	menu_snd[1] = LoadSoundMem("サウンド/カーソル_メニュー.wav");

	/* ゲーム画面 */

	game_snd[0] = LoadSoundMem("サウンド/選択.wav");
	game_snd[1] = LoadSoundMem("サウンド/カーソル_メニュー.wav");
	game_snd[2] = LoadSoundMem("サウンド/色変え.wav");
	game_snd[3] = LoadSoundMem("サウンド/設置.wav");
	game_snd[4] = LoadSoundMem("サウンド/解除.wav");

	game_graph[0] = LoadGraph("画像/game/I.png");
	game_graph[1] = LoadGraph("画像/game/J.png");
	game_graph[2] = LoadGraph("画像/game/L.png");
	game_graph[3] = LoadGraph("画像/game/N.png");
	game_graph[4] = LoadGraph("画像/game/O.png");
	game_graph[5] = LoadGraph("画像/game/S.png");
	game_graph[6] = LoadGraph("画像/game/T.png");
	game_graph[7] = LoadGraph("画像/game/Z.png");
	game_graph[8] = LoadGraph("画像/tab/edit-tab_cursol.png");
	game_graph[9] = LoadGraph("画像/tab/edit-tab_no.png");
	game_graph[10] = LoadGraph("画像/tab/play-tab_cursol.png");
	game_graph[11] = LoadGraph("画像/tab/play-tab_no.png");
	game_graph[12] = LoadGraph("画像/tab/edit_tab.png");
	game_graph[13] = LoadGraph("画像/tab/edit_frame.png");
	game_graph[14] = LoadGraph("画像/game/flame.png");
	game_graph[15] = LoadGraph("画像/game/goal.png");
	game_graph[16] = LoadGraph("画像/game/block_flame.png");

	/* コンフィグ */

}

かずま

Re: dxライブラリのグラフィックハンドルについて

#2

投稿記事 by かずま » 6日前

whileループを次のように変更して実行すると、画面には何が表示されますか?

コード:

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && end == 0) {
		char dir[1024];
		GetCurrentDirectory(1024, dir);
		DrawFormatString(0, 0, 0x808080, dir);
	}
それは、「画像」や「サウンド」のパスになっていますか?

コード:

	while (式) {
		文 ...
	}
元のプログラムの while の「式」で、ScreenFlip() や ClearDrawScreen()を実行
しているので、「文」でのそれらは不要です。
ClearDrawScreen() は無害ですが、ScreenFlip() を 2回実行したら、裏画面と
表画面が入れ替わらないので、裏画面に描画した画像は表示されないでしょう。

名無し

Re: dxライブラリのグラフィックハンドルについて

#3

投稿記事 by 名無し » 6日前

>>whileループを次のように変更して実行すると、画面には何が表示されますか?

「画像」「サウンド」フォルダの一階層下のフォルダ名が表示されています。

>>元のプログラムの while の「式」で、ScreenFlip() や ClearDrawScreen()を実行
しているので、「文」でのそれらは不要です。
ClearDrawScreen() は無害ですが、ScreenFlip() を 2回実行したら、裏画面と
表画面が入れ替わらないので、裏画面に描画した画像は表示されないでしょう。

修正しました。が、画像は表示されない様です。

名無し

Re: dxライブラリのグラフィックハンドルについて

#4

投稿記事 by 名無し » 6日前

名無し さんが書きました:
6日前
>>whileループを次のように変更して実行すると、画面には何が表示されますか?

「画像」「サウンド」フォルダの一階層下のフォルダのパスが表示されています。

>>元のプログラムの while の「式」で、ScreenFlip() や ClearDrawScreen()を実行
しているので、「文」でのそれらは不要です。
ClearDrawScreen() は無害ですが、ScreenFlip() を 2回実行したら、裏画面と
表画面が入れ替わらないので、裏画面に描画した画像は表示されないでしょう。

修正しました。が、画像は表示されない様です。

かずま

Re: dxライブラリのグラフィックハンドルについて

#5

投稿記事 by かずま » 6日前

名無し さんが書きました:
6日前
「画像」「サウンド」フォルダの一階層下のフォルダ名が表示されています。
そんなことはあり得ません。

「画像」フォルダの一階層下のパスは、例えば、C:\xxx\yyy\zzz\画像\uuu、
「サウンド」フォルダの一階層下のパスは、C:\xxx\yyy\zzz\サウンド\vvv、
となるはずです。

「画像」「サウンド」フォルダの一階層下のパスはあり得ません。

個人情報を開示したくないなどで一部を伏字にすることは構いませんが、
表示結果をそのままコピペしてください。

"画像/game_no.png" というのは、カレントディレクトリからの相対パスです。

"画像/game_no.png" のフルパス名(絶対パス)、
"サウンド/選択.wav" のフルパス名(絶対パス) を教えてください。
実行ファイル(~.exe) の絶対パス名もお願いします。
名無し さんが書きました:
6日前
修正しました。が、画像は表示されない様です。
LoadGraph() に失敗して、画像データをメモリ上に読み込めていないのに
画像が表示されると考えること自体が信じられません。

名無し

Re: dxライブラリのグラフィックハンドルについて

#6

投稿記事 by 名無し » 6日前

かずま さんが書きました:
6日前
「画像」「サウンド」フォルダの一階層下のパスはあり得ません。
申し訳ありません。階層の上下を間違えてました。各フォルダの一つ上の階層でした。
表示結果は"C:\Users\Moriy\source\repos\テトリス\x64\Debug"です。

かずま さんが書きました:
6日前
"画像/game_no.png" のフルパス名(絶対パス)、
"サウンド/選択.wav" のフルパス名(絶対パス) を教えてください。
実行ファイル(~.exe) の絶対パス名もお願いします。
"画像/game_no.png" のフルパス名
"C:\Users\Moriy\source\repos\テトリス\x64\Debug\画像\game_no.png"

"サウンド/選択.wav" のフルパス名
"C:\Users\Moriy\source\repos\テトリス\x64\Debug\サウンド\選択.wav"

実行ファイル(~.exe) の絶対パス名
"C:\Users\Moriy\source\repos\テトリス\x64\Debug\GameProg.exe"

です。

かずま

Re: dxライブラリのグラフィックハンドルについて

#7

投稿記事 by かずま » 6日前

Visual Studio のツールバーでは、
ソリューション構成「Debug」「Release」を切り替えたり、
ソリューションプラットフォーム「x64」「x86」を切り替えたりできます。

Debugビルドで、実行ファイルが ~/テトリス/x64/Debug/GameProg.exe
となるのなら、Releaseビルドでは ~/テトリス/x64/Release/GameProg.exe
になるはずです。

実行ファイルは中身が異なるのでそれでよいのですが、画像ファイルなどは
Debug/Release で同じはずなので、「画像」「サウンド」フォルダは
プロジェクトフォルダ「テトリス」の直下にあるべきです。

ソリューションエクスプローラで、プロジェクト名を右クリックして
プロパティを表示し、「構成プロパティ」の「デバッグ」で、
「作業ディレクトリ」が「$(ProjectDir)」になっていると思いますが、
そこで <編集...> を選択すると、実際のディレクトリ名が表示されます。
それはどうなっていますか?

名無し

Re: dxライブラリのグラフィックハンドルについて

#8

投稿記事 by 名無し » 6日前

かずま さんが書きました:
6日前
実行ファイルは中身が異なるのでそれでよいのですが、画像ファイルなどは
Debug/Release で同じはずなので、「画像」「サウンド」フォルダは
プロジェクトフォルダ「テトリス」の直下にあるべきです。
「画像」「サウンド」フォルダはプロジェクトフォルダ「テトリス」にも入れてあります。
Debug/Releaseフォルダに入れていたのはそれらのバイナリを直に実行した際、画像表示を可能とする為です。

かずま さんが書きました:
6日前
ソリューションエクスプローラで、プロジェクト名を右クリックして
プロパティを表示し、「構成プロパティ」の「デバッグ」で、
「作業ディレクトリ」が「$(ProjectDir)」になっていると思いますが、
そこで <編集...> を選択すると、実際のディレクトリ名が表示されます。
それはどうなっていますか?
"C:\Users\Moriy\source\repos\テトリス\"となっています。

返信

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