画像管理のヘッダーファイルを作りたい

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

画像管理のヘッダーファイルを作りたい

#1

投稿記事 by でぶの極み重め » 1年前

DXライブラリとC言語のみでゲームを作っているのですが、画像をロードして管理するだけのヘッダーファイルを作りたいです。以下のように作ってみたのですが、画像が表示されませんでした。
ヘッダーファイルで宣言した変数は使用できるのに、このような画像のパスや構造体が使用できない理由がわかりません。また、どのようにすれば使用できるか教えていただきたいです。

【Picture.h】

コード:

#ifndef PICTURE_H
#define PICTURE_H
#include <DxLib.h>

static int PictureX = 400;
static int PictureY = 400;
static int Handle00 = LoadGraph("画像//音街ウナ立ち絵素材ver1.0.png");	//音街ウナ立ち

#endif
【実行するファイル】

コード:

//描画
void Setting_Draw() {
	Achieve(Handle00);
	DrawFormatString(50, 50, white, "%d", Handle00);
}
【Achieve関数】

コード:

void Achieve(int Handle) {
	DrawGraph(PictureX, PictureY, Handle, TRUE);
	DrawFormatString(0, 0, white, "実行中");
}

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

Re: 画像管理のヘッダーファイルを作りたい

#2

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

グローバル変数を初期化するための値の計算はエントリポイントとなる関数の呼び出しより前に行われるため、
画像を読み込む処理に必要なライブラリの初期化処理をエントリポイントとなる関数、
またはその関数から呼び出される関数で行っている場合、
その初期化処理より前に画像の読み込みが試みられてしまい、読み込みが失敗する原因となります。
以下のようなラッパーを作成し、画像の読み込みの前に必ずライブラリの初期化処理を行うようにすると改善するかもしれません。

コード:

void initializeLibrary(void) {
	static int inited = 0;
	if (!inited) {
		/* ライブラリの初期化処理を行う */

		inited = 1;
	}
}

int LoadGraphWithInit(const char* path) {
	initializeLibrary();
	return LoadGraph(path);
}

static int Handle00 = LoadGraphWithInit("画像//音街ウナ立ち絵素材ver1.0.png");	//音街ウナ立ち
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: 画像管理のヘッダーファイルを作りたい

#3

投稿記事 by あたっしゅ » 1年前

[香車]東上☆あらし☆海美「
http://umezawa.dyndns.info/wordpress/?p=5939
グローバル変数の初期化順序を制御する - 或るプログラマの一生 プログラミングからチラシの裏まで(ja)

によると

> Visual C++ + Windows の場合、 #pragma init_seg を使えます。

だそうなので、

a.cpp

コード:

#pragma init_seg(lib)
int initDxLib = DxLib_Init();
b.cpp

コード:

#pragma init_seg(user)
int Handle00 = LoadGraph("Data/KabeTex.png");
とかやってみたけど、うまくいかず。
なので、

https://dxlib.xsrv.jp/cgi/aska/aska.cgi
https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?
DxLIb 本家(ja) で聞いてみれば ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

でぶの極み重め
記事: 6
登録日時: 1年前

Re: 画像管理のヘッダーファイルを作りたい

#4

投稿記事 by でぶの極み重め » 1年前

立て込んでいて返信が遅れてしまい申し訳ないです。みけCATさん、あたっしゅさん、回答ありがとうございます!
グローバル変数がDXライブラリの関数をコンパイルする前に処理されてしまうため、グローバル変数を宣言し初期化する際に関数がうまく使用できず失敗してしまうという解釈で大丈夫でしょうか。
呼び出しや初期化の順序を意識してもう一度書いてみようと思います!!

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: 画像管理のヘッダーファイルを作りたい

#5

投稿記事 by あたっしゅ » 1年前

