トップページ > 記事閲覧
Radial Gradient
名前:Beginner 日時: 2023/09/24 02:15

こんにちは。 円形のグラデーションを実装したいのですが、難しいです。円形のグラデーションを描く方法はありますか?中心座標は画面サイズの半分に設定しています(ScreenWidth / 2、ScreenHeight / 2)。 for文で円を描く方法が分かりません。 数学式が必要ですか? グラデーションが滑らかでなくても大丈夫です。 for (auto i = 0; i < 360; ++i) { auto angle = i * (DX_PI_F / 180.0F); x = ? y = ? } xとyをどうすればいいでしょうか? 以下は線形グラデーション(Linear-Gradient)コードです。VERTEX2Dを応用して作る方法が分かりません。 ================================================== DrawLinearGradient2D(const int x1, const int y1, const int x2, const int y2, const unsigned int startColor, const int startAlpha, const unsigned int endColor, const int endAlpha, const int alpha, const eGradientDirection dir) const noexcept { int start_red, start_green, start_blue; DxLib::GetColor2(startColor, &start_red, &start_green, &start_blue); int end_red, end_green, end_blue; DxLib::GetColor2(endColor, &end_red, &end_green, &end_blue); DxLib::VERTEX2D Vertex[6]; DxLib::SetDrawBlendMode(DX_BLENDMODE_ALPHA, alpha); switch (dir) { case eGradientDirection::Left: { Vertex[0].pos = DxLib::VGet(x1, y1, 0.0F); Vertex[0].rhw = 1.0F; Vertex[0].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[0].u = 0.0F; Vertex[0].v = 0.0F; Vertex[1].pos = DxLib::VGet(x2, y1, 0.0F); Vertex[1].rhw = 1.0F; Vertex[1].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[1].u = 0.0F; Vertex[1].v = 0.0F; Vertex[2].pos = DxLib::VGet(x1, y2, 0.0F); Vertex[2].rhw = 1.0F; Vertex[2].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[2].u = 0.0F; Vertex[2].v = 0.0F; Vertex[3].pos = DxLib::VGet(x2, y2, 0.0F); Vertex[3].rhw = 1.0F; Vertex[3].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[3].u = 0.0F; Vertex[3].v = 0.0F; Vertex[4] = Vertex[2]; Vertex[5] = Vertex[1]; } break; case eGradientDirection::Right: { Vertex[0].pos = DxLib::VGet(x1, y1, 0.0F); Vertex[0].rhw = 1.0F; Vertex[0].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[0].u = 0.0F; Vertex[0].v = 0.0F; Vertex[1].pos = DxLib::VGet(x2, y1, 0.0F); Vertex[1].rhw = 1.0F; Vertex[1].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[1].u = 0.0F; Vertex[1].v = 0.0F; Vertex[2].pos = DxLib::VGet(x1, y2, 0.0F); Vertex[2].rhw = 1.0F; Vertex[2].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[2].u = 0.0F; Vertex[2].v = 0.0F; Vertex[3].pos = DxLib::VGet(x2, y2, 0.0F); Vertex[3].rhw = 1.0F; Vertex[3].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[3].u = 0.0F; Vertex[3].v = 0.0F; Vertex[4] = Vertex[2]; Vertex[5] = Vertex[1]; } break; case eGradientDirection::Top: { Vertex[0].pos = DxLib::VGet(x1, y1, 0.0F); Vertex[0].rhw = 1.0F; Vertex[0].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[0].u = 0.0F; Vertex[0].v = 0.0F; Vertex[1].pos = DxLib::VGet(x2, y1, 0.0F); Vertex[1].rhw = 1.0F; Vertex[1].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[1].u = 0.0F; Vertex[1].v = 0.0F; Vertex[2].pos = DxLib::VGet(x1, y2, 0.0F); Vertex[2].rhw = 1.0F; Vertex[2].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[2].u = 0.0F; Vertex[2].v = 0.0F; Vertex[3].pos = DxLib::VGet(x1, y2, 0.0F); Vertex[3].rhw = 1.0F; Vertex[3].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[3].u = 0.0F; Vertex[3].v = 0.0F; Vertex[4] = Vertex[2]; Vertex[5] = Vertex[1]; } break; case eGradientDirection::Bottom: { Vertex[0].pos = DxLib::VGet(x1, y1, 0.0F); Vertex[0].rhw = 1.0F; Vertex[0].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[0].u = 0.0F; Vertex[0].v = 0.0F; Vertex[1].pos = DxLib::VGet(x2, y1, 0.0F); Vertex[1].rhw = 1.0F; Vertex[1].dif = { (unsigned char)end_red, (unsigned char)end_green, (unsigned char)end_blue, (unsigned char)endAlpha }; Vertex[1].u = 0.0F; Vertex[1].v = 0.0F; Vertex[2].pos = DxLib::VGet(x1, y2, 0.0F); Vertex[2].rhw = 1.0F; Vertex[2].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[2].u = 0.0F; Vertex[2].v = 0.0F; Vertex[3].pos = DxLib::VGet(x2, y2, 0.0F); Vertex[3].rhw = 1.0F; Vertex[3].dif = { (unsigned char)start_red, (unsigned char)start_green, (unsigned char)start_blue, (unsigned char)startAlpha }; Vertex[3].u = 0.0F; Vertex[3].v = 0.0F; Vertex[4] = Vertex[2]; Vertex[5] = Vertex[1]; } break; default: { return; } break; } DxLib::DrawPolygon2D(Vertex, 2, DX_NONE_GRAPH, FALSE); DxLib::SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0); DxLib::ClearDrawScreenZBuffer(); // Reset }
メンテ

