非公開関数の DrawPolygon を使用すれば実現できると思います
// 2Dポリゴンを描画する
int DrawPolygon(
VERTEX *Vertex, // 描画するポリゴンを形成する頂点配列の先頭アドレス、PolygonNum * 3 個の長さが必要
int PolygonNum, // 描画するポリゴンの数
int GrHandle, // 描画する画像、幅・高さは2のn乗である必要があります
int TransFlag // 透過色処理を使用するかどうか( TRUE:使用する FALSE:使用しない )
) ;
この関数では VERTEX という構造体を使用します
struct VERTEX
{
float x, y ; // スクリーン座標
float u, v ; // テクスチャ座標
unsigned char b, g, r, a ; // 色
} ;
テクスチャ座標で描画する画像のどの部分を使用するかを指定できます
ただ、指定の仕方はピクセル単位ではなくて描画する画像の端から端までを
0.0〜1.0 で指定します
こちらのサンプルでは「サンプルプログラム実行用フォルダ」の中に入っている
TexAddrTransfTest.bmp( 左から順に64x64サイズの □○△× が描かれている画像 )
の□の部分だけを三角形ポリゴン二つを使用して描画しています
よろしければご覧下さい
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX Vert[ 6 ] ;
int GrHandle, SizeX, SizeY ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 画像の読みこみ
GrHandle = LoadGraph( "TexAddrTransfTest.bmp" ) ;
// 画像の幅と高さを取得する
GetGraphSize( GrHandle, &SizeX, &SizeY ) ;
// ポリゴン二つ分の頂点データを初期化する
// 左上の頂点( 一つ目のポリゴン )
Vert[ 0 ].x = 0 ;
Vert[ 0 ].y = 0 ;
Vert[ 0 ].u = 0.0f / SizeX ;
Vert[ 0 ].v = 0.0f ;
Vert[ 0 ].r = 255 ;
Vert[ 0 ].g = 255 ;
Vert[ 0 ].b = 255 ;
Vert[ 0 ].a = 255 ;
// 右上の頂点( 一つ目のポリゴン )
Vert[ 1 ].x = 64 ;
Vert[ 1 ].y = 0 ;
Vert[ 1 ].u = 64.0f / SizeX ;
Vert[ 1 ].v = 0.0f ;
Vert[ 1 ].r = 255 ;
Vert[ 1 ].g = 255 ;
Vert[ 1 ].b = 255 ;
Vert[ 1 ].a = 255 ;
// 左下の頂点( 一つ目のポリゴン )
Vert[ 2 ].x = 0 ;
Vert[ 2 ].y = 64 ;
Vert[ 2 ].u = 0.0f ;
Vert[ 2 ].v = 64.0f / SizeY ;
Vert[ 2 ].r = 255 ;
Vert[ 2 ].g = 255 ;
Vert[ 2 ].b = 255 ;
Vert[ 2 ].a = 255 ;
// 右下の頂点( 二つ目のポリゴン )
Vert[ 3 ].x = 64 ;
Vert[ 3 ].y = 64 ;
Vert[ 3 ].u = 64.0f / SizeX ;
Vert[ 3 ].v = 64.0f / SizeY ;
Vert[ 3 ].r = 255 ;
Vert[ 3 ].g = 255 ;
Vert[ 3 ].b = 255 ;
Vert[ 3 ].a = 255 ;
Vert[ 4 ] = Vert[ 2 ] ; // 左下の頂点をコピー( 二つ目のポリゴン )
Vert[ 5 ] = Vert[ 1 ] ; // 右下の頂点をコピー( 二つ目のポリゴン )
// ポリゴン二つを描画する
DrawPolygon( Vert, 2, GrHandle, FALSE ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}