C言語EasyXを使用してダイナミックな愛の背景を作成します

導入

コンピューター グラフィックスの世界では、プログラムのインターフェイスをより魅力的にする方法がたくさんあります。このブログでは、EasyX グラフィック ライブラリを使用して C++ で動的な愛の背景を作成する方法を紹介します。これは単なるアニメーション効果ではなく、背景の星、回転するハート、美しい背景のグラデーションも含まれています。


ツールの紹介: EasyX グラフィックス ライブラリ

EasyX は、使いやすい C++ グラフィック ライブラリであり、アプリケーションにグラフィックをすぐに追加したい初心者や開発者に特に適しています。形状の描画、色の設定、効果のアニメーション化に役立つ一連の機能を提供します。


設計目標

私たちの目標は、バックグラウンドで回転するダイナミックな心臓を作成することです。背景にはスペースブルーからブラックへのグラデーションがかかり、さまざまな色の小さな星が散りばめられています。

画像表示


コーディングを開始する

星の構造を定義する

各星には座標、色、明るさがあります。を使用して次structのことを表します。

struct Star {
    int x, y;
    COLORREF color;
    float intensity;
    float intensityChange;
};

3.2 ハート型描画機能

パラメトリック方程式を使用してハートの形を描画し、それに回転効果を追加します。

void DrawHeart(int x, int y, COLORREF color, float scale, float angle) {
    BeginBatchDraw();  // 开始批量绘制
    const int thickness = 2;  // 调整这个值来改变心形的粗细
    for (float t = 0; t < 2 * 3.14159; t += 0.01) {
        float x_cord = scale * (16 * pow(sin(t), 3));
        float y_cord = scale * -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));

        // 旋转
        float rotatedX = x_cord * cos(angle) - y_cord * sin(angle);
        float rotatedY = x_cord * sin(angle) + y_cord * cos(angle);

        for (int dx = -thickness; dx <= thickness; dx++) {
            for (int dy = -thickness; dy <= thickness; dy++) {
                putpixel(x + rotatedX + dx, y + rotatedY + dy, color);
            }
        }
    }
    EndBatchDraw();  // 结束批量绘制,并显示在前台
}

メイン関数のロジック

この関数ではmain()、まず EasyX グラフィックス ウィンドウを初期化します。次に、星のセットをランダムに生成し、そのプロパティを保存します。メインループでは、背景のグラデーション、星、ハートの形を描画し、ハートの形のダイナミックな効果を実現します。


ソースコードの共有

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <vector>

struct Star {
    int x, y;
    COLORREF color;
    float intensity;
    float intensityChange;
};


// 修改后的心形公式函数
void DrawHeart(int x, int y, COLORREF color, float scale, float angle) {
    BeginBatchDraw();  // 开始批量绘制
    const int thickness = 2;  // 调整这个值来改变心形的粗细
    for (float t = 0; t < 2 * 3.14159; t += 0.01) {
        float x_cord = scale * (16 * pow(sin(t), 3));
        float y_cord = scale * -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));

        // 旋转
        float rotatedX = x_cord * cos(angle) - y_cord * sin(angle);
        float rotatedY = x_cord * sin(angle) + y_cord * cos(angle);

        for (int dx = -thickness; dx <= thickness; dx++) {
            for (int dy = -thickness; dy <= thickness; dy++) {
                putpixel(x + rotatedX + dx, y + rotatedY + dy, color);
            }
        }
    }
    EndBatchDraw();  // 结束批量绘制,并显示在前台
}

int main() {
    // 初始化图形窗口
    initgraph(640, 480);
    setbkcolor(BLACK); // 设置背景色为黑色
    cleardevice();     // 清空屏幕

    // 创建星星
    const int numStars = 100;
    std::vector<Star> stars;
    for (int i = 0; i < numStars; i++) {
        Star star = {
            rand() % 640,
            rand() % 480,
            RGB(rand() % 256, rand() % 256, rand() % 256),
            (rand() % 100) / 100.0f,
            (rand() % 5 + 1) / 500.0f
        };
        stars.push_back(star);
    }

    float scale = 10;
    bool increase = true;
    COLORREF heartColor = RED;
    float angle = 0;
    BeginBatchDraw();  // 开始批量绘制

    while (!_kbhit()) { // 直到有键被按下
        cleardevice(); // 清空屏幕

        // 绘制渐变背景
        for (int i = 0; i < 480; i++) {
            float ratio = (float)i / 480;
            COLORREF bgColor = RGB(0, 0, ratio * 50);
            setlinecolor(bgColor);
            line(0, i, 640, i);
        }

        // 绘制星星
        for (auto& star : stars) {
            star.intensity += star.intensityChange;
            if (star.intensity > 1 || star.intensity < 0.5) {
                star.intensityChange = -star.intensityChange;
            }
            COLORREF modifiedColor = RGB(GetRValue(star.color) * star.intensity, GetGValue(star.color) * star.intensity, GetBValue(star.color) * star.intensity);
            putpixel(star.x, star.y, modifiedColor);
        }

        if (increase) {
            scale += 0.1;
        }
        else {
            scale -= 0.1;
        }

        if (scale > 15 || scale < 10) {
            increase = !increase;
        }

        // 改变心的颜色
        int r = GetRValue(heartColor);
        int g = GetGValue(heartColor);
        int b = GetBValue(heartColor);
        r = (r + 1) % 256;
        g = (g + 2) % 256;
        b = (b + 3) % 256;
        heartColor = RGB(r, g, b);

        DrawHeart(320, 240, heartColor, scale, angle);
        angle += 0.005; // 调整这个值来改变旋转速度

        Sleep(10);
        EndBatchDraw();  // 结束批量绘制,并显示在前台
    }
   
    closegraph();
    return 0;
}

結果

上記のコードを実行すると、回転するハートとたくさんのきらめく星のある美しいダイナミックな背景が表示されます。パラメータを調整することで、アニメーションの速度、色、その他のプロパティを簡単に変更できます。


参考リソース:

  1. EasyX 公式ドキュメント
  2. カーディオイドのパラメトリック方程式

おすすめ

転載: blog.csdn.net/VLOKL/article/details/132840210