C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: テクステャの黒い部分の除去


(過去ログ 120 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■72193 / inTopicNo.1)  テクステャの黒い部分の除去
  
□投稿者/ Dmen (1回)-(2014/05/23(Fri) 17:00:38)

分類:[C/C++] 

#include "StdAfx.h"
#include "resource.h"
#include "ModifyMe.h"
#include "virgo19\\virgo19.h"

//#include <shlwapi.h> // PathFileExists()のために必要。
//#pragma comment(lib, "shlwapi.lib") // PathFileExists()のために必要、PrivateProfile.cppで行っているのでここで行う必要はない。

namespace
{
// プライベートプロファイル
int fps = 0;
std::string message;
std::string backgroundPath;

// テクスチャ
int buf = 0;
LPDIRECT3DTEXTURE9 background = nullptr;
LPDIRECT3DTEXTURE9 sakura = nullptr;

// フォント
LPD3DXFONT statusFont = nullptr;
LPD3DXFONT messageFont = nullptr;

// フレームカウンタ
DWORD changeGameDataCount = 0;
}

BOOL Initialize(const HINSTANCE /*hInstance*/, const LPCSTR /*lpCmdLine*/, const int /*nShowCmd*/)
{
virgo19::setAllocHook(); // この関数の最初に実行

// プライベートプロファイルの存在確認
const std::string profile("Virgo19.ini");

//if (!PathFileExists(profile.c_str())) {
// WriteErrorLog(__FUNCTION__, "PathFileExists()", static_cast<HRESULT> (GetLastError()));
// return false;
//}

// プライベートプロファイルの読み込み
char path[MAX_PATH + 1];
ZeroMemory(path, sizeof(path));
GetCurrentDirectory(sizeof(path), path);
lstrcat(path, "\\");
lstrcat(path, profile.c_str());

fps = GetPrivateProfileInt("PARAMETERS", "FPS", 60, path);
char buf[1024];
GetPrivateProfileString("STRINGS", "MESSAGE", "hello, world", buf, sizeof(buf), path);
message = buf;
GetPrivateProfileString("TEXTURES", "BACKGROUND", "Graphics\\燕子花.png", buf, sizeof(buf), path);
backgroundPath = buf;

// FPSの設定
if (!SetFramesPerSecond(fps)) {
WriteErrorLog(__FUNCTION__, "SetFramesPerSecond()");
return false;
}

return true;
}

BOOL Finalize(void)
{
virgo19::removeAllocHook(); // この関数の最後に実行

return true;
}

BOOL CreateObject(const LPDIRECT3DDEVICE9 lpd3dDevice, const BOOL bResetDevice, const BOOL /*bChangingMode*/)
{
// フォントのリセット処理
if (bResetDevice) {
bool ret = true;
HRESULT hr = statusFont->OnResetDevice();
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "statusFont->OnResetDevice()", hr);
ret = false;
}
hr = messageFont->OnResetDevice();
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "messageFont->OnResetDevice()", hr);
ret = false;
}
return ret;
}

// テクスチャの作成
// CreateTexture()の最後の引数をtrueにすると縮小用のフィルターが設定されます。今回は縮小しないのでfalseでよいのですが、
// 2012年度に縮小用のフィルターを設定しないとテクスチャを正しく描画できないパソコンがありましたので、
// この引数は必ずtrueにすることにします。

if (!CreateTexture(backgroundPath.c_str(), &background, nullptr, nullptr, false, true)) {
WriteErrorLog(__FUNCTION__, "CreateTexture(background)");
return false;
}

if (!CreateTexture("Graphics\\桜もち.png", &sakura, nullptr, nullptr, false, true)) {
WriteErrorLog(__FUNCTION__, "CreateTexture(桜もち)");
return false;
}

// フォントの作成
D3DXFONT_DESC fdesc;
ZeroMemory(&fdesc, sizeof(fdesc));
fdesc.Height = 15;
fdesc.CharSet = SHIFTJIS_CHARSET;
lstrcpy(fdesc.FaceName, "MS ゴシック");
HRESULT hr = D3DXCreateFontIndirect(lpd3dDevice, &fdesc, &statusFont);
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "D3DXCreateFontIndirect(statusFont)", hr);
return false;
}

