ラストワードの謎

アバター
SAI
記事: 115
登録日時: 13年前
住所: はひほーひ

ラストワードの謎

投稿記事 by SAI » 13年前

まずはこの動画を見てほしいです。
[nico]http://www.nicovideo.jp/watch/sm999395[/nico]
この動画が始まってすぐに「季節外れのバタフライストーム」と表示されますが、エフェクトがかかってますよね。
ラストワードはみんなこういうかっちょいーエフェクトがかかってるんですが、これ、どうやってるんでしょうか?
というか、DXライブラリで再現できるんでしょうかね。

文字が画像なら拡大率や透過率をいじって何回も(よく見たら3回でした)加算ブレンド(たぶん)すれば近いものができそうな気がしますが、少なくとも風神録以降は文字扱いのようなので、これもtxtファイルとして読み込んだ文字を描画してるのかなあ?

そうなると、メモリを食いそうです。
フォントサイズを変更するのはとても重い処理なので、あらかじめフォントを登録しておくしかありません。
そうなるとかなりたくさんのフォントを登録しないといけなくなります。
そんな無駄なことするかなあ・・・。いや、そもそもどれくらいメモリを使うんでしょうかね?

なにかメモリも使わず、文字サイズを変えるうまいやり方がありそうな気がしますが・・・。
画像をスペルを増やすたびに追加するのって大変そうじゃないですか。

というわけで皆さんはどう思いますか?
(こういうのは質問掲示板のほうがいいのかな?)

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前

Re: ラストワードの謎

投稿記事 by h2so5 » 13年前

これはあらかじめ最大サイズのフォントで描画した画像と
最小サイズのフォントで描画した画像を用意しておき、
最大サイズの画像を少しずつ縮小していって最後に最小サイズのフォントで描画した画像へ切り替える、
という方法に見えますね。

「最小サイズのフォントで描画した画像」を用意するのは、最終的に文字が静止する場合、
最大サイズの画像を縮小したのでは画像が荒くなってしまうのがばれるからです。

アバター
SAI
記事: 115
登録日時: 13年前
住所: はひほーひ

Re: ラストワードの謎

投稿記事 by SAI » 13年前

なるほど・・・。画像のほうですか。
画像を2つ使うとは考えもしませんでした。画像を小さくすると荒くなるんですね。知らなかった(°□°;)
ありがとうございます。参考にさせていただきます。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前

Re: ラストワードの謎

投稿記事 by MoNoQLoREATOR » 13年前

DXライブラリには、指定した領域に描画されている物を一時的に保存して画像ハンドルを得ることができる関数が用意されています。一時的というのは、ファイルとして保存されるのではなくメモリーに保存されるという意味です。これを使えば

文字だけを描画

そのデータを保存して画像ハンドルを取得

その他の画像等を描画

さっき保存した画像を使ってh2so5さんのような処理を行う

できたできたー ヽ(-ω-)ノ

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前

Re: ラストワードの謎

投稿記事 by Dixq (管理人) » 13年前

私も以前似たような事に挑戦したんですが、一応徐々にフォントサイズを変更するのは
DrawExtendStringToHandle
で出来るんです。
・・が、なかなかこれだとごわごわしてスーッとはならないんですよね。
アンチエイリアス付フォントだと一旦描画して、キャプチャした画像を使うと今度は透過がうまくいかない。
そういう理由で、カロさんの仰っている

> 最大サイズの画像を少しずつ縮小していって最後に最小サイズのフォントで描画した画像へ切り替える、

という手法よりは、デフォルトサイズに戻った時は画像にせずに直接描画した手法の方がよいかもしれません。
(最終的には画像である必要が無いと思うので)

アンチエイリアス部分が綺麗に見えないので結局私は予め作った画像にしました。
(アルファチャンネル付でキャプチャ出来る方法があればそれで対応可能だと思いますが)
今回の場合はエフェクトの中で使うので、そこまで分からないと思いますし、キャプチャで十分対応可能な範囲だとは思います。
最後に編集したユーザー Dixq (管理人) on 2011年4月04日(月) 00:09 [ 編集 1 回目 ]

アバター
SAI
記事: 115
登録日時: 13年前
住所: はひほーひ

Re: ラストワードの謎

投稿記事 by SAI » 13年前

>MoNoQLoREATORさん
アドバイスありがとうございます!
最終的にそのような流れでうまくいきました!

>Dixqさん
なるほど、フォントサイズを変える方法はなくもないんですか。
h2so5さんとMNSさんに協力していただいて、アルファチャンネル付きでキャプチャするのに近いやり方を教えてもらい、画像を作成できました。
でも、文字に様々な工夫を凝らしたいときは始めから画像を作っておいたほうが良さそうですね。
アドバイスありがとうございました!

ISLe
記事: 2650
登録日時: 13年前

Re: ラストワードの謎

投稿記事 by ISLe » 13年前

Dixq (管理人) さんが書きました:アンチエイリアス部分が綺麗に見えないので結局私は予め作った画像にしました。
(アルファチャンネル付でキャプチャ出来る方法があればそれで対応可能だと思いますが)
GetGlyphOutlineというWin32APIを使うと文字ごとのグレースケール画像を作ることができます。
DXライブラリと併用できると思います。
文字列描画するたびに呼び出すと遅くなるので、作りおきするようにしてください。

DXライブラリでDirectWriteが使えるようになると良いのですけど。

アバター
SAI
記事: 115
登録日時: 13年前
住所: はひほーひ

Re: ラストワードの謎

投稿記事 by SAI » 13年前

せっかくやり方を教えていただいて本当に申し訳ないですが、Win32APIというのは全く扱ったことがなく、またこれから学ぶ予定もないので、今の私には難しいと思います。
しかしWin32APIを学んだときのために心に留めておきたいとおもいます。ありがとうございました。