[香車]東上☆あらし☆海美「
グローバル変数の初期化の順番の指定法は、C/C++の規格では決められていないみみ。
だから、対処法もコンパイラ/リンカによって変わる。
DxLIb 自体に #pragma つけるなりして、コンパイルしなおせば動くかもしれんが、ワシは、やるきがない。
『美しく書きたい』という気持ちは、わからんでもないが、
『ゲームを作る』のが目的なら、ソースコードを凝ってもしょうがない。
ゲーム内容で勝負すべきだ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

naohiro
記事: 8
登録日時: 2年前

Re: 画像管理のヘッダーファイルを作りたい

#6

投稿記事 by naohiro » 1年前

DXライブラリのLoadGraph関数は、DxLib_Init関数が呼ばれてからじゃないとつかえません。

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: 画像管理のヘッダーファイルを作りたい

#7

投稿記事 by あたっしゅ » 1年前

[香車]東上☆あらし☆海美「

> DXライブラリのLoadGraph関数は、DxLib_Init関数が呼ばれてからじゃないとつかえません。

そうですよ。だから、別に main 関数内で DxLib_Init 関数呼ぶのではなくて、
変数の初期化の時点で呼べばいい、という話をしています。

それで、変数の初期化の時点で、DxLib_Init 関数を呼んでも、大丈夫。
他の DxLIb 関数も、変数の初期化の時点で呼べるか → うまくいかない
#pragma で指定しても、だめだった。

今、思いついたんだが、C++ の class の初期化使うというのは、どうかな ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: 画像管理のヘッダーファイルを作りたい

#8

投稿記事 by あたっしゅ » 1年前

[香車]東上☆あらし☆海美「

コード:

/**
* @details https://dixq.net/forum/viewtopic.php?f=3&t=21612&p=158264#p158264 画像管理のヘッダーファイルを作りたい - ミクプラ(ja)
*/
#include "DxLib.h"


int initDxLib = DxLib_Init();

class TGraphBase {
	int m_handle;
	TGraphBase() {}
public:
	TGraphBase( const char* const fn ) {
		m_handle = LoadGraph( fn );
	}
	const int getHandle() const { return m_handle;  }
};
TGraphBase* Handle00 = new TGraphBase("Data/KabeTex.png");

#define TEST_STR_NUM 2
#define TEST_MAX_WIDTH 300
#define TEST_STR_SIZE 32

int WINAPI 
WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try
{
	//ChangeWindowMode(TRUE);
	if (initDxLib == -1)return 0;

	SetDrawScreen(DX_SCREEN_BACK);

	//TGraphBase* Handle00 = new TGraphBase("Data/KabeTex.png");

	int fontHandle = 0;
	fontHandle = CreateFontToHandle("Meiryo UI", TEST_STR_SIZE, 1, DX_FONTTYPE_ANTIALIASING); //フォントは適当

	const char* testStr = "アイウ 漢字 XYZ setting gpyq";

	int strWidth = 0;
	strWidth = GetDrawStringWidthToHandle(testStr, -1, fontHandle); //負の値を渡して文字全体の長さを取得

	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 ) {
		ClearDrawScreen();

		if (TEST_MAX_WIDTH < strWidth) {
			//幅が定数より大きい場合圧縮して描画
			//引数の座標は左上、右上、右下、左下の順
			DrawModiStringToHandle(
				0, 0,
				TEST_MAX_WIDTH, 0,
				TEST_MAX_WIDTH, TEST_STR_SIZE*1.5,
				0, TEST_STR_SIZE,
				GetColor(255, 255, 255), fontHandle, GetColor(128, 128, 128), 0, testStr
			);
		} else {
			//定数以下の場合は普通に描画
			DrawStringToHandle(0, 0, testStr, GetColor(255, 255, 255), fontHandle);
		}
		
		DrawGraph(0, 0, Handle00->getHandle(), TRUE);

		ScreenFlip();
	}

	DxLib_End(); //終了

	return EXIT_SUCCESS;					// ソフトの終了
}
catch (...)
{
	return EXIT_FAILURE;
}


// end.
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

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