ZeroMemory(&fdesc, sizeof(fdesc));
fdesc.Height = 120;
fdesc.CharSet = ANSI_CHARSET;
lstrcpy(fdesc.FaceName, "Times New Roman");
hr = D3DXCreateFontIndirect(lpd3dDevice, &fdesc, &messageFont);
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "D3DXCreateFontIndirect(messageFont)", hr);
return false;
}

return true;
}

BOOL DestroyObject(const BOOL bResetDevice, const BOOL /*bChangingMode*/)
{
// フォントのロスト処理
if (bResetDevice) {
bool ret = true;
HRESULT hr = statusFont->OnLostDevice();
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "statusFont->OnLostDevice()", hr);
ret = false;
}
hr = messageFont->OnLostDevice();
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "messageFont->OnLostDevice()", hr);
ret = false;
}
return ret;
}

// テクスチャとフォントの破棄
bool ret = true;

if (!DestroyTexture(&background)) {
WriteErrorLog(__FUNCTION__, "DestroyTexture(background)");
ret = false;
}

if (!DestroyTexture(&sakura)) {
WriteErrorLog(__FUNCTION__, "DestroyTexture(sakura)");
ret = false;
}

if (statusFont != nullptr) {
const ULONG cnt = statusFont->Release();
if (cnt != 0) {
WriteErrorLog(__FUNCTION__, "statusFont->Release()", cnt);
ret = false;
}
statusFont = nullptr;
}

if (messageFont != nullptr) {
const ULONG cnt = messageFont->Release();
if (cnt != 0) {
WriteErrorLog(__FUNCTION__, "messageFont->Release()", cnt);
ret = false;
}
messageFont = nullptr;
}

return ret;
}

BOOL InitializeGameData(const BOOL bResetDevice, const BOOL /*bChangingMode*/, const BOOL /*bReset*/)
{
if (bResetDevice) {
return true;
}

// フレームカウンタのリセット
changeGameDataCount = 0;

return true;
}

BOOL ChangeGameData(void)
{
// フレーム更新回数のカウント
changeGameDataCount++;

return true;
}

BOOL DrawBackBuffer(const LPD3DXSPRITE lpSprite)
{
bool ret = true;

// テクスチャの描画
HRESULT hr = lpSprite->Draw(background, nullptr, nullptr, nullptr, 0xFFFFFFFF);
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "lpSprite->Draw(background)", hr);
ret = false;
}

hr = lpSprite->Draw(sakura, nullptr, nullptr, nullptr, 0xFFFFFFFF);
if (FAILED(hr)) {
WriteErrorLog(__FUNCTION__, "lpSprite->Draw(sakura)", hr);
ret = false;
}

// メッセージの描画
RECT rc = {0, 0, nClientWidth, nClientHeight};
if (messageFont->DrawText(lpSprite, message.c_str(), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER, D3DCOLOR_XRGB(255, 0, 0)) == 0) {
WriteErrorLog(__FUNCTION__, "messageFont->DrawText()");
ret = false;
}

// フレームカウンタの描画
std::ostringstream oss;

//oss.str(""); // 内部バッファ(文字列ストリーム内の文字列)をクリアします。描画後ossを再利用する場合に実行する必要があります。
oss.fill('0');
oss << std::setw(10) << changeGameDataCount;

if (statusFont->DrawText(lpSprite, oss.str().c_str(), -1, &rc, DT_RIGHT | DT_BOTTOM, D3DCOLOR_XRGB(0, 0, 0)) == 0) {
WriteErrorLog(__FUNCTION__, "statusFont->DrawText()");
ret = false;
}

return ret;
}
黒い部分を除去するにはテクスチャの基になった画像の幅と高さが必要です。 では ModifyMe.cpp の無名名前空間に燕子花 ( background ) と桜もち ( sakura ) の基になった画像の幅と高さ格納するための変数を int 型で定義します。 全部で変数は4つになります。初期値はゼロにしておきましょう。
どのようにすればいいんでしょうか。