Page: 1 |

Re: Radial Gradient ( No.1 )
名前:管理人 日時:2023/09/25 01:37

> for文で円を描く方法が分かりません。 数学式が必要ですか? グラデーションが滑らかでなくても大丈夫です。 円を描くには sin と cos を使用します DrawPolygonIndexed2D というリファレンスには載っていない関数を使用していますが、 円を描画するプログラムを組んでみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" #include <math.h> // 円を描くのに使用する頂点の数 #define DIV_NUM 128 void DrawCirclePolygon2D( int x, int y, int r, COLOR_U8 color ) { VERTEX2D Vertex[ DIV_NUM + 1 ] ; unsigned short Index[ DIV_NUM * 3 ] ; int i ; // 円の頂点をセット for( i = 0; i < DIV_NUM; i ++ ) { float Sin, Cos; float Angle = i * DX_PI_F * 2.0f / DIV_NUM ; Sin = sinf( Angle ) ; Cos = cosf( Angle ) ; Vertex[ i ].pos.x = Cos * r + x ; Vertex[ i ].pos.y = Sin * r + y ; Vertex[ i ].pos.z = 0.0f ; Vertex[ i ].rhw = 1.0f ; Vertex[ i ].u = 0.0f ; Vertex[ i ].v = 0.0f ; Vertex[ i ].dif = color ; } // 円の中心点をセット Vertex[ DIV_NUM ].pos.x = ( float )x ; Vertex[ DIV_NUM ].pos.y = ( float )y ; Vertex[ DIV_NUM ].pos.z = 0.0f ; Vertex[ DIV_NUM ].rhw = 1.0f ; Vertex[ DIV_NUM ].u = 0.0f ; Vertex[ DIV_NUM ].v = 0.0f ; Vertex[ DIV_NUM ].dif = color ; // 3角形ポリゴンで使用する頂点インデックスをセット( インデックス3つでポリゴン1つ ) for( i = 0 ; i < DIV_NUM - 1; i++ ) { Index[ i * 3 + 0 ] = DIV_NUM ; // 使用する頂点の一つは必ず円の中心点の頂点 Index[ i * 3 + 1 ] = i ; Index[ i * 3 + 2 ] = i + 1 ; } // 最後のポリゴンで使用する頂点インデックスをセット Index[ i * 3 + 0 ] = DIV_NUM ; Index[ i * 3 + 1 ] = i ; Index[ i * 3 + 2 ] = 0 ; // ポリゴンを描画 DrawPolygonIndexed2D( Vertex, DIV_NUM + 1, Index, DIV_NUM, DX_NONE_GRAPH, FALSE ) ; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 円を描画 DrawCirclePolygon2D( 320, 240, 128, GetColorU8( 255, 255, 0, 255 ) ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: Radial Gradient ( No.2 )
名前:Beginner 日時:2023/09/25 02:34

ありがとうございます。コードを書いていますが、難しいですね。 希望通りの姿は出ませんが、公式とコードは確かに役に立ちました。 dixq.net/img/bbs/kurayami2.png 上の写真のように実装したいのですが、DrawPolygon2DやDrawPolygonIndexed2DよりGraphBlendを利用する方が良いですか?
メンテ
Re: Radial Gradient ( No.3 )
名前:管理人 日時:2023/09/26 02:26

