現在、C#で画面表示にワイプ(パラパラと画面が変わる)を作成しようと思ったのですが、あれはどういうアルゴリズムなのでしょうか?
http://tokyo.cool.ne.jp/sdl/img/ScreenEffect2.jpg
↑のように切り替わるワイプです。
No.3ベストアンサー
- 回答日時:
★最初に C# でグラフィックの描画方法をどの程度知っているのですか?
・ブラインドのフェードイン(ワイプイン)は画面を複数の高さに分割します。
たとえば 10 分割にしたとします。→ScreenEffect2.jpg に合わせ。
そのうちの1つに着目して
(1)中央位置から段々太くなるように『絵』をメモリバッファから画面(HDC)へ転送していきます。
(2)最初は Y 軸が中央位置、『絵』の高さが 1 ピクセルにします。
(3)続いて Y 軸を -1 にして『絵』の高さを 3 ピクセルにします。
(4)さらに Y 軸を -1 にして『絵』の高さを 5 ピクセルにします。
(5)上記を繰り返して分割した1つの絵の高さが 10 分割した1つの高さになったら繰り返し終了。
こんな感じですよ。ブラインドの場合は。
・これを実現するには最初『絵』=画像をメモリ上のバッファにすべてを描きます。
メモリ上とは、ダブルバッファ領域を用意してそこに描画する訳です。
・そして、メモリ上のダブルバッファ領域から順番に 10 分割した1つの領域を細いラインから
太いラインになるように Fill 関数などで実際の画面領域に転送します。
これを分割した 10 個分繰り返します。
・その後、ちょっとしたウェイトでも入れます。
ウェイト後はラインを少し太くした長方形領域をメモリ上から画面へ転送します。
これを繰り返す。下に擬似サンプルを載せます。
擬似サンプル:
int high = 32; ←10分割した1つの高さをセット
int posY = high / 2; ←中央位置なので÷2からスタート
int wide = 640; ←転送するラインの幅(ブラインドの横幅)
int size = 1; ←転送するラインの高さ(ブラインドの太さ)
do {
for ( int i = 0 ; i < 10 ; i++ ){ ←10分割なので 10
Fill( hDC,
0, (high * i + posY), wide, size, ←転送先(画面)
0, (high * i + posY), wide, size ); ←転送元(メモリ上)
}
Sleep( 100 ); ←100ms(0.1秒)のウェイト
posY -= 1; ←posY-- でもよい
size += 2;
} while ( size <= high );
解説:
・上記の擬似サンプルは C 言語風に記述しています。C# も似た感じですが Fill()、Sleep() の
関数名が多分違うはずです。Sleep() 関数は ms 単位でウェイトが入れられる関数です。
Fill() 関数も説明の都合上の関数名です。
上記では
Fill( 画面のデバイスコンテキスト,
横位置, 縦位置, 横サイズ, 縦サイズ, ←転送先(画面)
横位置, 縦位置, 横サイズ, 縦サイズ ); ←転送元(メモリ上)
という意味で使っています。→Win32 API では BitBlt 関数などを使う。
C# でメモリ上から画面に長方形領域を転送する関数に置き換えて下さい。
・以上。アルゴリズムという事なので上記を参考に。どうぞ。
No.2
- 回答日時:
★追記。
・調べたら、同サイトでソースのダウンロードが出来ますよ。
http://tokyo.cool.ne.jp/sdl/index7.html→『スクリーンエフェクト ScreenEffect』
これを元に C# で書き直してみれば良いのでは。
C言語で書かれていますので C 言語を知っていれば分かりやすいかと思いますが…。
どうでしょうか。
・『ワイプ表示』という表現がよく分かりませんが、描画されている『絵』を細い線で
段々に太くすれば『真っ黒』になりフェードアウトします。
・フェードインの場合は逆で『絵』を細い線で段々に太くして描画していけばできると
思います。前回のアドバイス通りにタイマーなどと組み合わせてゆっくりと細い線から
太い線になるように転送(描画)すればご希望通りの『ワイプ表示』の表現が出来ると
思いますよ。
・以上。
参考URL:http://tokyo.cool.ne.jp/sdl/index7.html
探していただいてありがとうございます。
ワイプ表示、種類がありますが、知りたいのは
上から順に線で埋め尽くされていくブラインド(ワイプイン)です。
以外に説明するのが難しいですね。
No.1
- 回答日時:
★最初に『ワイプ表示』の動作が分かりません。
・ブラインドのような画像は見ましたが、次はどうなる?
もうちょっと表示のステップを順に書いてくれないと分かりません。
あるいは動画などを何処かで見つけて『こんな感じ』っていう説明でないとね。
分かりません。
・でも、ちょっとしたアドバイスとしてタイマーを使って画像の一部を順番に
描画していけば良いと思います。タイマー間隔と単純なカウンタを用意して
そのカウンタから描画する部分を決めておけば、いろいろなスライドショーの
演出が出来ると思います。
・また、表示するウインドウのデバイスコンテキスト(画面)以外にもう一つメモリを
用意してダブルバッファでやり取りすれば変にちらつかず綺麗にもなります。
・以上。補足要求します。→もうちょっと詳しく『ワイプ表示』の仕組みを。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
MFCでOnPaintのタイミング
-
この二つの違いは・・・?
-
C# ラバーバンドの描画を快適に...
-
[VB.net] DataGridViewの列ヘッ...
-
VC++でカーソルを固定する
-
ローディング画面をマルチスレ...
-
テクスチャに半透明ポリゴンを...
-
DrawTextでの描画
-
VB.netでのライン描画方法がわ...
-
C言語(dxlib)のDrawboxについ...
-
InvalidateRectの使い方について
-
Form1 Load で実行されない。
-
Minecraft 統合版(PC)の描画距...
-
ワイプ表示について。
-
MFC ビットマップ描画で残像が残る
-
vb.netでテキストボックス内の...
-
TextBoxに文字を書いても表示さ...
-
ワードの図形で重なり部分の色...
-
FlexGridの一部のみ表示を更新...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
word
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
Minecraft 統合版(PC)の描画距...
-
google Colabでmatplotlibの描...
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
OneNote 2010 文字と描画がずれる
-
Labelの文字をスクロールする際...
-
InvalidateRectの使い方について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
VC++プログラムをつかったBMP画...
-
WM_SIZEとWM_SIZINGの違い (Win...
-
エクセルでガンチャートを作成...
-
c言語を使いダイアログにbmpを...
-
WM_PAINT
-
MFCのタイマーのつかい方を教え...
おすすめ情報