DXライブラリ 文字列の透過

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazuoni

DXライブラリ 文字列の透過

#1

投稿記事 by kazuoni » 15年前

お邪魔します。

現在、ある画像に文字列を描写し、その文字列(日本語文字を含めた)
を透過した画像を動的に生成しようと考えています。

背景と文字列の色が被らないという前提で、以下の様に考えました。

0、文字列に描写したい色をSetTransColorでセット
1、MakeScreenでハンドル生成
2、1で確保したところに文字列を描写
3、Screenを戻し、描写→文字列透過

と考えていたのですが、文字列は透過されませんでした。
どこかおかしな点があるでしょうか?

よろしくお願いします。

Ma

Re:DXライブラリ 文字列の透過

#2

投稿記事 by Ma » 15年前

んー、それだと、完全に透明なハンドルになりませんか?
正しくは

2、1で確保したところに、「画像を描画して次に」(SetTransColorで指定した色を持つ)文字列を描写
ではないでしょうか?

追記
マスキングしてもいいでしょう。 画像

Justy

Re:DXライブラリ 文字列の透過

#3

投稿記事 by Justy » 15年前

 SetTransColorなんて不要でしょう。

1 SetDrawValidAlphaChannelGraphCreateFlag(TRUE)を呼んでから
MakeScreenでハンドル生成

2 描画先を1にして文字列描画
3 描画先を元に戻し、1を透過有りで描画

 これでいいんじゃないですか?

kazuoni

Re:DXライブラリ 文字列の透過

#4

投稿記事 by kazuoni » 15年前

返信が遅れて申し訳ありませんでした。

>SetDrawValidAlphaChannelGraphCreateFlag(TRUE)
を用いてみましたが、文字列は透過されず、代わりに背景が透過されているようです。


少し追記をさせていただきます。
描写先に指定したスクリーンには普通に何かを描写するかもしれないですが、
とにかく文字列に指定した色を透過色とし、そのハンドルを描写するときは
指定したところを透過する画像にしたいです。(結局は文字列を透過したい)
たしかにTransColorは使用したくはないのですが、自分にはこれぐらいしか思い浮かばなかったもので。


> マスキング
やはり最善はこれですかね。
一応この方法はうまくいっているのですが、
画像一枚に一発で透過できたら便利かなと思いまして質問させていただいた次第です。

HK

Re:DXライブラリ 文字列の透過

#5

投稿記事 by HK » 15年前

1.SetDrawValidGraphCreateFlag
 で描画可能グラフハンドル作成可能にする

2.SetDrawValidAlphaChannelGraphCreateFlag
 でαch描画可能グラフハンドル作成可能にする

3.MakeGraph
  で描画可能グラフハンドル作成

4.SetDrawValidAlphaChannelGraphCreateFlag
 でαch描画可能グラフハンドル作成を閉じる

5.SetDrawValidGraphCreateFlag
 で描画可能グラフハンドル作成を閉じる

の手順で描画可能な画像を1枚作り、描画手順は以下のように。

SetDrawScreen
で描画先を、先ほど作ったグラフハンドルに指定して、文字を描画。

SetDrawScreen で描画先を元に戻す

ループ部分で
DrawRotaGraph で先ほど描画したものを描画
ループ抜けたら破棄


これで、私は文字を拡大縮小したり回転したり、半透明にさせたりして描画することに成功しました。
半透明に関しては、DrawRotaGraphの描画の直前に SetDrawBlendMode で透明度を変更しました。

Justy

Re:DXライブラリ 文字列の透過

#6

投稿記事 by Justy » 15年前

 あー、なるほど。失礼しましました。
 フォントの部分を透過な訳ですね。

 マスクでいいと思います。

 或いは(指定した色を透過色にはできませんが)別の方法としては
Zバッファを使うという手もあります。

[color=#d0d0ff" face="monospace]int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
ChangeWindowMode(TRUE);

if(DxLib_Init() < 0) return 1;

SetUseZBufferFlag(TRUE);
SetWriteZBufferFlag(TRUE);

SetDrawValidAlphaChannelGraphCreateFlag(TRUE);
int renderTexture = MakeScreen(640, 480);
SetDrawValidAlphaChannelGraphCreateFlag(FALSE);

int bg = LoadGraph("bg.jpg"); // フォント以外に表示
int font_bg = LoadGraph("font_bg.jpg"); // フォントのところに表示

while(!ProcessMessage())
{
// Zバッファイメージを作成
SetDrawScreen(renderTexture);
ClearDrawScreen();
DrawFormatString(100, 100, 0xffffff, "%d", 123456789);
DrawFormatString(200, 300, 0xffffff, "%d", 123456789);

// バックバッファへ切り替え
SetDrawScreen(DX_SCREEN_BACK);
ClearDrawScreen();
SetWriteZBufferFlag(FALSE);

// (コメントアウトを解除すると)フォントのところの絵を表示
// DrawGraph(0, 0, font_bg, FALSE);

// renderTextureの黒いところ(フォント以外)に bgを書き込む
DrawGraphToZBuffer(0,0, renderTexture, DX_ZWRITE_MASK);
DrawGraph(0, 0, bg, FALSE);

ScreenFlip();
}

DeleteGraph(renderTexture);
DeleteGraph(bg);
DeleteGraph(font_bg);

DxLib_End();

return 0;
}
[/color]

 こうするとフォントのところだけ背景色(或いは font_bg)になり、フォント以外は bgが
表示されます。

閉鎖

“C言語何でも質問掲示板” へ戻る