> DrawPolygon2DやDrawPolygonIndexed2DよりGraphBlendを利用する方が良いですか? はい、円形のグラデーションの画像を用意して、GraphBlend や DrawGraph で描画する方が簡単です ( DrawPolygon2D などを使用しても実現できますが、沢山のポリゴンを描画する必要があるので処理負荷も大きくなります )
メンテ
Re: Radial Gradient ( No.4 )
名前:Beginner 日時:2023/09/27 17:42

ありがとうございます。
メンテ
Re: Radial Gradient ( No.5 )
名前:Beginner 日時:2023/10/01 18:58

こんにちは。 すみませんが、別の質問があり、質問させていただきました。 「Hello, World!」という文字列がある場合、「Hello」は20ptの赤色を持ち、「Wor」は青の12ptを持ち、「!」は16ptで太字と斜体を持ちたい場合はどのように実装できますか? 字幕やクエストを出力するとき、一部の文字を強調して表示したいと思います。 forステートメントで1文字ずつアクセスし、SetFontSize、SetFontThickness、ChangeFontを使用すると負荷がかなりあるようです。 良い方法はありませんか? FontHandleを場合の数だけ生成するかと思いましたが、非効率的なようです。 そして、DrawObtainsString関数の使用中に質問があります。 下のリンクにある例を試してみると、両側に文字が切り捨てられたようなものがあります。 英語は大丈夫ですが、他の言語で書くと切り捨てられるようです。 qiita.com/puuti146/items/1aa4968ffa6cb5052107
メンテ
Re: Radial Gradient ( No.6 )
名前:管理人 日時:2023/10/02 01:12

