Verwenden Sie EasyX in der C-Sprache, um einen dynamischen Liebeshintergrund zu erstellen

Einführung

In der Welt der Computergrafik gibt es viele Möglichkeiten, die Benutzeroberfläche eines Programms attraktiver zu gestalten. In diesem Blog stelle ich Ihnen vor, wie Sie mit der EasyX-Grafikbibliothek einen dynamischen Liebeshintergrund in C++ erstellen. Dabei handelt es sich nicht nur um einen einfachen animierten Effekt, sondern auch um Sterne im Hintergrund, sich drehende Herzen und einen wunderschönen Hintergrundverlauf.


Tool-Einführung: EasyX-Grafikbibliothek

EasyX ist eine benutzerfreundliche C++-Grafikbibliothek, die sich besonders für Anfänger und Entwickler eignet, die ihren Anwendungen schnell Grafiken hinzufügen möchten. Es bietet eine Reihe von Funktionen, mit denen Sie Formen zeichnen, Farben festlegen und Effekte animieren können.


Designziele

Unser Ziel ist es, ein dynamisches Herz zu schaffen, das im Hintergrund rotiert. Der Hintergrund weist einen Farbverlauf von Weltraumblau zu Schwarz auf und ist mit kleinen Sternen in verschiedenen Farben übersät.

Bildschirm


Beginnen Sie mit dem Codieren

Definieren Sie die Struktur von Sternen

Jeder Stern hat seine Koordinaten, Farbe und Helligkeit. Wir verwenden a structzur Darstellung von:

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

3.2 Funktion zum Zeichnen von Herzformen

Wir verwenden parametrische Gleichungen, um die Herzform zu zeichnen und ihr einen Rotationseffekt hinzuzufügen:

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();  // 结束批量绘制,并显示在前台
}

Hauptfunktionslogik

In main()der Funktion initialisieren wir zunächst das EasyX-Grafikfenster. Als nächstes generieren wir zufällig eine Reihe von Sternen und speichern ihre Eigenschaften. In der Hauptschleife zeichnen wir den Hintergrundverlauf, Sterne und Herzformen und erzielen den dynamischen Effekt der Herzform.


Teilen des Quellcodes

#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;
}

Ergebnis

Wenn Sie den obigen Code ausführen, sehen Sie einen wunderschönen dynamischen Hintergrund mit einem sich drehenden Herzen und einer Reihe funkelnder Sterne. Durch Anpassen der Parameter können Sie die Geschwindigkeit, Farbe und andere Eigenschaften Ihrer Animation einfach ändern.


Referenzressourcen :

  1. Offizielle EasyX-Dokumentation
  2. Kardioide parametrische Gleichungen

Ich denke du magst

Origin blog.csdn.net/VLOKL/article/details/132840210
Empfohlen
Rangfolge