引用返信 編集キー/
■72212 / inTopicNo.2)  Re[1]: テクステャの黒い部分の除去
□投稿者/ Dmen (2回)-(2014/05/26(Mon) 09:05:38)
No72193 (Dmen さん) に返信
> #include "StdAfx.h"
> #include "resource.h"
> #include "ModifyMe.h"
> #include "virgo19\\virgo19.h"
> 
> //#include <shlwapi.h>					// PathFileExists()のために必要。
> //#pragma comment(lib, "shlwapi.lib")	// PathFileExists()のために必要、PrivateProfile.cppで行っているのでここで行う必要はない。
> 
> namespace
> {
> // プライベートプロファイル
> 	int fps = 0;
> 	std::string message;
> 	std::string backgroundPath;
> 
> // テクスチャ
> 	int buf = 0;
> 	LPDIRECT3DTEXTURE9 background = nullptr;
> 	LPDIRECT3DTEXTURE9 sakura = nullptr;
> 
> // フォント
> 	LPD3DXFONT statusFont = nullptr;
> 	LPD3DXFONT messageFont = nullptr;
> 
> // フレームカウンタ
> 	DWORD changeGameDataCount = 0;
> }
> 
> BOOL Initialize(const HINSTANCE /*hInstance*/, const LPCSTR /*lpCmdLine*/, const int /*nShowCmd*/)
> {
> 	virgo19::setAllocHook(); // この関数の最初に実行
> 
> // プライベートプロファイルの存在確認
> 	const std::string profile("Virgo19.ini");
> 
> 	//if (!PathFileExists(profile.c_str())) {
> 	//	WriteErrorLog(__FUNCTION__, "PathFileExists()", static_cast<HRESULT> (GetLastError()));
> 	//	return false;
> 	//}
> 
> // プライベートプロファイルの読み込み
> 	char path[MAX_PATH + 1];
> 	ZeroMemory(path, sizeof(path));
> 	GetCurrentDirectory(sizeof(path), path);
> 	lstrcat(path, "\\");
> 	lstrcat(path, profile.c_str());
> 
> 	fps = GetPrivateProfileInt("PARAMETERS", "FPS", 60, path);
> 	char buf[1024];
> 	GetPrivateProfileString("STRINGS", "MESSAGE", "hello, world", buf, sizeof(buf), path);
> 	message = buf;
> 	GetPrivateProfileString("TEXTURES", "BACKGROUND", "Graphics\\燕子花.png", buf, sizeof(buf), path);
> 	backgroundPath = buf;
> 
> // FPSの設定
> 	if (!SetFramesPerSecond(fps)) {
> 		WriteErrorLog(__FUNCTION__, "SetFramesPerSecond()");
> 		return false;
> 	}
> 
> 	return true;
> }
> 
> BOOL Finalize(void)
> {
> 	virgo19::removeAllocHook(); // この関数の最後に実行
> 
> 	return true;
> }
> 
> BOOL CreateObject(const LPDIRECT3DDEVICE9 lpd3dDevice, const BOOL bResetDevice, const BOOL /*bChangingMode*/)
> {
> // フォントのリセット処理
> 	if (bResetDevice) {
> 		bool ret = true;
> 		HRESULT hr = statusFont->OnResetDevice();
> 		if (FAILED(hr)) {
> 			WriteErrorLog(__FUNCTION__, "statusFont->OnResetDevice()", hr);
> 			ret = false;
> 		}
> 		hr = messageFont->OnResetDevice();
> 		if (FAILED(hr)) {
> 			WriteErrorLog(__FUNCTION__, "messageFont->OnResetDevice()", hr);
> 			ret = false;
> 		}
> 		return ret;
> 	}
> 
> // テクスチャの作成
> 	// CreateTexture()の最後の引数をtrueにすると縮小用のフィルターが設定されます。今回は縮小しないのでfalseでよいのですが、
> 	// 2012年度に縮小用のフィルターを設定しないとテクスチャを正しく描画できないパソコンがありましたので、
> 	// この引数は必ずtrueにすることにします。
> 
> 	if (!CreateTexture(backgroundPath.c_str(), &background, nullptr, nullptr, false, true)) {
> 		WriteErrorLog(__FUNCTION__, "CreateTexture(background)");
> 		return false;
> 	}
> 
> 	if (!CreateTexture("Graphics\\桜もち.png", &sakura, nullptr, nullptr, false, true)) {
> 		WriteErrorLog(__FUNCTION__, "CreateTexture(桜もち)");
> 		return false;
> 	}
> 
> // フォントの作成
> 	D3DXFONT_DESC fdesc;
> 	ZeroMemory(&fdesc, sizeof(fdesc));
> 	fdesc.Height = 15;
> 	fdesc.CharSet = SHIFTJIS_CHARSET;
> 	lstrcpy(fdesc.FaceName, "MS ゴシック");
> 	HRESULT hr = D3DXCreateFontIndirect(lpd3dDevice, &fdesc, &statusFont);
> 	if (FAILED(hr)) {
> 		WriteErrorLog(__FUNCTION__, "D3DXCreateFontIndirect(statusFont)", hr);
> 		return false;
> 	}
> 
> 	ZeroMemory(&fdesc, sizeof(fdesc));
> 	fdesc.Height = 120;
> 	fdesc.CharSet = ANSI_CHARSET;
> 	lstrcpy(fdesc.FaceName, "Times New Roman");
> 	hr = D3DXCreateFontIndirect(lpd3dDevice, &fdesc, &messageFont);
> 	if (FAILED(hr)) {
> 		WriteErrorLog(__FUNCTION__, "D3DXCreateFontIndirect(messageFont)", hr);
> 		return false;
> 	}
> 
> 	return true;
> }
> 
> BOOL DestroyObject(const BOOL bResetDevice, const BOOL /*bChangingMode*/)
> {
> // フォントのロスト処理
> 	if (bResetDevice) {
> 		bool ret = true;
> 		HRESULT hr = statusFont->OnLostDevice();
> 		if (FAILED(hr)) {
> 			WriteErrorLog(__FUNCTION__, "statusFont->OnLostDevice()", hr);
> 			ret = false;
> 		}
> 		hr = messageFont->OnLostDevice();
> 		if (FAILED(hr)) {
> 			WriteErrorLog(__FUNCTION__, "messageFont->OnLostDevice()", hr);
> 			ret = false;
> 		}
> 		return ret;
> 	}
> 
> // テクスチャとフォントの破棄
> 	bool ret = true;
> 
> 	if (!DestroyTexture(&background)) {
> 		WriteErrorLog(__FUNCTION__, "DestroyTexture(background)");
> 		ret = false;
> 	}
> 
> 	if (!DestroyTexture(&sakura)) {
> 		WriteErrorLog(__FUNCTION__, "DestroyTexture(sakura)");
> 		ret = false;
> 	}
> 
> 	if (statusFont != nullptr) {
> 		const ULONG cnt = statusFont->Release();
> 		if (cnt != 0) {
> 			WriteErrorLog(__FUNCTION__, "statusFont->Release()", cnt);
> 			ret = false;
> 		}
> 		statusFont = nullptr;
> 	}
> 
> 	if (messageFont != nullptr) {
> 		const ULONG cnt = messageFont->Release();
> 		if (cnt != 0) {
> 			WriteErrorLog(__FUNCTION__, "messageFont->Release()", cnt);
> 			ret = false;
> 		}
> 		messageFont = nullptr;
> 	}
> 
> 	return ret;
> }
> 
> BOOL InitializeGameData(const BOOL bResetDevice, const BOOL /*bChangingMode*/, const BOOL /*bReset*/)
> {
> 	if (bResetDevice) {
> 		return true;
> 	}
> 
> // フレームカウンタのリセット
> 	changeGameDataCount = 0;
> 
> 	return true;
> }
> 
> BOOL ChangeGameData(void)
> {
> // フレーム更新回数のカウント
> 	changeGameDataCount++;
> 
> 	return true;
> }
> 
> BOOL DrawBackBuffer(const LPD3DXSPRITE lpSprite)
> {
> 	bool ret = true;
> 
> // テクスチャの描画
> 	HRESULT hr = lpSprite->Draw(background, nullptr, nullptr, nullptr, 0xFFFFFFFF);
> 	if (FAILED(hr)) {
> 		WriteErrorLog(__FUNCTION__, "lpSprite->Draw(background)", hr);
> 		ret = false;
> 	}
> 
> 	hr = lpSprite->Draw(sakura, nullptr, nullptr, nullptr, 0xFFFFFFFF);
> 	if (FAILED(hr)) {
> 		WriteErrorLog(__FUNCTION__, "lpSprite->Draw(sakura)", hr);
> 		ret = false;
> 	}
> 
> // メッセージの描画
> 	RECT rc = {0, 0, nClientWidth, nClientHeight};
> 	if (messageFont->DrawText(lpSprite, message.c_str(), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER, D3DCOLOR_XRGB(255, 0, 0)) == 0) {
> 		WriteErrorLog(__FUNCTION__, "messageFont->DrawText()");
> 		ret = false;
> 	}
> 
> // フレームカウンタの描画
> 	std::ostringstream oss;
> 
> 	//oss.str(""); // 内部バッファ(文字列ストリーム内の文字列)をクリアします。描画後ossを再利用する場合に実行する必要があります。
> 	oss.fill('0');
> 	oss << std::setw(10) << changeGameDataCount;
> 
> 	if (statusFont->DrawText(lpSprite, oss.str().c_str(), -1, &rc, DT_RIGHT | DT_BOTTOM, D3DCOLOR_XRGB(0, 0, 0)) == 0) {
> 		WriteErrorLog(__FUNCTION__, "statusFont->DrawText()");
> 		ret = false;
> 	}
> 
> 	return ret;
> }
> 黒い部分を除去するにはテクスチャの基になった画像の幅と高さが必要です。 では ModifyMe.cpp の無名名前空間に燕子花 ( background ) と桜もち ( sakura ) の基になった画像の幅と高さ格納するための変数を int 型で定義します。 全部で変数は4つになります。初期値はゼロにしておきましょう。
> どのようにすればいいんでしょうか。
> 

