0

フェードアウト時に指定された時間遅延で画面上のランダムな場所で画像をフェードインおよびフェードアウトするスクリーンセーバーを C++ で作成するにはどうすればよいですか?

マルチモニターのサポートは素晴らしいでしょう。

動作するコードを持っているか、どこで入手できるかを知っていれば、それは素晴らしいことです. そうでなければ、私を正しい方向に向けてください。スムーズでラグがなく、ちらつきのないフェードを行う方法を探しています。スクリーンセーバーは Windows XP 用です。

C++ はわかりませんが、AS3、Javascript、および PHP は知っています。そのため、その知識の一部を C++ に関連付けたいと考えていました。

コンパイルするには何を使用すればよいですか?

4

4 に答える 4

9

まず、C++ を使い始める場合は、Visual C++ のような Windows 固有のコンパイラから始めないでください。eclipse やcode::blocksなどのコンパイラが付属する優れたクロスプラットフォーム IDE を入手してください。他のプロジェクトと同様に、段階的に完了できる小さなタスクに分割する必要があります。いくつかのハードルがあるようですね。

  1. C++ の知識の欠如 (私たちはかつてここにいました)
  2. 画像に関する知識の欠如 (非常に一般的な苦痛)
  3. 経験の欠如(私たちはこれに取り組みます)

他の人に落胆させないでください。あなたはこれを行うことができ、おそらくあなたが考えているよりも速いでしょう。C++ に関する本を 1 冊か 2 冊読んでください。あまり知らなくても 1 つのプロジェクトをこなすことができますが、しばしばイライラすることになります。プロジェクトを一連の小さな目標に分割しましょう。それぞれの目標を達成するにつれて、C++ に対する自信が高まります。

  1. 画像ブレンディング
  2. マルチモニターをサポートする Windows スクリーン セーバー
  3. スクリーン キャンバス (directx、opengl、ビットマップ?)
  4. タイマー

まず、画像ブレンディングの問題を見てみましょう。問題の画像を、アクティブなウィンドウの背景に「フェード」したいと思うでしょう。無地の背景を使用する場合は、キャンバスを更新するたびに問題の画像のアルファ透明度を変更するだけで済みます。基本的に、リフレッシュ タイマーに基づいて、2 つの画像の各ピクセルのカラー値を平均する必要があります。より直接的には、結果のピクセル (P3) の赤、緑、および青のピクセル要素を見つけます。

N = 間隔ごとのタイマー ティック (秒/ミリ秒など)
T = この間隔で発生したティック
P1r = 画像 1 の
赤のピクセル要素 P2r = 画像 2
の赤のピクセル要素 P3r = ブレンドされた画像の結果の赤のピクセル要素
P1g = 緑のピクセル画像 1 の要素
P2g = 画像 2 の緑のピクセル要素
P3g = 合成画像の合成緑ピクセル要素
P1b = 画像 1
の青ピクセル要素 P2b = 画像 2
の青ピクセル要素 P3b = 合成画像の合成青ピクセル要素

P3r = ((T/N * P1r) + ((N-T)/N * P2r))/2
P3g = ((T/N * P1g) + ((N-T)/N * P2g))/2
P3b = ((T/N * P1b) + ((N-T)/N * P2b))/2

ここで、Windows スクリーン セーバーとマルチ モニター サポートの問題を見てみましょう。これらは実際には 2 つの別個の問題です。Windows スクリーンセーバーは、実際には、特定のコールバック関数を使用してコンパイルされた通常の .exe ファイルのみです。スクリーンセーバー機能の設定に関するチュートリアルは、ネット上にたくさんあります。マルチモニターのサポートは、次に説明する Screen Canvas をセットアップするときに実際に問題になります。

スクリーン キャンバスとは、プログラムがビジュアル データを出力する領域を指しています。すべての画像レンダリング アプリまたはチュートリアルは、基本的にこの同じ概念を参照します。これが特に興味深いと思われる場合は、コンピューター ビジョンの大学院プログラムまたは学習コースを検討してください。後悔しないと信じてください。いずれにせよ、アプリの基本的な性質を考慮すると、openGL や DirectX を使用しないことをお勧めします。これは、それぞれにアプリ固有の知識の層があり、それらが役立つ前に取得する必要があるためです。一方、ダブル バッファリングや GPU オフロードなどの組み込みの 3D 機能が必要な場合は、openGL を使用します (よりプラットフォームに依存しません)。楽しい画像ライブラリもたくさんあります。

