トップページ > 記事閲覧
3.15eの不具合
名前:Tir 日時: 2015/12/08 22:12

最新版のDXライブラリを試したところ 以下のようなプログラムで以前のバージョンと描画の仕方が変わってしまう不具合を見つけたので報告します #include "DxLib.h" #include <math.h> #define PI 3.1415926535897932384626433832795 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); int handle[2], i; int Charcter=0; int MoveFrame=0; int MoveFlag=0; VERTEX3D CharcterVertex[12]; VECTOR RCAngle; RCAngle.x=0.f; RCAngle.y=0.f; RCAngle.z=0.f; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; handle[0] = LoadGraph("test1.bmp");//表 handle[1] = LoadGraph("test6.bmp");//裏 for(i = 0; i < 12; ++i) { CharcterVertex[i].dif=GetColorU8(255,255,255,255); CharcterVertex[i].spc=GetColorU8(0,0,0,0); CharcterVertex[i].sv=0.f; } CharcterVertex[0].u=0.f; CharcterVertex[0].v=0.f; CharcterVertex[1].u=(246.5f)/(256.f); CharcterVertex[1].v=0.f; CharcterVertex[2].u=0.f; CharcterVertex[2].v=(374.f)/(512.f); CharcterVertex[3].u=(246.5f)/(256.f); CharcterVertex[3].v=(374.f)/(512.f); CharcterVertex[4]=CharcterVertex[2]; CharcterVertex[5]=CharcterVertex[1]; SetUseCullingFlag( TRUE ); //SetUseBackCulling(DX_CULLING_LEFT); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ(ESCキーが押されたらループを抜ける) while( ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 ) { // 画面のクリア ClearDrawScreen() ; if(MoveFrame==0){ if(CheckHitKey(KEY_INPUT_LEFT)==1){ MoveFrame=12;//移動フレーム MoveFlag=0; } if(CheckHitKey(KEY_INPUT_RIGHT)==1){ MoveFrame=12;//移動フレーム MoveFlag=1; } } if(MoveFrame>0){ if(MoveFlag==1){ RCAngle.y+=DX_PI_F/12; }else{ RCAngle.y-=DX_PI_F/12; } if(MoveFrame==6) Charcter=!Charcter; MoveFrame--; } MATRIX TransformMatrix ; SetUseLighting(false) ; SetDrawBright( 255,255,255 ); SetDrawMode( DX_DRAWMODE_BILINEAR ); SetDrawBlendMode( DX_BLENDMODE_ALPHA,255); // 回転( x, y, z軸回転の順 )+座標移動行列の作成 TransformMatrix = MGetRotX( RCAngle.x ) ; TransformMatrix = MMult( TransformMatrix, MGetRotY( RCAngle.y ) ) ; TransformMatrix = MMult( TransformMatrix, MGetRotZ( RCAngle.z ) ) ; TransformMatrix = MMult( TransformMatrix, MGetTranslate( VGet( 320.f, 240.f, 0.0f) ) ) ; // 行列を使ってワールド座標を算出 CharcterVertex[ 0 ].pos = VTransform( VGet( -123.25f, 187.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 1 ].pos = VTransform( VGet( 123.25f, 187.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 2 ].pos = VTransform( VGet( -123.25f, -187.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 3 ].pos = VTransform( VGet( 123.25f, -187.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 4 ].pos = CharcterVertex[ 2 ].pos ; CharcterVertex[ 5 ].pos = CharcterVertex[ 1 ].pos ; // 行列を使って法線を算出 CharcterVertex[ 0 ].norm = VTransformSR( VGet( 0.0f, 0.0f, -1.0f ), TransformMatrix ) ; CharcterVertex[ 1 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 2 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 3 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 4 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 5 ].norm = CharcterVertex[ 0 ].norm ; if(Charcter==0) DrawPolygon3D( &CharcterVertex[0], 2, handle[0], true ); else DrawPolygon3D( &CharcterVertex[0], 2, handle[1], true ); CharcterVertex[6] = CharcterVertex[0]; CharcterVertex[7] = CharcterVertex[1]; CharcterVertex[8] = CharcterVertex[2]; CharcterVertex[9] = CharcterVertex[3]; CharcterVertex[6].pos = CharcterVertex[1].pos; CharcterVertex[7].pos = CharcterVertex[0].pos; CharcterVertex[8].pos = CharcterVertex[3].pos; CharcterVertex[9].pos = CharcterVertex[2].pos; CharcterVertex[10] = CharcterVertex[8]; CharcterVertex[11] = CharcterVertex[7]; if(Charcter==0) DrawPolygon3D( &CharcterVertex[6], 2, handle[0], true ); else DrawPolygon3D( &CharcterVertex[6], 2, handle[1], true ); SetDrawMode(DX_DRAWMODE_NEAREST); ScreenFlip(); } DxLib_End() ; return 0 ; }
メンテ

Page: 1 |

Re: 3.15eの不具合 ( No.1 )
名前:管理人 日時:2015/12/09 00:22

載せていただいたプログラムで以前のバージョンとの描画結果の違いを確認しました ただ、こちらは仕様となります 関数リファレンスの DrawPolygon3D の解説にあります通り、DrawPolygon3D で使用する グラフィックハンドルの画像のサイズは 2 の n乗サイズである必要があります もし 2 の n乗サイズ以外の画像を使用される場合は、DXライブラリのバージョンや プログラムを実行するPCの環境によってグラフィックハンドルが使用するテクスチャのサイズが 変化しますので、非公開関数の GetGraphTextureSize を使用してどのようなテクスチャサイズを 使用していても同じ描画結果が得られるようなプログラムにする必要があります 載せていただいたプログラムを GetGraphSize と GetGraphTextureSize を使用して バージョンや環境が異なっても同じ描画結果が得られるようにしてみましたので、 よろしければご覧ください m(_ _)m #include "DxLib.h" #include <math.h> #define PI 3.1415926535897932384626433832795 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); int handle[2], i; int GraphSizeX[2]; int GraphSizeY[2]; int GraphTextureSizeX[2]; int GraphTextureSizeY[2]; int Charcter=0; int MoveFrame=0; int MoveFlag=0; VERTEX3D CharcterVertex[12]; VECTOR RCAngle; RCAngle.x=0.f; RCAngle.y=0.f; RCAngle.z=0.f; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; handle[0] = LoadGraph("test1.bmp");//表 handle[1] = LoadGraph("test6.bmp");//裏 for(i = 0;i < 2; ++i) { GetGraphSize( handle[i], &GraphSizeX[i], &GraphSizeY[i] ); GetGraphTextureSize( handle[i], &GraphTextureSizeX[i], &GraphTextureSizeY[i] ); } for(i = 0; i < 12; ++i) { CharcterVertex[i].dif=GetColorU8(255,255,255,255); CharcterVertex[i].spc=GetColorU8(0,0,0,0); CharcterVertex[i].sv=0.f; } SetUseCullingFlag( TRUE ); //SetUseBackCulling(DX_CULLING_LEFT); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ(ESCキーが押されたらループを抜ける) while( ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 ) { // 画面のクリア ClearDrawScreen() ; if(MoveFrame==0){ if(CheckHitKey(KEY_INPUT_LEFT)==1){ MoveFrame=12;//移動フレーム MoveFlag=0; } if(CheckHitKey(KEY_INPUT_RIGHT)==1){ MoveFrame=12;//移動フレーム MoveFlag=1; } } if(MoveFrame>0){ if(MoveFlag==1){ RCAngle.y+=DX_PI_F/12; }else{ RCAngle.y-=DX_PI_F/12; } if(MoveFrame==6) Charcter=!Charcter; MoveFrame--; } MATRIX TransformMatrix ; SetUseLighting(false) ; SetDrawBright( 255,255,255 ); SetDrawMode( DX_DRAWMODE_BILINEAR ); SetDrawBlendMode( DX_BLENDMODE_ALPHA,255); // 回転( x, y, z軸回転の順 )+座標移動行列の作成 TransformMatrix = MGetRotX( RCAngle.x ) ; TransformMatrix = MMult( TransformMatrix, MGetRotY( RCAngle.y ) ) ; TransformMatrix = MMult( TransformMatrix, MGetRotZ( RCAngle.z ) ) ; TransformMatrix = MMult( TransformMatrix, MGetTranslate( VGet( 320.f, 240.f, 0.0f) ) ) ; // 行列を使ってワールド座標を算出 CharcterVertex[ 0 ].pos = VTransform( VGet( -GraphSizeX[Charcter]/2.0f, GraphSizeY[Charcter]/2.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 1 ].pos = VTransform( VGet( GraphSizeX[Charcter]/2.0f, GraphSizeY[Charcter]/2.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 2 ].pos = VTransform( VGet( -GraphSizeX[Charcter]/2.0f, -GraphSizeY[Charcter]/2.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 3 ].pos = VTransform( VGet( GraphSizeX[Charcter]/2.0f, -GraphSizeY[Charcter]/2.0f, 0 ), TransformMatrix ) ; CharcterVertex[ 4 ].pos = CharcterVertex[ 2 ].pos ; CharcterVertex[ 5 ].pos = CharcterVertex[ 1 ].pos ; CharcterVertex[0].u=0.f; CharcterVertex[0].v=0.f; CharcterVertex[1].u=(float)GraphSizeX[Charcter]/GraphTextureSizeX[Charcter]; CharcterVertex[1].v=0.f; CharcterVertex[2].u=0.f; CharcterVertex[2].v=(float)GraphSizeY[Charcter]/GraphTextureSizeY[Charcter]; CharcterVertex[3].u=(float)GraphSizeX[Charcter]/GraphTextureSizeX[Charcter]; CharcterVertex[3].v=(float)GraphSizeY[Charcter]/GraphTextureSizeY[Charcter]; CharcterVertex[4]=CharcterVertex[2]; CharcterVertex[5]=CharcterVertex[1]; // 行列を使って法線を算出 CharcterVertex[ 0 ].norm = VTransformSR( VGet( 0.0f, 0.0f, -1.0f ), TransformMatrix ) ; CharcterVertex[ 1 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 2 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 3 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 4 ].norm = CharcterVertex[ 0 ].norm ; CharcterVertex[ 5 ].norm = CharcterVertex[ 0 ].norm ; if(Charcter==0) DrawPolygon3D( &CharcterVertex[0], 2, handle[0], true ); else DrawPolygon3D( &CharcterVertex[0], 2, handle[1], true ); CharcterVertex[6] = CharcterVertex[0]; CharcterVertex[7] = CharcterVertex[1]; CharcterVertex[8] = CharcterVertex[2]; CharcterVertex[9] = CharcterVertex[3]; CharcterVertex[6].pos = CharcterVertex[1].pos; CharcterVertex[7].pos = CharcterVertex[0].pos; CharcterVertex[8].pos = CharcterVertex[3].pos; CharcterVertex[9].pos = CharcterVertex[2].pos; CharcterVertex[10] = CharcterVertex[8]; CharcterVertex[11] = CharcterVertex[7]; if(Charcter==0) DrawPolygon3D( &CharcterVertex[6], 2, handle[0], true ); else DrawPolygon3D( &CharcterVertex[6], 2, handle[1], true ); SetDrawMode(DX_DRAWMODE_NEAREST); ScreenFlip(); } DxLib_End() ; return 0 ; }
メンテ
Re: 3.15eの不具合 ( No.2 )
名前:Tir(解決) 日時:2015/12/09 01:27

回答ありがとうございます。 これからは中途半端なサイズの画像でも できるだけ既定のサイズに合わせてから読み込むことにします
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存