引用返信 編集キー/
■72225 / inTopicNo.3)  Re[2]: テクステャの黒い部分の除去
□投稿者/ Jitta (148回)-(2014/05/26(Mon) 21:30:46)
No72212 (Dmen さん) に返信

え〜っと・・・プログラムをいきなり出されても、

何をしたいのか、
現状どうなるのか、
現在値と期待値がどう違うのか、

というところがわからないので、答えようがないのですが。。。

どこかから拾ってきたプログラムのようですが、そうであれば、拾ってきたもとで尋ねてください。
ご自分の「会社で作っているプログラム」であれば、情報流出です。処罰を覚悟してください。
ご自分の「研究室で作っているプログラム」であれば、まずは教授に尋ねてください。
もし、教授に「自分で考えろ」と言われたのであれば、「教授」とは、興味を持たせることも仕事です。「私は、どこに興味を持って調べるべきですか」と尋ねてください。
引用返信 編集キー/
■72235 / inTopicNo.4)  Re[3]: テクステャの黒い部分の除去
□投稿者/ Dmen (3回)-(2014/05/27(Tue) 15:18:34)
No72225 (Jitta さん) に返信
教授に「自分で考えろ」と言われた
引用返信 編集キー/
■72240 / inTopicNo.5)  Re[4]: テクステャの黒い部分の除去
□投稿者/ テスト (1回)-(2014/05/27(Tue) 17:52:06)
なら、尚更ここで聞くのはお門違いじゃないかな。
引用返信 編集キー/
■72245 / inTopicNo.6)  Re[4]: テクステャの黒い部分の除去
□投稿者/ Azulean (313回)-(2014/05/27(Tue) 23:00:53)
No72235 (Dmen さん) に返信
> 教授に「自分で考えろ」と言われた

このような課題の丸投げは嫌われる投稿の一例です。
なぜかというと、回答者側の労力を無償で求め、自分は成果として利用することで、自分が労せずに利益(この場合は課題クリア?成績?)を得ることになるためです。
わからないポイントを示し、ピンポイントで助力を請うことは同じ道を歩むものとしてフォローを期待しやすくなるので、そういった努力をしましょう。

また、質問者側が不利益を被る可能性としては、何らかの成果(答え)を掲示板から得た情報で教授に示せたとすると、教授はあなたにその答えを示せる力量があるとして、さらに難しい課題を与えるかもしれません。
そうなると、以前の課題を自力で解けなかった状態だとさらに掲示板に丸投げすることにつながりますが、レベルの上がった課題は相応に答えが得づらくなり、いずれ破綻を招きます。
自分の力量に合わせてうまく知識・知見を広められるように教授と協力してください。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -