トップページ > 記事閲覧
画像の描画がうまくできません…
名前:kou 日時: 2017/09/30 03:39

初めて質問させていただきます。 つい昨日からVisual Studio Community 2017とDXライブラリを用いてのゲームプログラミングを勉強し始めようと思い、 まずはマップデータを示す二次元配列と32×32サイズのマップチップの画像データを使ったマップ描画を試してみようと思ったのですが、 デバッグを実行してみると真っ暗な画面でうまく画像が描画できません。 ログ等を見てもエラーは見当たらないようでした。また、マップチップの画像をまとめたフォルダも.cppファイルがある フォルダと同じ階層に入れてあります。 いろいろ調べては見たのですが解決に至らなかったので質問させていただきました。 以下ソースコードになります。 // マップ表示基本 #include "DxLib.h" #define MAP_SIZE 32 // マップチップ一つのドットサイズ #define MAP_WIDTH 20 // マップの幅 #define MAP_HEIGHT 15 // マップの縦長さ // マップのデータ int MapData[MAP_HEIGHT][MAP_WIDTH] = { { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 } , { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 } , { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 } , { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 } , { 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 } , { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 } , { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 } , { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 } , { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 } , { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 } , { 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 } , { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 } , { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 } , { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 } , { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 } }; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int i, j, tile01, tile02, tile03; SetGraphMode(640, 480, 16); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // マップチップのロード tile01 = LoadGraph("マップチップの保存フォルダ/tile01.png"); tile02 = LoadGraph("マップチップの保存フォルダ/tile02.png"); tile03 = LoadGraph("マップチップの保存フォルダ/tile03.png"); // マップを描く for (i = 0; i < MAP_HEIGHT; i++) { for (j = 0; j < MAP_WIDTH; j++) { if (MapData[i][j] == 0) { DrawGraph(j * MAP_SIZE, i * MAP_SIZE, tile01, FALSE); } else if (MapData[i][j] == 1) { DrawGraph(j * MAP_SIZE, i * MAP_SIZE, tile02, FALSE); } else if (MapData[i][j] == 2) { DrawGraph(j * MAP_SIZE, i * MAP_SIZE, tile03, FALSE); } } } // キー入力待ち WaitKey(); DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: 画像の描画がうまくできません… ( No.1 )
名前:管理人 日時:2017/09/30 20:29

変数の tile01, tile02, tile03 には -1 以外の値が格納されていますでしょうか? -1 が格納されていたらpngファイルの読み込みに失敗しています > また、マップチップの画像をまとめたフォルダも.cppファイルがある > フォルダと同じ階層に入れてあります。 デバッグ実行した際に LoadGraph で読み込むファイルのフォルダは cppファイルがあるフォルダではなく プロジェクトファイル( 拡張子が vcxproj のファイル )があるフォルダに置く必要がありますので、 もしプロジェクトファイルがあるフォルダにマップチップの画像ファイルがありませんでしたら 画像ファイルをプロジェクトファイルがあるフォルダに移してみてください あと、DxLib_Init の呼び出しの前に ChangeWindowMode(TRUE); という記述を増やすとウィンドウモードでで起動するので、デバッグの際はこちらの モードの方が作業しやすいのでよろしければお試しください m(_ _)m
メンテ
Re: 画像の描画がうまくできません… ( No.2 )
名前:kou 日時:2017/10/02 22:54

ウィンドウモードでのデバッグのご教示ありがとうございます。各変数 tile1, tile2, tile3 それぞれの LoadGraph が 済んだあと、printfDx関数にてウィンドウに値の表示を見てみたのですが、どれも値は -1 ではありませんでした。 また画像の格納フォルダですが、cppファイルのあるフォルダにプロジェクトファイルもあったので、各画像を 同じフォルダに直に置いてみたのですが、やはりウィンドウは真っ黒なままでした。 いくつもサイトを探し回ってみてはいるのですが、参考のプログラムソースに大きな違いが見られることもなく、 原因が不明なままで少々困惑しています。 何かしら解決方法が他にもありましたらご教示いただけるとありがたいです。何度もすみません… 追記:画面にうまく画像が描画されないときの対処法が書かれたサイトを見つけ、書いてあったScreenFlip、ScreenCopy    関数も試してはみたのですがうまくいきませんでした…
メンテ
Re: 画像の描画がうまくできません… ( No.3 )
名前:管理人 日時:2017/10/02 23:44

