ページ 11

DXライブラリのディフューズカラーについて

Posted: 2011年3月27日(日) 17:02
by こぶ茶
はじめまして。お世話になります。現在DXライブラリを用いて3Dゲームを作成しています。

キャラクターがダメージを受けた際にそのキャラクターを白く点滅させることで無敵状態を表現したいと思い
MV1SetMeshDifColorScale関数を用いてキャラクターのディフューズカラーを白くし、
周期的に透過をいじることでそれを表現することにしたのですが
無敵状態が終わったあとにキャラクターのディフューズカラーをもとに戻す方法がわからず困っています。

どなたかよろしくお願いいたします。

Re: DXライブラリのディフューズカラーについて

Posted: 2011年3月27日(日) 19:20
by h2so5
変更前のディフューズカラーのスケール値を記憶しておいて、
その数値に戻すという手があると思います。

Re: DXライブラリのディフューズカラーについて

Posted: 2011年3月27日(日) 20:37
by こぶ茶
回答ありがとうございます。
おっしゃる通りにすればうまくいきそうと思い、
試したのですが、3Dモデルがなぜか崩れてしまい
モデル自体も少し黒っぽくなってしまいました。

テスト用に以下のようにしたのですが…

#include"DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;

// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}

int MeshNum,ModelHandle;
COLOR_F ColorF[64];

// 3Dモデルの読み込み
ModelHandle = MV1LoadModel("chara.pmd" ) ;

// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 230.0f, -370.0f ) ) ;

// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;

// キーの入力待ち
WaitKey() ;


// モデルに含まれるメッシュの数を取得する
MeshNum = MV1GetMeshNum( ModelHandle ) ;

//ディフューズカラーを取得する
for( int i=0;i<MeshNum;i++){

ColorF=MV1GetMaterialDifColor(ModelHandle,i) ;
}

//キャラクターのディフューズカラーを白く設定する
for( int i=0;i<MeshNum;i++){

MV1SetMeshDifColorScale(ModelHandle, i, GetColorF( 255.0f, 255.0f, 255.0f, 0.50f ) ) ;
}

//メッシュの数を確認する
DrawFormatString(0,0,GetColor(0,255,255),"MeshNum:%d",MeshNum);

// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;

// キーの入力待ち
WaitKey() ;

//元のディフューズカラーを設定する
for( int i=0;i<MeshNum;i++){
MV1SetMeshDifColorScale(ModelHandle, i, ColorF) ;
}

// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;

//キーの入力待ち
WaitKey();


// DXライブラリの後始末
DxLib_End() ;

// ソフトの終了
return 0 ;
}

Re: DXライブラリのディフューズカラーについて

Posted: 2011年3月27日(日) 20:43
by こぶ茶
すいません。フォーラムルールを見逃してました。
訂正させてください。

コード:

#include"DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	// ウインドウモードで起動
	ChangeWindowMode( TRUE ) ;

	// DXライブラリの初期化
	if( DxLib_Init() < 0 )
	{
		// エラーが発生したら直ちに終了
		return -1 ;
	}

	int MeshNum,ModelHandle;
	COLOR_F ColorF[64];

	// 3Dモデルの読み込み
	ModelHandle = MV1LoadModel("chara.pmd" ) ;

	// 画面に映る位置に3Dモデルを移動
	MV1SetPosition( ModelHandle, VGet( 320.0f, 230.0f, -370.0f ) ) ;

	// 3Dモデルの描画
	MV1DrawModel( ModelHandle ) ;

	// キーの入力待ち
	WaitKey() ;


	// モデルに含まれるメッシュの数を取得する
	MeshNum = MV1GetMeshNum( ModelHandle ) ;

        //ディフューズカラーを取得する
	for( int i=0;i<MeshNum;i++){

		ColorF[i]=MV1GetMaterialDifColor(ModelHandle,i) ;
	}

        //キャラクターのディフューズカラーを白く設定する
	for( int i=0;i<MeshNum;i++){

		MV1SetMeshDifColorScale(ModelHandle, i, GetColorF( 255.0f, 255.0f, 255.0f, 0.50f ) ) ;
	}

        //メッシュの数を確認する
	DrawFormatString(0,0,GetColor(0,255,255),"MeshNum:%d",MeshNum);

	// 3Dモデルの描画
	MV1DrawModel( ModelHandle ) ;

	// キーの入力待ち
	WaitKey() ;

        //元のディフューズカラーを設定する
	for( int i=0;i<MeshNum;i++){
		MV1SetMeshDifColorScale(ModelHandle, i, ColorF[i])  ;
	}

	// 3Dモデルの描画
	MV1DrawModel( ModelHandle ) ;

	//キーの入力待ち
	WaitKey();


	// DXライブラリの後始末
	DxLib_End() ;

	// ソフトの終了
	return 0 ;
}

Re: DXライブラリのディフューズカラーについて

Posted: 2011年3月27日(日) 22:00
by h2so5
こぶ茶 さんが書きました:回答ありがとうございます。
おっしゃる通りにすればうまくいきそうと思い、
試したのですが、3Dモデルがなぜか崩れてしまい
モデル自体も少し黒っぽくなってしまいました。
ClearDrawScreenをせずに同じ3D座標に連続で描画しているからです。
画面をクリアしてから描画しないと、Zバッファの関係で正常に描画されません。

モデル全体のディフューズカラーを設定するならMV1SetDifColorScaleのほうが簡単です。

Re: DXライブラリのディフューズカラーについて

Posted: 2011年3月27日(日) 22:18
by こぶ茶
h2so5 さんが書きました: ClearDrawScreenをせずに同じ3D座標に連続で描画しているからです。
画面をクリアしてから描画しないと、Zバッファの関係で正常に描画されません。

モデル全体のディフューズカラーを設定するならMV1SetDifColorScaleのほうが簡単です。
ClearDrawScreenの入れ忘れのご指摘ありがとうございます。これを入れても変わらなかったのですが
MV1SetDifColorScale関数を用いたものに変更したところうまくいきました。
h2so5様、ありがとうございました。