> FontHandleを場合の数だけ生成するかと思いましたが、非効率的なようです。 現状では FontHandle を場合の数だけ生成するのが最善の方法となっています m(_ _)m > そして、DrawObtainsString関数の使用中に質問があります。 下のリンクにある例を試してみると、 > 両側に文字が切り捨てられたようなものがあります。 英語は大丈夫ですが、他の言語で書くと切り捨てられるようです。 こちらは現状での仕様となります ただ、見切れないように直せそうなら直したいと思います (・・; ( DrawObtainsString関数を実装した当時は見切れていても個人的には気にならなかったのですが、  今改めて見ると気になるので… )
メンテ
Re: Radial Gradient ( No.7 )
名前:管理人 日時:2023/10/09 18:10

すみません、DrawObtainsString の文字が切り捨てられないバージョンである DrawObtainsString_CharClip という関数が既にありました( 作成したのを失念していました… ) 引数は DrawObtainsString と同じとなっていますので、よろしければお使いください m(_ _)m
メンテ
Re: Radial Gradient ( No.8 )
名前:Beginner 日時:2023/10/11 22:01

こんにちは。 元気でしたか? 答えを今見ました。 ありがとうございます。 MakeKeyInput関数の使用中に質問があります。 dxlib.xsrv.jp/function/dxfunc_input.html#R5N13 上記のリンクの例を使用している場合は、数字またはアルファベットを入力してEnterキーを押すと□□□□□□が表示されます。 もしコードページが問題だと思われ、DX_CHARCODEFORMAT_SHIFTJISやDX_CHARCODEFORMAT_UTF8を使うと正しく出力されます。 ただし、ハングルを出力するには DX_CHARCODEFORMAT_UHC を指定する必要がありますが正しくありません。 ハングル処理側に問題があるのでしょうか? さらに文字を入力するときにスペースを追加することはできませんか? アルファベットの場合は動作しますが、漢字やハングルなど英語以外の文字を入力すると空白は入力されません。
メンテ
Re: Radial Gradient ( No.9 )
名前:管理人 日時:2023/10/12 01:51

> さらに文字を入力するときにスペースを追加することはできませんか? アルファベットの場合は動作しますが、漢字やハングルなど英語以外の文字を入力すると空白は入力されません。 私の手元では問題なくスペースを追加することができるので、基本設定のコードページが異なるのが関係しているかもしれません 出来るか分かりませんが、手元でも同じ状況を再現してみたいと思いますので よろしければこちらのプログラムを実行して画面に表示される GetOEMCP() の戻り値を教えて頂けないでしょうか? m(_ _)m ( 私の環境で実行した場合は『GetOEMCP : 932』と表示されます ) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウィンドウモードで実行 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // OEMCP を表示する DrawFormatString( 0, 0, GetColor( 255,255,255 ), "GetOEMCP : %d", GetOEMCP() ) ; // キー入力待ち WaitKey() ; // DXライブラリの使用終了 DxLib_End() ; // 終了 return 0 ; }
メンテ
Re: Radial Gradient ( No.10 )
名前:Beginner 日時:2023/10/12 02:30

949です。韓国のPC環境で開発しています。
メンテ
Re: Radial Gradient ( No.11 )
名前:Beginner 日時:2023/10/12 02:38

お手数をお掛けして申し訳ございません. Visual Studioのプロジェクトプロパティで文字セットを"ユニコード文字セットの使用"に設定し、charをTCHARに変更すると□の出力なしでうまくいくようです。 ただ、空白の追加はまだうまくいかないようです。
メンテ
Re: Radial Gradient ( No.12 )
名前:管理人 日時:2023/10/14 01:44

ご返信 & お試しいただきありがとうございます この週末に韓国語(949)の環境で試してみたいと思いますので、お待ち下さい m(_ _)m
メンテ
Re: Radial Gradient ( No.13 )
名前:管理人 日時:2023/10/14 12:38

手元の環境で韓国語(949)環境で試した所、空白の追加ができない現象を再現できました ユニコード文字セットではない場合に DX_CHARCODEFORMAT_UHC を指定しても□□□□になってしまう問題と 併せて修正しましたので、よろしければこちらの修正版をお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 11.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: Radial Gradient ( No.14 )
名前:Beginner (解決) 日時:2023/10/28 01:01

確認がとても遅かった。 本当にありがとうございます。
メンテ
Re: Radial Gradient ( No.15 )
名前:Beginner 日時:2024/01/26 23:17

こんにちは。 お久しぶりです。 翻訳を使ったので、語法が変かもしれません。 予めご了承ください。 1. DrawObtainStringを使用しています。 より正確な使い方を知りたいので質問します。 関数はWindowのサイズに基づいて次の行に進むようです。 Windowが640x480のときに640の場合、次の行に進むようです。 ユーザーが定義したサイズ(ゾーン)を設定して使用したいと思います。 たとえば、Window は 640x480 ですが、X 座標 100 から始まり、テキストが 320 に到達した場合 (指定された X 座標)、次の行に移動したいと思います。 2. MakeShadowMapに関する質問です。 現在Windowでのみ利用可能と表記されていますが、今後AndroidまたはiOSをサポートする予定はありますか? 3. LoadSoundMem の BufferNum はどのような用途に使用されますか? デフォルトは3になっていますが、どの用途なのかよくわかりません。
メンテ
Re: Radial Gradient ( No.16 )
名前:管理人 日時:2024/01/27 17:14

> 1. DrawObtainStringを使用しています。 より正確な使い方を知りたいので質問します。 >  関数はWindowのサイズに基づいて次の行に進むようです。 Windowが640x480のときに640の場合、 > 次の行に進むようです。 ユーザーが定義したサイズ(ゾーン)を設定して使用したいと思います。 >  たとえば、Window は 640x480 ですが、X 座標 100 から始まり、テキストが 320 に到達した場合 >  (指定された X 座標)、次の行に移動したいと思います。 SetDrawArea で描画範囲を指定することで、DrawObtainsString で改行される範囲を設定することができます https://dxlib.xsrv.jp/function/dxfunc_graph3.html#R4N3 > 2. MakeShadowMapに関する質問です。 現在Windowでのみ利用可能と表記されていますが、今後AndroidまたはiOSをサポートする予定はありますか? 今後対応する可能性はありますが、今のところ対応作業をする予定はありません > 3. LoadSoundMem の BufferNum はどのような用途に使用されますか? デフォルトは3になっていますが、どの用途なのかよくわかりません。 同時に再生することができる数が BufferNum となります 例えば爆弾が爆発する音の再生時間が4秒だった場合、 PlaySoundMem で爆発音を再生してから4秒経過せずに再度 PlaySoundMem で爆発音を再生した場合、 BufferNum が 1 の場合は最初に再生した爆発音が停止して、爆発音が最初から再生されます BufferNum が 2 の場合は最初に再生した爆発音が停止せず、追加で爆発音が最初から再生されます( 2つの爆発音が重なって再生されます )
メンテ

Page: 1 |

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

   クッキー保存