キャラの描画が出来ません。

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

キャラの描画が出来ません。

#1

投稿記事 by Ouxiy » 4年前

環境
Windows10
visual studio
DXライブラリ


DrawGraph(x, y, imgChara, FALSE);の関数により、キャラが描画できたと思うのですが、なぜか反映されません。なぜでしょうか。

コード:

#include "DxLib.h"
#include <stdio.h>

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

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


	//キー取得用配列
	char key[256];
	//x座標
	int x = 0, y = 0;

	//グラフィックハンドル格納用配列
	
	int gh[12];
	int imgChara = LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); 
	 DrawGraph(x, y, imgChara, FALSE);//キャラクターを描画
	
		
	printf("結果は %dです。\n", DrawGraph); 

	


	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll(key) == 0)
	{

		// プレイヤーの画像を描画
		
	
		
		//DrawGraph(0, 0, imgBack, false);

		if (key[KEY_INPUT_LEFT] == 1 || key[KEY_INPUT_RIGHT] == 1) {
			if (key[KEY_INPUT_LEFT] == 1) {

				x = x + 10.0f;

			}
		}

	}

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

	return 0;				// ソフトの終了 

}

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

Re: キャラの描画が出来ません。

#2

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

DrawGraph関数の第3引数には画像のハンドルを渡さないといけないのに、
LoadDivGraph関数の戻り値の0または-1を渡しているため、
画像を描画できない可能性が高いです。
また、仮にたまたまこれが画像のハンドルとして有効な値となり、画像が描画されたとしても、
すぐにClearDrawScreen関数により消されてしまうでしょう。
これが「なぜか反映されません。なぜでしょうか。」の答えです。

また、このコードには、他にも
SetDrawScreen(DX_SCREEN_BACK);を呼び出さずに ScreenFlip();を呼び出している
 (不自然なパターン、動作が遅くなる可能性がある)
・printf関数の書式%dにはint型のデータを渡さないといけないのに、関数から変換されるポインタを渡している
 (未定義動作)
という問題もあります。

ちなみに、画像を描画したあとに描画に使った座標が入っている変数を書き換えても、
そのことにより自動的に描画内容は更新されません。
座標の更新を反映させるには、自分で更新後の座標で描画しないといけません。
(そのあたりを隠蔽するフレームワークを使えば、また別かもしれませんが…)

いきなりコードを書こうとせずに、まずはフローチャートでどのような処理をするべきか整理してみるといいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: キャラの描画が出来ません。

#3

投稿記事 by Ouxiy » 4年前

みけCAT さんが書きました:
4年前
DrawGraph関数の第3引数には画像のハンドルを渡さないといけないのに、
LoadDivGraph関数の戻り値の0または-1を渡しているため、
画像を描画できない可能性が高いです。
また、仮にたまたまこれが画像のハンドルとして有効な値となり、画像が描画されたとしても、
すぐにClearDrawScreen関数により消されてしまうでしょう。
これが「なぜか反映されません。なぜでしょうか。」の答えです。

また、このコードには、他にも
SetDrawScreen(DX_SCREEN_BACK);を呼び出さずに ScreenFlip();を呼び出している
 (不自然なパターン、動作が遅くなる可能性がある)
・printf関数の書式%dにはint型のデータを渡さないといけないのに、関数から変換されるポインタを渡している
 (未定義動作)
という問題もあります。

ちなみに、画像を描画したあとに描画に使った座標が入っている変数を書き換えても、
そのことにより自動的に描画内容は更新されません。
座標の更新を反映させるには、自分で更新後の座標で描画しないといけません。
(そのあたりを隠蔽するフレームワークを使えば、また別かもしれませんが…)

いきなりコードを書こうとせずに、まずはフローチャートでどのような処理をするべきか整理してみるといいかもしれません。
<返信>
ありがとうございます。
アドバイスに従い、再度作ってみたのですが、

コード:

int gh[12];
LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); 
DrawGraph(x, y, "charall.png", FALSE);//キャラクターを描画
とDrawGraphの第3引数にハンドル"charall.png"を渡し、ClearDrawScreen関数を消したのですが、
他の部分も直してみたのですが、画像のように赤い線が入りビルドできなくなってしまいます。
[image][/image]
以下は書き直した全体のプログラムです。

コード:

#include "DxLib.h"
#include <stdio.h>

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

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


	//キー取得用配列
	char key[256];
	//x座標
	int x = 0, y = 0;

	//グラフィックハンドル格納用配列
	
	int gh[12];
	 LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); 
	 int DrawGraph(x, y, "charall.png", FALSE);//キャラクターを描画
	
		
	printf("結果は %dです。\n", DrawGraph); 

	


	while (ProcessMessage() == 0 && GetHitKeyStateAll(key) == 0)
	{

		// プレイヤーの画像を描画
		
	
		
		//DrawGraph(0, 0, imgBack, false);

		if (key[KEY_INPUT_LEFT] == 1 || key[KEY_INPUT_RIGHT] == 1) {
			if (key[KEY_INPUT_LEFT] == 1) {

				x = x + 10.0f;

			}
		}

	}

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

	return 0;				// ソフトの終了 

}

添付ファイル
スクリーンショット (342).png
スクリーンショット (342).png (36.04 KiB) 閲覧数: 7232 回

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

Re: キャラの描画が出来ません。

#4

投稿記事 by Ouxiy » 4年前

int gh[12];
LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
int GHandle = LoadGraph("charall.png");
DrawGraph(x, y, GHandle, FALSE);//キャラクターを描画
としたところ、画像が描画できました。ありがとうございます。

返信

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