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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こぶ茶

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

#1

投稿記事 by こぶ茶 » 14年前

はじめまして。お世話になります。現在DXライブラリを用いて3Dゲームを作成しています。

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 14年前

変更前のディフューズカラーのスケール値を記憶しておいて、
その数値に戻すという手があると思います。

こぶ茶

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

#3

投稿記事 by こぶ茶 » 14年前

回答ありがとうございます。
おっしゃる通りにすればうまくいきそうと思い、
試したのですが、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ライブラリのディフューズカラーについて

#4

投稿記事 by こぶ茶 » 14年前

すいません。フォーラムルールを見逃してました。
訂正させてください。

コード:

#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 ;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#5

投稿記事 by h2so5 » 14年前

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

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

こぶ茶

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

#6

投稿記事 by こぶ茶 » 14年前

h2so5 さんが書きました: ClearDrawScreenをせずに同じ3D座標に連続で描画しているからです。
画面をクリアしてから描画しないと、Zバッファの関係で正常に描画されません。

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

閉鎖

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