マップに格納したグラフィックハンドルを取得する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
にほ
記事: 17
登録日時: 10ヶ月前
連絡を取る:

マップに格納したグラフィックハンドルを取得する方法

#1

投稿記事 by にほ » 6日前

どうも、いつもお世話になっております。
今回、DXライブラリでゲームを作っているのですが、画像処理で不具合が発生しています。
LoadGraph関数で読み込んだ画像のハンドルを、Imageクラスのマップに格納して扱うのですが、このマップから取得したハンドルでDrawGraph関数を呼び出しても画像が描画されません。
以下コードです。

コード:

#include <DxLib.h>

#include "Image.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE);
	DxLib_Init();

	Image::Instance()->Load();
	DrawGraph(0, 0, Image::Instance()->getImage("bar"), TRUE);
	WaitKey();

	DxLib_End();
}

コード:

#pragma once

#include <string>
#include <map>

#include <string.h>

using namespace std;

class Image {
private:
	map<string, int> mImageMap;
	Image() = default;
	~Image() = default;
	int allLoadNum = 0;

	void MyLoadGraph(const char *fileName, string tag);
public:
	static Image *Instance();
	void Load();
	int getAllLoadNum();
	int getImage(string key);
};

コード:

#include <DxLib.h>

#include "Image.h"

Image* Image::Instance() {
	static Image ins;
	return &ins;
}

void Image::MyLoadGraph(const char *fileName, string tag) {
	char str[64] = "image\\";
	strcat_s(str, fileName);
	ErrorLogAdd(str);
	ErrorLogAdd("\n");
	int HANDLE = LoadGraph(str);

	mImageMap[tag] = HANDLE;
	allLoadNum++;
}

int Image::getAllLoadNum() {
	return allLoadNum;
}

int Image::getImage(string key) {
	auto it = mImageMap.find(key);
	if (mImageMap.end() == it) {
		return -1;
	}
	else {
		it->second;
	}
}

void Image::Load() {
	char str[32];
	MyLoadGraph("loadBar.png", "bar");
	MyLoadGraph("image.png", "image.image");
	MyLoadGraph("image - コピー.png", "image.copy");
	for (int i = 0; i < 100; i++) {
		sprintf_s(str, "image - コピー (%d).png", i);
		MyLoadGraph(str, "image.copy." + i);
	}
}
マップを使ってデータを管理するのは今回が初めてのため、なにかやってはいけない処理をしてしまっているのでしょうか?
ご教授いただけると幸いです。

アバター
Rittai_3D
記事: 516
登録日時: 5年前

Re: マップに格納したグラフィックハンドルを取得する方法

#2

投稿記事 by Rittai_3D » 6日前

しっかりとコードは読んでいませんが、Image::getImage() で return it->second; していないからではないでしょうか。
初心者です

にほ
記事: 17
登録日時: 10ヶ月前
連絡を取る:

Re: マップに格納したグラフィックハンドルを取得する方法

#3

投稿記事 by にほ » 6日前

確かにreturnしていませんでした…
お手数かけてすみません、ありがとうございました

アバター
Rittai_3D
記事: 516
登録日時: 5年前

Re: マップに格納したグラフィックハンドルを取得する方法

#4

投稿記事 by Rittai_3D » 6日前

オフトピック
直接関係ないですが、C++を使うのならば const char* ではなく std::string を使った方が便利だと思います。
初心者です

かずま

Re: マップに格納したグラフィックハンドルを取得する方法

#5

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

"image.copy." + 0 は、"image.copy."。
"image.copy." + 1 は、"mage.copy."。
"image.copy." + 2 は、"age.copy."。

"image.copy." + 9 は、"y."。
"image.copy." + 10 は、"."。
"image.copy." + 11 は、""。
"image.copy." + 12 は、"image.copy." の最後の '\0' の次を指している。

sprintf_s の第2引数は、、第1引数のサイズ。

次のようにしないといけないのでは?

コード:

	for (int i = 0; i < 100; i++) {
		char tag[16];
		sprintf_s(str, sizeof(str), "image - コピー (%d).png", i);
		sprintf_s(tag, sizeof(tag), "image.copy.%d", i);
		MyLoadGraph(str, tag);
	}

返信

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