ScreenFlip を使用する場合は SetDrawScreen も使用する必要があるのですが、 SetDrawScreen は使用されていますでしょうか? // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // マップを描く for (i = 0; i < MAP_HEIGHT; i++) { for (j = 0; j < MAP_WIDTH; j++) { if (MapData[i][j] == 0) { DrawGraph(j * MAP_SIZE, i * MAP_SIZE, tile01, FALSE); } else if (MapData[i][j] == 1) { DrawGraph(j * MAP_SIZE, i * MAP_SIZE, tile02, FALSE); } else if (MapData[i][j] == 2) { DrawGraph(j * MAP_SIZE, i * MAP_SIZE, tile03, FALSE); } } } // 裏画面の内容を表画面に反映 ScreenFlip() ; ↑もしこちらでも駄目でしたら、 ↓こちらのように画像の代わりにボックスを描画してみてください  赤・緑・青のボックスが表示されましたら、原因を絞ることができます m(_ _)m // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // マップを描く for (i = 0; i < MAP_HEIGHT; i++) { for (j = 0; j < MAP_WIDTH; j++) { if (MapData[i][j] == 0) { DrawBox(j * MAP_SIZE, i * MAP_SIZE, ( j + 1 ) * MAP_SIZE, ( i + 1 ) * MAP_SIZE, GetColor( 255,0,0 ), TRUE); } else if (MapData[i][j] == 1) { DrawBox(j * MAP_SIZE, i * MAP_SIZE, ( j + 1 ) * MAP_SIZE, ( i + 1 ) * MAP_SIZE, GetColor( 0,255,0 ), TRUE); } else if (MapData[i][j] == 2) { DrawBox(j * MAP_SIZE, i * MAP_SIZE, ( j + 1 ) * MAP_SIZE, ( i + 1 ) * MAP_SIZE, GetColor( 0,0,255 ), TRUE); } } } // 裏画面の内容を表画面に反映 ScreenFlip() ;
メンテ
Re: 画像の描画がうまくできません… ( No.4 )
名前:kou 日時:2017/10/03 02:03

ScreenFlip関数を試したときに裏画面に描画を行うSetDrawScreen関数を使用してはいなかったため、 DXライブラリ初期化の後にSetDrawScreen関数で裏画面に描画するように設定し、マップ描画後に ScreenFlip関数を実行してみましたが、相変わらず黒いままでした。 また、赤、青、緑の四角描画の方はきちんと表示されていました。 それと、他におかしな部分がないかと探しているとデバッグのログの中に「'○○.dll'が読み込まれ ました。PDBファイルが開けないか、ファイルが見つかりません」と多くのファイルに対して表示 されている中に、「(省略)(KernelBase.dll) で例外がスローされました(省略)」といった 例外が発生しているのが確認できました。 これが今回の問題に関係しているのか気になったので、質問させてください。
メンテ
Re: 画像の描画がうまくできません… ( No.5 )
名前:管理人 日時:2017/10/04 00:25

四角描画では表示されたとのことですと、やはり画像処理又は画像ファイルに原因がありそうです お手数で申し訳ありませんが、よろしければ表示されない tile01.png, tile02.png, tile03.png を zip 等で圧縮してこちらのメールアドレス BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に送っていただけないでしょうか? 原因を調べてみたいと思います m(_ _;m > 「(省略)(KernelBase.dll) で例外がスローされました(省略)」といった > 例外が発生しているのが確認できました。 私の環境でもたまに出力されます 私も詳しくはわかっていないのですが、この出力が原因でプログラムが停止したということは無いので 出力されていても問題ないのかもしれません ( 動作が停止するほどではないバグが KernelBase.dll にあるのかもしれません )
メンテ
Re: 画像の描画がうまくできません… ( No.6 )
名前:kou 日時:2017/10/04 01:03

指定のメールアドレスの方にデータ送信させていただきました。 お手数おかけしますがよろしくお願いします。
メンテ
Re: 画像の描画がうまくできません… ( No.7 )
名前:管理人 日時:2017/10/04 01:15

メールをお送りいただきありがとうございます 早速添付していただいたファイルを拝見致しました 結果ですが、私の環境では tile01.png, tile02.png, tile03.png は読み込むことができませんでした 原因ですがこちらの3つのファイルはいずれも拡張子は png となっていますが、ファイルの中身を調べてみたところ gif ファイルでした DXライブラリは gif ファイルには対応していませんので、申し訳ありませんがペイントツールなどでファイルを読み込み、 bmp 形式や png 形式で保存しなおしてみたもので再度読み込み+描画をお試しになってみてください m(_ _;m
メンテ
Re: 画像の描画がうまくできません… ( No.8 )
名前:kou(解決) 日時:2017/10/04 01:34

たびたびお手数おかけしてすみませんでした。 ペイントソフトにて各画像に対して開く、 名前を付けて保存、にて形式を指定して再保存したところ、 きちんとマップ描画できました。 各マップチップの画像をとあるドット絵の描けるサイトで 作成したのですが、名前を付けて保存する際に自分で拡張子 まで名前に含めて入力、保存しウィンドウズやpythonの 方でも読み込みができていたため、てっきりpng画像だと 思い込んでしまっていたのが原因になってしまったようです… とても助かりました、ありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存