DXライブラリを使ってなんでも対応できる描画関数を作ろうと思います。 ・Draw(x1,y1,x2,y2,x3,y3,x4,y4BMP,color,turn,center,rot); x1・・・描画座標X y1・・・描画座標Y x2・・・読み込んだ画像の切り取り開始位置 y2・・・読み込んだ画像の切り取り開始位置 x3・・・切り取るサイズ 32ならx2~32ドットの切り取り y3・・・切り取るサイズ x4・・・X軸に対しての拡大率 y4・・・Y軸に対しての拡大率 BMP・・・読み込む画像 color・・・カラー turn・・・LR反転 center・・・0なら原点左上、1なら中心 rot・・・原点を中心とした回転角度 またcolorなのですがRGB(R,G,B)ではなく透過を設定できるようにARGB(A,R,G,B)にしたいです。 どのようにすればよいのでしょうか?
DXライブラリを使ってなんでも対応できる描画関数
DXライブラリを使ってなんでも対応できる描画関数
Re:DXライブラリを使ってなんでも対応できる描画関数
全部書くと長いので簡単に処理手順を。
まず、BMPは画像じゃなくてグラフィックハンドルが良いですね。
1.対象グラフィックのサイズを取得( w, h )
2.「x2==0 && y2==0 && x3==w && y4==h」以外の時
「DerivationGraph」関数を使って切り取ったグラフィックハンドルを作成して差し替える
3.center==0ならx1,y1を左上に、1なら中心として矩形の4隅の座標を取得する
4.「rot」が「0.0」以外の時、矩形の中心から4隅の座標を回転させる
5.LR反転なら4隅の座標の左上・右上、左下・右下にあたる座標を入れ替える
6.SetDrawBlendMode( DX_BLENDMODE_ALPHA, ( color>>24 ) )
7.SetDrawBright( color ) // それぞれ赤、青、緑の引数にする
8.DrawModiGraphで描画する
9.ブレンドと輝度設定を戻す
10.切り取ったグラフィックハンドルを使用した場合DeleteGraphで削除
こんな手順でやりたいことが出来ると思います。
まず、BMPは画像じゃなくてグラフィックハンドルが良いですね。
1.対象グラフィックのサイズを取得( w, h )
2.「x2==0 && y2==0 && x3==w && y4==h」以外の時
「DerivationGraph」関数を使って切り取ったグラフィックハンドルを作成して差し替える
3.center==0ならx1,y1を左上に、1なら中心として矩形の4隅の座標を取得する
4.「rot」が「0.0」以外の時、矩形の中心から4隅の座標を回転させる
5.LR反転なら4隅の座標の左上・右上、左下・右下にあたる座標を入れ替える
6.SetDrawBlendMode( DX_BLENDMODE_ALPHA, ( color>>24 ) )
7.SetDrawBright( color ) // それぞれ赤、青、緑の引数にする
8.DrawModiGraphで描画する
9.ブレンドと輝度設定を戻す
10.切り取ったグラフィックハンドルを使用した場合DeleteGraphで削除
こんな手順でやりたいことが出来ると思います。
Re:DXライブラリを使ってなんでも対応できる描画関数
ねこs
ご回答ありがとうございます。
何とか自分でやってみたのですが
4のrotでの座標回転
6のシフト演算(引数に渡すときどうやって4桁渡すのか?)
8の描画座標の取得(変数の名前が悪いと思うのですが理解しにくい)
が現在の問題点です。
ねこsのアドバイスをもとに作ったソースを載せさせていただきます。
ご回答ありがとうございます。
何とか自分でやってみたのですが
4のrotでの座標回転
6のシフト演算(引数に渡すときどうやって4桁渡すのか?)
8の描画座標の取得(変数の名前が悪いと思うのですが理解しにくい)
が現在の問題点です。
ねこsのアドバイスをもとに作ったソースを載せさせていただきます。
void Draw(int x1,int y1,int x2,int y2,int x3,int y3,int Zx,int Zy,int BMP,int color,bool turn,bool center,int rot){ int SizeX,SizeY; // 画像の切り取りサイズ int xLeft,xRight,yLeft,yRight; // 描画座標 GetGraphSize(BMP,&SizeX,&SizeY); // グラフィックのサイズの取得 if(x2==0 && y2==0 && x3==SizeX && y3==SizeY){ }else{ BMP = DerivationGraph(y1,y2,x3,y3,BMP); } // 各座標の取得 if(center == true){ xLeft = x1+SizeX/2; xRight = x2-SizeX/2; yLeft = y1+SizeY/2; yRight = y2-SizeY/2; }else{ xLeft = x1; xRight = x2; yLeft = y1; yRight = y2; } // 各座標の回転 90などといれる角度の方 ディグリー角? if(rot != 0){ xLeft = xLeft; xRight = xRight; yLeft = yLeft; yRight = yRight; } // LRフラグがtrueなら各座標の反転 if(turn == true){ int tx,ty; tx = xLeft; xLeft = xRight; xRight = tx; //上下反転 //ty = yLeft; //yLeft = yRight; //yRight = ty; } SetDrawBlendMode(DX_BLENDMODE_ALPHA,( color>>24 )); SetDrawBright(color); if(center == true){ DrawModiGraph(?); }else{ DrawModiGraph(?); } SetDrawBright(255,255,255); //DeleteGraph(BMP); }
Re:DXライブラリを使ってなんでも対応できる描画関数
4
回転は下記のような計算で求められます。
1.中心から対象座標への角度・距離を求める
2.求めた角度へ回転分加算した角度を求める
3.中心から2で求めた角度へ1で求めた距離分加算する
6
SetDrawBright(color);
↓
SetDrawBright( ( color & 0xFF0000 ) >> 16, ( color & 0x00FF00 ) >> 8, ( color & 0x0000FF ) );
8
まず名目上「Left」「Right」「Top」「Bottom(底)」とした方が良いでしょうね。
yLeft⇒Top yRight⇒Bottom
DrawModiGraph( Left, Top, Right, Top, Right, Bottom, Left, Bottom, ~ )
後、DeleteGraphなのですが、「切り取ったグラフィックハンドルを使った」ってフラグを1個作ってフラグがONの時にのみ実行すると良いです。
最後にSetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );もお忘れなく。
回転は下記のような計算で求められます。
1.中心から対象座標への角度・距離を求める
2.求めた角度へ回転分加算した角度を求める
3.中心から2で求めた角度へ1で求めた距離分加算する
6
SetDrawBright(color);
↓
SetDrawBright( ( color & 0xFF0000 ) >> 16, ( color & 0x00FF00 ) >> 8, ( color & 0x0000FF ) );
8
まず名目上「Left」「Right」「Top」「Bottom(底)」とした方が良いでしょうね。
yLeft⇒Top yRight⇒Bottom
DrawModiGraph( Left, Top, Right, Top, Right, Bottom, Left, Bottom, ~ )
後、DeleteGraphなのですが、「切り取ったグラフィックハンドルを使った」ってフラグを1個作ってフラグがONの時にのみ実行すると良いです。
最後にSetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );もお忘れなく。
Re:DXライブラリを使ってなんでも対応できる描画関数
描画がうまくいきません。
※棒線でノイズが走ります。
回転角度の4についてよくわからないです・・・。
現在のソースを載せさせていただきます。
Draw(320,240,5,5,10,10,1,1,LoadGraph("BMP/chr.png"),RGB(255,255,255),false,false,0);
※棒線でノイズが走ります。
回転角度の4についてよくわからないです・・・。
現在のソースを載せさせていただきます。
void Draw(int x1,int y1,int x2,int y2,int x3,int y3,int Zx,int Zy,int BMP,int color,bool turn,bool center,int rot){ int SizeX,SizeY; // 画像の切り取りサイズ int Left,Right,Top,Bottom; // 描画座標 int hGraph; GetGraphSize(BMP,&SizeX,&SizeY); // グラフィックのサイズの取得 if(x2==0 && y2==0 && x3==SizeX && y3==SizeY){ }else{ hGraph = DerivationGraph(y1,y2,x3,y3,BMP); } // 各座標の取得 if(center == true){ Left = x1+SizeX/2; Right = x2-SizeX/2; Top = y1+SizeY/2; Bottom = y2-SizeY/2; }else{ Left = x1; Right = x2; Top = y1; Bottom = y2; } // 各座標の回転 90などといれる角度の方 ディグリー角? if(rot != 0){ Left = Left; Right = Right; Top = Top; Bottom = Bottom; } // LRフラグがtrueなら各座標の反転 if(turn == true){ int tx,ty; tx = Left; Left = Right; Right = tx; //上下反転 ty = Top; //yTop = yBottom; //yBottom = ty; } SetDrawBlendMode(DX_BLENDMODE_ALPHA,( color>>24 )); SetDrawBright( ( color & 0xFF0000 ) >> 16, ( color & 0x00FF00 ) >> 8, ( color & 0x0000FF ) ); if(center == true){ DrawModiGraph( Left-SizeX/2, Top-SizeY/2, Right+SizeX/2, Top-SizeY/2, Right+SizeX/2, Bottom+SizeY/2, Left-SizeX/2, Bottom+SizeY/2, hGraph , true); }else{ DrawModiGraph( Left, Top, Right, Top, Right, Bottom, Left, Bottom, hGraph , true); } SetDrawBright(255,255,255); SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ); DeleteGraph(hGraph); }使用時
Draw(320,240,5,5,10,10,1,1,LoadGraph("BMP/chr.png"),RGB(255,255,255),false,false,0);
Re:DXライブラリを使ってなんでも対応できる描画関数
まったくわき道にそれるのですが、座標移動の公式みたいなのがあるんです。これって利用できませんか?
移動前の座標を x,y 移動後の座標を X,Y とすると
X = ax + cy + e
Y = bx + dy + f
って感じだったはず(うろ覚えですいません
たとえば、原点を中心として、xyをそれぞれn倍するときは
X = nx + 0y + 0
Y = 0x + ny + 0
と書けますし、xyを入れ替えて、+1ずつ移動する場合は
X = 0x + y + 1
Y = x + 0y + 1
とかけると思います
また、原点を中心として u度 回転する場合も
X = cos(u)x - sin(u)y + 0
Y = sin(u)x + cos(u)y + 0
で出せる(はず・・・
もし使えそうならどうぞ
移動前の座標を x,y 移動後の座標を X,Y とすると
X = ax + cy + e
Y = bx + dy + f
って感じだったはず(うろ覚えですいません
たとえば、原点を中心として、xyをそれぞれn倍するときは
X = nx + 0y + 0
Y = 0x + ny + 0
と書けますし、xyを入れ替えて、+1ずつ移動する場合は
X = 0x + y + 1
Y = x + 0y + 1
とかけると思います
また、原点を中心として u度 回転する場合も
X = cos(u)x - sin(u)y + 0
Y = sin(u)x + cos(u)y + 0
で出せる(はず・・・
もし使えそうならどうぞ
Re:DXライブラリを使ってなんでも対応できる描画関数
横から失礼します
なんでも対応できると言う事ですが
DrawRotaGraph2関数に対応していない気がするのですが・・
なんでも対応できると言う事ですが
DrawRotaGraph2関数に対応していない気がするのですが・・
Re:DXライブラリを使ってなんでも対応できる描画関数
座標回転については「旅人」さんの手順でいけると思います。
「座標回転」等でググると図解入りで分かりやすい解説があると思いますのでそちらを参考にしたほうが良いかなと。
>チルチルさん
x4,y4使ってませんでしたね、失礼。
これらは矩形4点を求める際の係数とすればいけると思います。
「座標回転」等でググると図解入りで分かりやすい解説があると思いますのでそちらを参考にしたほうが良いかなと。
>チルチルさん
x4,y4使ってませんでしたね、失礼。
これらは矩形4点を求める際の係数とすればいけると思います。
Re:DXライブラリを使ってなんでも対応できる描画関数
遅くなりすみません><
みなさまありがとうございます。
今、仕事が忙しくて試している暇がありません。
今週の土曜になりましたら試してみたいと思います。
よろしくお願いいたします。
みなさまありがとうございます。
今、仕事が忙しくて試している暇がありません。
今週の土曜になりましたら試してみたいと思います。
よろしくお願いいたします。
Re:DXライブラリを使ってなんでも対応できる描画関数
すみません。
今、いろいろといじってみたのですが
Left~などとしているため一個いじったら1つの点しか正確な値がとれないかと思います。
4つの点ごとにxy情報を保存できる変数を作らないとだめなのでしょうか?
またノイズが走るのはなぜなのでしょうか・・・?
今、いろいろといじってみたのですが
Left~などとしているため一個いじったら1つの点しか正確な値がとれないかと思います。
4つの点ごとにxy情報を保存できる変数を作らないとだめなのでしょうか?
またノイズが走るのはなぜなのでしょうか・・・?
Re:DXライブラリを使ってなんでも対応できる描画関数
ノイズは私のミスでした・・・
フリップした後に描画していました・・・
また透過の処理のコメントをとると表示されなくなってしまいます。
どなたか教えていただけないですか。
フリップした後に描画していました・・・
また透過の処理のコメントをとると表示されなくなってしまいます。
どなたか教えていただけないですか。
void Draw(int x1,int y1,int x2,int y2,int x3,int y3,int Zx,int Zy,int BMP,int color,bool turn,bool center,int rot){ int SizeX,SizeY; // 画像の切り取りサイズ int Left,Right,Top,Bottom; // 描画座標 int hGraph = BMP; GetGraphSize(BMP,&SizeX,&SizeY); // グラフィックのサイズの取得 if(x2==0 && y2==0 && x3==SizeX && y3==SizeY){ }else{ hGraph = DerivationGraph(x2,y2,x3,y3,BMP); } // 各座標の取得 if(center == true){ Left = x1+SizeX/2; Right = x2-SizeX/2; Top = y1+SizeY/2; Bottom = y2-SizeY/2; }else{ Left = x1; Right = x2; Top = y1; Bottom = y2; } // 各座標の回転 90などといれる角度の方 ディグリー角? if(rot != 0){ Left = Left; Right = Right; Top = Top; Bottom = Bottom; } // LRフラグがtrueなら各座標の反転 if(turn == true){ int tx,ty; tx = Left; Left = Right; Right = tx; //上下反転 ty = Top; //yTop = yBottom; //yBottom = ty; } // SetDrawBlendMode(DX_BLENDMODE_ALPHA,( color>>24 )); SetDrawBright( ( color & 0xFF0000 ) >> 16, ( color & 0x00FF00 ) >> 8, ( color & 0x0000FF ) ); DrawModiGraph( 0 , 0 , 32 , 0 , 32 , 32 , 0 , 32 , hGraph , true ) ; SetDrawBright(255,255,255); SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ); // DeleteGraph(hGraph);
Re:DXライブラリを使ってなんでも対応できる描画関数
>また透過の処理のコメントをとると表示されなくなってしまいます
引数 colorの値がどうなっているかにもよりますが、
仮に 0xffffffffとか 0x80000000などが入っていた場合、color>>24の結果は負になりますので、
SetDrawBlendMode関数内部で自動的に 0とみなされる可能性があります。
もしそうだとすると、アルファの値が0では表示しても目には見えないことになります。
Re:DXライブラリを使ってなんでも対応できる描画関数
0xffffffffとかいていたのですがだめなのでしょうか・・・
ちなみに255と直接コメントアウトしている部分に入れたところ表示されましたので
使うときが原因みたいです。
また座標変換についてうまくできないのですが
教えて頂けないでしょうか?
ちなみに255と直接コメントアウトしている部分に入れたところ表示されましたので
使うときが原因みたいです。
また座標変換についてうまくできないのですが
教えて頂けないでしょうか?
Re:DXライブラリを使ってなんでも対応できる描画関数
>0xffffffffとかいていたのですがだめなのでしょうか・
colorを intではなく unsigned intにすれば負にはならなくなります。
Re:DXライブラリを使ってなんでも対応できる描画関数
// X座標、Y座標、中心座標X、中心座標Y、回転角度、受け取る座標X、受け取る座標Y void CalcRotatePnt( double x, double y, double cx, double cy, double dRad, double* px, double* py ) { // 角度と距離を計算 double dBaseRad = atan2( y - cy, x - cx ); double dBaseLen = sqrt( pow( x - cx, 2.0 ) + pow( y - cy, 2.0 ) ); // 座標を計算 double rx = cx + cos( dBaseRad + dRad ) * dBaseLen; double ry = cy + sin( dBaseRad + dRad ) * dBaseLne; // ポインタ変数に設定 *px = rx; *py = ry; } こんな風にして使ってください。 double rx = 0.0, ry = 0.0; Calc( x, y, cx, cy, 30.0, &rx, &ry ); // rx, ryに回転後の座標が入る
Re:DXライブラリを使ってなんでも対応できる描画関数
>>justyさん
透過できました。
ありがとうございます。
また座標取得用の構造体を作ったのですがこれを使った方がよいのでしょうか?
(LEFTだけでは分かりにくいため)
申し訳ないのですが座標変換についていろいろ調べてはみたのですが
よくわかりませんでした。
できれば以下のソースを修正してはいただけないでしょうか?
透過できました。
ありがとうございます。
また座標取得用の構造体を作ったのですがこれを使った方がよいのでしょうか?
(LEFTだけでは分かりにくいため)
申し訳ないのですが座標変換についていろいろ調べてはみたのですが
よくわかりませんでした。
できれば以下のソースを修正してはいただけないでしょうか?
typedef struct{ int x,y; }XY; void Draw(int x1,int y1,int x2,int y2,int x3,int y3,int Zx,int Zy,int BMP,unsigned int color,bool turn,bool center,int rot){ XY Size; int Left,Right,Top,Bottom; // 描画座標 int hGraph = BMP; GetGraphSize(BMP,&Size.x,&Size.y); // グラフィックのサイズの取得 if(x2==0 && y2==0 && x3==Size.x && y3==Size.y){ }else{ hGraph = DerivationGraph(x2,y2,x3,y3,BMP); } // 各座標の取得 if(center == true){ Left = x1+Size.x/2; Right = x2-Size.x/2; Top = y1+Size.y/2; Bottom = y2-Size.y/2; }else{ Left = x1; Right = x2; Top = y1; Bottom = y2; } // 各座標の回転 90などといれる角度の方 ディグリー角? if(rot != 0){ Left = Left; Right = Right; Top = Top; Bottom = Bottom; } // LRフラグがtrueなら各座標の反転 if(turn == true){ int tx,ty; tx = Left; Left = Right; Right = tx; //上下反転 ty = Top; //yTop = yBottom; //yBottom = ty; } SetDrawBlendMode(DX_BLENDMODE_ALPHA,( color>>24 )); SetDrawBright( ( color & 0xFF0000 ) >> 16, ( color & 0x00FF00 ) >> 8, ( color & 0x0000FF ) ); DrawModiGraph( 0 , 0 , 32 , 0 , 32 , 32 , 0 , 32 , hGraph , true ) ; SetDrawBright(255,255,255); SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ); DeleteGraph(hGraph); }
Re:DXライブラリを使ってなんでも対応できる描画関数
あ、しまった。角度の引数はラジアン値なので、以下のように度数から変換して下さい。
( A / 180.0 * M_PI ); // Aのところに角度指定
( A / 180.0 * M_PI ); // Aのところに角度指定
Re:DXライブラリを使ってなんでも対応できる描画関数
>座標取得用の構造体を作ったのですがこれを使った方がよいのでしょうか
どういうものかは見ていないのでわかりませんが、xと yなどの必ず対になるものは
構造体などに纏めるのはいいと思います。
>できれば以下のソースを修正してはいただけないでしょうか?
修正云々とかの前に、いろいろ問題と質問と提案があります。
□ 画像の切り抜きとかブレンドなどは別にしてDrawRotaGraph()とか DrawRotaGraph2()では
代用できないのですか?
回転とか反転とかは機能がかぶってます。
□ hGraphを破棄している
DerivationGraph()で新規に作った場合はともかく、中身が引数 BMPだった場合、
引数として与えられた画像を破棄してしまうことになります。
これは意図した通りですか?
□ GetGraphSizeで画像の大きさを取得していますが、DerivationGraphで切り抜いた場合の
画像サイズではないので、表示位置とか中央表示を行うと位置がずれそうです。
□ 個人的な意見ですが、DrawModiGraphの後は、デフォルトの輝度とブレンドモードに
戻すのではなく、関数が呼ばれる前の状態に戻した方が自然かと思います。
□ 引数の数が多すぎませんか?
実際に使う際にはさらにラッパー関数を作るのかもしれませんが、
クラス化できるならクラス化を、そうでないなら引数の全部もしくは一部を構造体に纏めるなど、
情報を纏めた方がいいように思います。
□ 切り取り機能を持たせていますが、これは必要ですか?
UVアニメーションをガンガン使っていきたいという用途であればまだいいのかもしれませんが、
関数を呼ぶ度に新規にグラフィックハンドルを作成し破棄するのは少しコストが高い気がします。
この関数の中ではなく、外で切り取り済みのグラフィックスハンドルを作っておいて
そちらで管理した方がいいのではないでしょうか?
Re:DXライブラリを使ってなんでも対応できる描画関数
ご回答ありがとうございます。
>>画像の切り抜きとかブレンドなどは別にしてDrawRotaGraph()とか DrawRotaGraph2()では
>>代用できないのですか?
DrawRotaGraph()
DrawRotaGraph2()
と書いてしまったら別々の画像が描画されてしまわないでしょうか?
といいますのも回転と反転を同時に行う場合に対応できるのでしょうか・・・
>>hGraphを破棄している
hGraphを破棄しているだけでBMP自体は破棄してはいないかと思うのですが
違うのでしょうか?
>>GetGraphSizeで画像の大きさを取得していますが、DerivationGraphで切り抜いた場合の
>>画像サイズではないので、表示位置とか中央表示を行うと位置がずれそうです。
そうなのですか・・・
これについてはよくわかりません・・・
>>個人的な意見ですが、DrawModiGraphの後は、デフォルトの輝度とブレンドモードに
>>戻すのではなく、関数が呼ばれる前の状態に戻した方が自然かと思います。
ここらへんも全く考えておりませんでした。
変更する前に輝度を取得する関数を使い戻すといった方法で
できるでしょうか?
>>引数の数が多すぎませんか?
確かに引数が多いのは私も感じております。
反転や原点等のフラグ情報は一個にまとめ0x1101みたいな感じで書いて
シフト演算をするようにしようかとも考えておりました。(今回のができたら変更しようかと)
表示位置xy
画像の切り取り開始位置xy
切り取るサイズxy
拡大率xy
読み込む画像
color・・・カラー
LR反転
原点の場所
回転角度
上記の設定ができる描画関数にしたいです。
>>切り取り機能を持たせていますが、これは必要ですか?
なるほど・・・
そのように考えたことはありませんでした。
今後アニメ画像を1枚のシートに作る時用に考えていたのですがあらかじめ
ハンドルをつくっておけばよいのですね・・・
そうしたら引数もかなり減らせそうです・・・。
お手数おかけしますがサンプルのソースを書いてはいただけないでしょうか?
自分ではあまりに非効率な書きかたすぎて参考になるものがみてみたいです・・・。
>>画像の切り抜きとかブレンドなどは別にしてDrawRotaGraph()とか DrawRotaGraph2()では
>>代用できないのですか?
DrawRotaGraph()
DrawRotaGraph2()
と書いてしまったら別々の画像が描画されてしまわないでしょうか?
といいますのも回転と反転を同時に行う場合に対応できるのでしょうか・・・
>>hGraphを破棄している
hGraphを破棄しているだけでBMP自体は破棄してはいないかと思うのですが
違うのでしょうか?
>>GetGraphSizeで画像の大きさを取得していますが、DerivationGraphで切り抜いた場合の
>>画像サイズではないので、表示位置とか中央表示を行うと位置がずれそうです。
そうなのですか・・・
これについてはよくわかりません・・・
>>個人的な意見ですが、DrawModiGraphの後は、デフォルトの輝度とブレンドモードに
>>戻すのではなく、関数が呼ばれる前の状態に戻した方が自然かと思います。
ここらへんも全く考えておりませんでした。
変更する前に輝度を取得する関数を使い戻すといった方法で
できるでしょうか?
>>引数の数が多すぎませんか?
確かに引数が多いのは私も感じております。
反転や原点等のフラグ情報は一個にまとめ0x1101みたいな感じで書いて
シフト演算をするようにしようかとも考えておりました。(今回のができたら変更しようかと)
表示位置xy
画像の切り取り開始位置xy
切り取るサイズxy
拡大率xy
読み込む画像
color・・・カラー
LR反転
原点の場所
回転角度
上記の設定ができる描画関数にしたいです。
>>切り取り機能を持たせていますが、これは必要ですか?
なるほど・・・
そのように考えたことはありませんでした。
今後アニメ画像を1枚のシートに作る時用に考えていたのですがあらかじめ
ハンドルをつくっておけばよいのですね・・・
そうしたら引数もかなり減らせそうです・・・。
お手数おかけしますがサンプルのソースを書いてはいただけないでしょうか?
自分ではあまりに非効率な書きかたすぎて参考になるものがみてみたいです・・・。
Re:DXライブラリを使ってなんでも対応できる描画関数
>別々の画像が描画されてしまわないでしょうか?
?
画像が別々かどうかはグラフィックスハンドル次第ですが、2回描画を呼び出しているので
2回描画されます。
>回転と反転を同時に行う場合に対応できるのでしょうか・
試してはいませんが、これらの関数にも TurnFlagの引数を持っていますので、
これを TRUEにすることで反転できると思います。
回転は勿論、引数 Angleです。
とはいえ、拡大率xyそれぞれには対応してないですね。
>>画像サイズではないので、表示位置とか中央表示を行うと位置がずれそうです
>これについてはよくわかりません
DerivationGraph()は新規に指定したサイズに合わせて画像ハンドルを作ります。
その画像ハンドルからサイズ情報を取り出し、中央の位置を計算しないと
表示位置がずれないか、ということです。
まぁ、切り抜き機能自体を削るのであればもう関係ない話になりますが。
>BMP自体は破棄してはいないかと思うのですが
よくみると冒頭で[color=#d0d0ff" face="sans-serif]int hGraph = BMP[/color] と hGraphを BMPで初期化しているので
この時点では hGraphは BMPそのものです。
グラフィックスの切り取りを行わない場合は hGraphはそのままになるので、
終了時に破棄されるのは BMPということになります。
>変更する前に輝度を取得する関数を使い戻すといった方法で
>できるでしょうか
可能です。
SetXXXXに対する GetXXXXが用意されています。
どっち(デフォルトの値に戻すか元の値に戻すか)がいいのかは
好みが分かれるところなので、お好みで。
>拡大率xy
>回転角度
このあたりは実に面倒なのですが拡大してから回転するのか、回転してから拡大するのか、を
引数で指定するか、どっちか一方に決めておかなければなりません。
正方形のテクスチャを [2, 1]の横長な拡大率で常に回転させた場合、
一方はラグビーボールのように回転に伴い長い方向が変化しますが、
もう一方は重い重量の荷物を積んで潰れたタイヤのように横長のまま絵の中身だけ回転します。
>LR反転
今気付きましたが、ひょっとするとこれ要らないかもしれませんね。
拡大率がラグビーボールのように動くのであれば、拡大率を負にすれば
同じことになります。
>非効率な書きかたすぎて参考になるものがみてみたいです・
あと少しですよ。
ねこさん作の CalcRotatePnt()を使えば回転はできるはずです。
もう少し頑張ってみて下さい。
Re:DXライブラリを使ってなんでも対応できる描画関数
前回からいろいろ変更してみました。
作っていただいた関数を使っているのですが
うまくいきません。
変な場所に表示されてしまいます。
折角作っていただいたのに申し訳ないです。
またたまにEscなどで終了させるとウインドウがあった位置だけが真っ黒くなり
どうやってもけせなくなるバグが起きてしまいます。
これは描画の仕方が悪いのでしょうか。
作っていただいた関数を使っているのですが
うまくいきません。
変な場所に表示されてしまいます。
折角作っていただいたのに申し訳ないです。
またたまにEscなどで終了させるとウインドウがあった位置だけが真っ黒くなり
どうやってもけせなくなるバグが起きてしまいます。
これは描画の仕方が悪いのでしょうか。
void Draw(int x1,int y1,int x2,int y2,int x3,int y3,int Zx,int Zy,int BMP,unsigned int color,bool turn,bool center,int rot){ XY Size; XY LeftUp,RightUp,LeftDown,RightDown; // 描画座標 int hGraph = BMP; bool DeleteF = false; GetGraphSize(BMP,&Size.x,&Size.y); // グラフィックのサイズの取得 if(x2==0 && y2==0 && x3==Size.x && y3==Size.y){ }else{ hGraph = DerivationGraph(x2,y2,x3,y3,BMP); DeleteF = true; } // 各座標の取得 if(center == true){ LeftUp.x = x1-Size.x/2; LeftUp.y = y1-Size.y/2; RightUp.x = x1+Size.x/2; RightUp.y = y1-Size.y/2; LeftDown.x = x1-Size.x/2; LeftDown.y = y1+Size.y/2; RightDown.x = x1+Size.x/2; RightDown.y = y1+Size.y/2; CalcRotatePnt(LeftUp.x,LeftUp.y,x1,y1,rot,&LeftUp.x,&LeftUp.y); CalcRotatePnt(RightUp.x,RightUp.y,x1,y1,rot,&RightUp.x,&RightUp.y); CalcRotatePnt(RightDown.x,RightDown.y,x1,y1,rot,&RightDown.x,&RightDown.y); CalcRotatePnt(LeftDown.x,LeftDown.y,x1,y1,rot,&LeftDown.x,&LeftDown.y); }else{ LeftUp.x = x1; LeftUp.y = y1; RightUp.x = x1+x3; RightUp.y = y1; LeftDown.x = x1; LeftDown.y = y1+y3; RightDown.x = x1+x3; RightDown.y = y1+y3; CalcRotatePnt(LeftUp.x,LeftUp.y,LeftUp.x+x3/2,LeftUp.y+y3/2,rot,&LeftUp.x,&LeftUp.y); CalcRotatePnt(RightUp.x,RightUp.y,RightUp.x-x3/2,RightUp.y+y3/2,rot,&RightUp.x,&RightUp.y); CalcRotatePnt(RightDown.x,RightDown.y,RightDown.y-x3/2,RightDown.y-y3/2,rot,&RightDown.x,&RightDown.y); CalcRotatePnt(LeftDown.x,LeftDown.y,x1+x3/2,y1-y3/2,rot,&LeftDown.x,&LeftDown.y); } // 各座標の回転 90などといれる角度の方 ディグリー角? // LRフラグがtrueなら各座標の反転 SetDrawBlendMode(DX_BLENDMODE_ALPHA,( color>>24 )); SetDrawBright( ( color & 0xFF0000 ) >> 16, ( color & 0x00FF00 ) >> 8, ( color & 0x0000FF ) ); DrawModiGraph( LeftUp.x , LeftUp.y , RightUp.x , RightUp.y , RightDown.x , RightDown.y , LeftDown.x , LeftDown.y , hGraph , true ) ; SetDrawBright(255,255,255); SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ); if(DeleteF) DeleteGraph(hGraph); }
Re:DXライブラリを使ってなんでも対応できる描画関数
バグが起こる条件がわかりました。
Alt+F4や×でウインドウを閉じようとすると必ず起こります。
もしかしたらwhileでまわしているので
DXライブラリを終了させるときに書かなければいけないEndの
命令までたどり着いていないのかもしれません。
描画の方は自分なりに修正しているのですが
相変わらず表示位置が関係ない位置になってしまいます。
Alt+F4や×でウインドウを閉じようとすると必ず起こります。
もしかしたらwhileでまわしているので
DXライブラリを終了させるときに書かなければいけないEndの
命令までたどり着いていないのかもしれません。
描画の方は自分なりに修正しているのですが
相変わらず表示位置が関係ない位置になってしまいます。