Utilisez le langage C EasyX pour créer un fond d'amour dynamique

Introduction

Dans le monde de l'infographie, il existe de nombreuses façons de rendre l'interface d'un programme plus attrayante. Dans ce blog, je vais vous présenter comment utiliser la bibliothèque graphique EasyX pour créer un fond d'amour dynamique en C++. Il ne s'agit pas simplement d'un simple effet animé, il comprend également des étoiles en arrière-plan, des cœurs qui tournent et un magnifique dégradé d'arrière-plan.


Introduction à l'outil : bibliothèque graphique EasyX

EasyX est une bibliothèque graphique C++ facile à utiliser, particulièrement adaptée aux débutants et aux développeurs qui souhaitent ajouter rapidement des graphiques à leurs applications. Il fournit une série de fonctions qui peuvent vous aider à dessiner des formes, à définir des couleurs et à animer des effets.


Objectifs de conception

Notre objectif est de créer un cœur dynamique qui tourne en arrière-plan. L'arrière-plan aura un dégradé allant du bleu sidéral au noir, parsemé de petites étoiles de différentes couleurs.

affichage d'images


Commencez à coder

Définir la structure des étoiles

Chaque étoile a ses coordonnées, sa couleur et sa luminosité. On utilise a structpour représenter :

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

3.2 Fonction de dessin en forme de cœur

Nous utilisons des équations paramétriques pour dessiner la forme du cœur et y ajouter un effet de rotation :

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

logique de la fonction principale

Dans main()la fonction, nous initialisons d'abord la fenêtre graphique EasyX. Ensuite, nous générons aléatoirement un ensemble d’étoiles et stockons leurs propriétés. Dans la boucle principale, nous dessinons le dégradé d'arrière-plan, les étoiles et les formes de cœur, et obtenons l'effet dynamique de la forme du cœur.


Partage de code source

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

résultat

Lorsque vous exécutez le code ci-dessus, vous verrez un magnifique arrière-plan dynamique avec un cœur qui tourne et un tas d'étoiles scintillantes. En ajustant les paramètres, vous pouvez facilement modifier la vitesse, la couleur et d'autres propriétés de votre animation.


Ressources de référence :

  1. Documentation officielle d'EasyX
  2. Équations paramétriques cardioïdes

Je suppose que tu aimes

Origine blog.csdn.net/VLOKL/article/details/132840210
conseillé
Classement