マルチ モニターのサポートに関しては、これは難しい問題ですが、複雑ではありません。基本的には、複数のモニターのジオメトリに一致するようにキャンバスの境界 (画面の境界) を設定するだけです。同じ解像度の複数のモニターでは問題にならないはずですが、モニターの解像度が一致しないと扱いにくくなる可能性があります (キャンバス領域が画面に表示されないなど)。これらの問題にはよく知られたアルゴリズムと回避策がありますが、おそらくこれは範囲外です。この質問の。

最後に、必要なタイマーに関しては、これが最も簡単な部分です。Windows と Linux は独自の奇妙な方法で時間を処理します (なぜ MS は STRPTIME を実装しないのですか)。移植性に関心がある場合は、サードパーティのライブラリを使用します。それ以外の場合は、Windows の settimer() 基本機能を使用して、画像をコールバック関数でレンダリングします。

高度なトピック: まだ読んでいるのであれば、このプログラムに加えることができる興味深いアルゴリズムの改良点がいくつかあります。たとえば、タイマーが 1 秒ごとに設定された量をオフにすると、最初のいくつかのブレンドされた画像をキャッシュして、処理時間を節約できます (私たちの目は、色のグラデーションの変化を区別するのが苦手です)。openGL を使用している場合は、ブレンドされた画像のセットをディスプレイ リストとしてキャッシュできます (グラフィック カード メモリをすべて使用する必要がありますか?)。楽しいこと、頑張ってください!

于 2009-09-16T22:03:49.117 に答える
5

「C++ はわかりませんが、AS3、Javascript、PHP は知っています。その知識の一部を C++ に関連付けたいと思っていました。」

ああ、きっとあなたは驚かれることでしょう。C++ を学習するには:

  • 少なくとも 1 冊か 2 冊の非常に優れた本を購入してください (ここを参照)。あまり良くない本は買わないでください。彼らは、あなたがさらに進歩するために後で学ばなければならない習慣を教えてくれます.
  • その間に多くの読み取りを行いながら、多くの実践的なコード作成を行う必要があることを期待してください。最初の数週間で、コンパイラは理解不能なエラー メッセージを大量に吐き出し、コードはクラッシュし続け、コードを見ているベテランの C++ プログラマーはうんざりして手を挙げます。そして、それは常にあなたのせいです。
  • 学ぶために多くの時間を計画してください。そして、私は本当にたくさんのことを意味します。どんなに時間をかけても、「ダミー」から「初心者」にアップグレードするには、少なくとも数か月かかります。
  • 本や記事を読み続け、ニュースグループやディスカッション フォーラムに多くの時間を割き、他の人から学び、机の周りの壁に頭をぶつけて、本当のプロになるために、数年間それを叩かなければならないことを想像してみてください。
  • 生活のためにC++でプログラミングを10年続けた後でも、少なくとも毎週1回は、これまで知らなかったことを学ぶ準備をしてください。
  • 少しの間、私がこれを誇張しないかもしれないと想像してみてください。

明確化のための編集: Hunter Davis と Elemental の両方の回答に賛成票を投じました。実際、実際には C++ についてあまり知らなくても、多くの人がスケルトンの例を与えられたときに C/C++ で何かを一緒にハックできることに疑いの余地はありません。試してみてください。合理的な時間内にスクリーン セーバーを思いつく可能性は十分にあります。しかし。「C/C++ で何かを一緒にハッキングできる」ことは、「C++ を学んだこと」とはかけ離れています。(そして、私は非常に遠いことを意味します。)

C++ は信じられないほど複雑で、意地悪で頑固な獣です。息を呑むほど美しいとも思いますが、非常に高い山からの眺めを反映している可能性があります。その美しさを理解できるポイントに到達するのはかなり困難です。

于 2009-09-16T20:35:07.890 に答える
1

C++ は複雑な言語であり、sbi が示していることはすべておそらく真実です (確かに 10 年間の商用 C++ プログラミングの後でも、まだ学ぶべきことがあります)。 a) ここに記載されているコンパイラの 1 つをインストールします (Windows プログラミングのクイック ガイドとして VC をお勧めします) b) Windows GDI を使用して簡単なことを行うスクリーン セーバーのサンプル コードを見つけますスクリーン セーバー) c) このコードを変更して、必要な処理を実行します。

限られた要件に関しては、ウィンドウ GDI++ ライブラリには、必要なアルファ フェードをスムーズに行うのに十分な機能があることがわかると思います。

于 2009-09-17T08:56:08.003 に答える
0

私はMicrosoft C++ Expressを見たいと思います。それは無料でかなり有能です。管理されていない実行可能ファイルを生成するには、ハッキングするか、古いバージョンを入手する必要がある場合があります。

残りのために利用可能なチュートリアルがたくさんあります

于 2009-09-16T20:16:54.333 に答える