管理人様、前回はお世話になりました。
Melです。
今回質問が2つあります。
その内の1つ目です。
前回のhttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3420の件の続きです。
Live2Dを描画する前にDrawgraphするとLive2Dの画像がすごい崩壊します。
後だと通常通りLive2D側とDrawgraph側も問題無いです。
読み込む画像拡張子に関係なく再現します。
DrawgraphでもDrawRectRotaGraphFでも再現します。
原因がさっぱりなのでまたお助けを求めにきました。
よろしくお願いします。
//////////////////////////以下サンプルソース/////////////////////////
//モデルはイプシロンです。
//mtnファイルはサンプルを使っています。
//髪にサンプルのPhysics.jsonの物理演算使っています。
//Physics.jsonはViewerの中に入ってます。
#include <D3D9.h>
//今回のゲームで使うライブラリ宣言
#include <Live2D.h>
using namespace live2d;
#include "DxLib.h"
//Live2D フレームワーク
#include <Live2DModelD3D.h>
#include <motion/Live2DMotion.h>
#include <motion/EyeBlinkMotion.h>
#include <motion/MotionQueueManager.h>
#include <util/UtSystem.h>
#include "L2DTargetPoint.h"
#include "L2DPhysics.h"
// 画面サイズ
#define SCREEN_SIZE_X 800
#define SCREEN_SIZE_Y 750
//Live2d
Live2DModelD3D* live2DModel; //モデル
LPDIRECT3DDEVICE9 g_Device9; //デバイス
Live2DMotion* motion[6]; //モーション
//EyeBlinkMotion EBM; //自動瞬き
MotionQueueManager* MQM; //モーションマネージャー
framework::L2DTargetPoint TP; //自動でsetした方向を向いてくれる
framework::L2DPhysics* Physics; //髪の物理演算
int mtn_num; //モーションナンバー
int Hbmp; //Dxlib側の画像ハンドル
void Render2D();
bool Create();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int x, add ;
// タイトルを test に変更
SetMainWindowText( "Test_exe" ) ;
// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;
//描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK );
// Direct3D9Ex ではなく Direct3D9 を使う
SetUseDirect3D9Ex( FALSE ) ;
// 画面解像度の設定
SetGraphMode( SCREEN_SIZE_X, SCREEN_SIZE_Y, 32 ) ;
// DXライブラリ初期化
if( DxLib_Init() == -1 )
{
return -1;
}
// Live2D 初期化
Live2D::init();
// DXライブラリが使用している Direct3DDevice9 を取得
g_Device9 = (LPDIRECT3DDEVICE9)GetUseDirect3DDevice9();
// フォントサイズの変更
SetFontSize(20);
// Live2D データの読み込み
if(!Create())
{
return -1;
}
// 左右に動く文字列の変数を初期化
x = 0 ;
add = 8 ;
// 背景色を青に設定
SetBackgroundColor( 0, 0, 255 ) ;
// 描画先を裏画面に変更
SetDrawScreen(DX_SCREEN_BACK);
//画像読み込みjpg
//Hbmp = LoadGraph("TestTex1.jpg");
//if(Hbmp == -1)
//{
// DxLib_End();
// return 0;
//}
//画像読み込みbmp
//Hbmp = LoadGraph("KabeTex.bmp");
//if(Hbmp == -1)
//{
// DxLib_End();
// return 0;
//}
//画像読み込みpng
Hbmp = LoadGraph("Arrow.png");
if(Hbmp == -1)
{
DxLib_End();
return 0;
}
// メインループ
while( ProcessMessage()==0 )
{
// 画面をクリア
ClearDrawScreen();
// 左右に動く文字列を動かす
x += add ;
if( x < 0 || x > SCREEN_SIZE_X )
{
add = -add ;
}
// Live2D で描くキャラクターの奥に"Live2D"と描画
DrawString(x,64,"Live2D",GetColor(255,255,255));
//DrawGraph(50,50,Hbmp,FALSE);
//DrawGraph3D(50,50,0,Hbmp,FALSE);
DrawRectRotaGraphF(50.0f,50.0f,0,0,256,256,1.0,0,Hbmp,FALSE,FALSE);
// Live2D の描画
Render2D();
//DrawRectRotaGraphF(50.0f,50.0f,0,0,256,256,1.0,0,Hbmp,FALSE,FALSE);
int Mouse = GetMouseInput();
int mX = SCREEN_SIZE_X / 2;
int mY = SCREEN_SIZE_Y / 2;
if( Mouse & MOUSE_INPUT_LEFT)
{
GetMousePoint(&mX,&mY);
}
float fX = (mX / (float)SCREEN_SIZE_X) * 2.0f - 1.0f;
float fY = (mY / (float)SCREEN_SIZE_Y) * 2.0f - 1.0f;
DrawFormatString(0, 0,GetColor(255,255,255),"%d:%d",mX ,mY);
DrawFormatString(0, 20,GetColor(255,255,255),"%.2f:%.2f",fX ,-fY);
DrawFormatString(0, 40,GetColor(255,255,255),"MotionNum:%d",mtn_num);
// Live2D で描くキャラクターの手前にも"Live2D"と描画
DrawString(SCREEN_SIZE_X - x, SCREEN_SIZE_Y - 100,"Live2D",GetColor(255,255,255));
// 裏画面を表画面に転送
ScreenFlip();
}
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
void Render2D()
{
// モデルが初期化されていなければ何もしない
if(live2DModel == NULL) return;
// DXライブラリの描画処理を完了させる
RenderVertex() ;
// Live2D の描画
{
// 射影行列の設定
D3DXMATRIX Ortho2D;
float modelWidth = live2DModel->getModelImpl()->getCanvasWidth() ;
float modelHeight = live2DModel->getModelImpl()->getCanvasHeight() ;
D3DXMatrixOrthoLH(&Ortho2D, modelHeight ,-modelHeight *SCREEN_SIZE_Y/SCREEN_SIZE_X, -1.0f, 1.0f);
g_Device9->SetTransform(D3DTS_PROJECTION, &Ortho2D);
// ビュー行列の設定
D3DXMATRIX Identity;
D3DXMatrixIdentity(&Identity);
g_Device9->SetTransform(D3DTS_VIEW , &Identity);
// ワールド行列の設定
D3DXMATRIXA16 world ;
D3DXMatrixTranslation(&world , -modelWidth/2, -modelHeight/2, 0) ;
g_Device9->SetTransform(D3DTS_WORLD, &world);
// --- 描画
if(MQM->isFinished())
{
mtn_num++;
if(mtn_num == 6)
{
mtn_num = 0;
}
MQM->startMotion(motion[mtn_num],false);
}
int Mouse = GetMouseInput();
int mX = SCREEN_SIZE_X / 2;
int mY = SCREEN_SIZE_Y / 2;
if( Mouse & MOUSE_INPUT_LEFT)
{
GetMousePoint(&mX,&mY);
}
float fX = (mX / (float)SCREEN_SIZE_X) * 2.0f - 1.0f;
float fY = (mY / (float)SCREEN_SIZE_Y) * 2.0f - 1.0f;
TP.set(fX ,-fY);
TP.update();
float dragX = TP.getX();
float dragY = TP.getY();
MQM->updateParam(live2DModel);
Physics->updateParam(live2DModel);
//顔の向きの調整
live2DModel->setParamFloat( "PARAM_ANGLE_X", dragX * 30 , 0.5 );//-30から30の値を加える
live2DModel->setParamFloat( "PARAM_ANGLE_Y", dragY * 30 , 0.5 );
//体の向きの調整
live2DModel->setParamFloat( "PARAM_BODY_X" , dragX * 10 , 0.5 );//-10から10の値を加える
//目の向きの調整
live2DModel->setParamFloat( "PARAM_EYE_BALL_X", dragX , 0.5 );//-1から1の値を加える
live2DModel->setParamFloat( "PARAM_EYE_BALL_Y", dragY , 0.5 );
live2DModel->update() ;
live2DModel->draw() ;
}
// DXライブラリの Direct3D9 の設定を復帰させる
RefreshDxLibDirect3DSetting() ;
}
bool Create()
{
LPCWSTR TEXTURES[1] =
{
L"L2res/model/model.2048/texture_00.png",
};
LPCWSTR MTNS[6] =
{
L"L2res/model/mtn/Epsilon_m_01.mtn",
L"L2res/model/mtn/Epsilon_m_02.mtn",
L"L2res/model/mtn/Epsilon_m_03.mtn",
L"L2res/model/mtn/Epsilon_m_04.mtn",
L"L2res/model/mtn/Epsilon_m_05.mtn",
L"L2res/model/mtn/Epsilon_m_06.mtn",
};
live2DModel = Live2DModelD3D::loadModel("L2res/model/model.moc");
live2DModel->setDevice(g_Device9) ;
// テクスチャのロード
for( int i = 0 ; i < 1 ; i++ ){
LPDIRECT3DTEXTURE9 tex ;
// テクスチャ画像をDirextXでの表示用に変換
if( FAILED( D3DXCreateTextureFromFileExW( g_Device9
, TEXTURES[i]
, 0 //width
, 0 //height
, 0 //mipmap //( 0なら完全なミップマップチェーン)
, 0 //Usage
, D3DFMT_A8R8G8B8
, D3DPOOL_DEFAULT
, D3DX_FILTER_LINEAR
, D3DX_FILTER_BOX
, 0
, NULL
, NULL
, &tex ) ) )
{
live2d::UtDebug::print( "Could not create texture" );
return false ;
}
else
{
// 変換が成功したらセット
live2DModel->setTexture( i , tex ) ;
}
}
//EBM.setParam(live2DModel);
motion[0] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_01.mtn");
motion[1] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_02.mtn");
motion[2] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_03.mtn");
motion[3] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_04.mtn");
motion[4] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_05.mtn");
motion[5] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_06.mtn");
for(int i = 0;i < 6 ;i++)
{
//motion[i]->setLoop(true);
motion[i]->setLoopFadeIn(false);
}
MQM = new MotionQueueManager();
mtn_num = 0;
Physics = Physics->load("L2res/model/physics.json");
MQM->startMotion(motion[mtn_num],false);
return true;
}