Utilice el lenguaje C EasyX para crear un fondo de amor dinámico

Introducción

En el mundo de los gráficos por computadora, hay muchas maneras de hacer que la interfaz de un programa sea más atractiva. En este blog, les presentaré cómo utilizar la biblioteca de gráficos EasyX para crear un fondo de amor dinámico en C++. Este no es solo un simple efecto animado, también incluye estrellas en el fondo, corazones que giran y un hermoso degradado de fondo.


Introducción a la herramienta: biblioteca de gráficos EasyX

EasyX es una biblioteca de gráficos C++ fácil de usar, especialmente adecuada para principiantes y desarrolladores que desean agregar gráficos rápidamente a sus aplicaciones. Proporciona una serie de funciones que pueden ayudarte a dibujar formas, establecer colores y animar efectos.


Objetivos de diseño

Nuestro objetivo es crear un corazón dinámico que gire en segundo plano. El fondo tendrá un degradado del azul espacial al negro, salpicado de pequeñas estrellas de varios colores.

visualización de imagen


Empezar a codificar

Definir la estructura de las estrellas.

Cada estrella tiene sus coordenadas, color y brillo. Usamos a structpara representar:

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

3.2 Función de dibujo en forma de corazón

Usamos ecuaciones paramétricas para dibujar la forma del corazón y agregarle un efecto de rotación:

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

lógica de la función principal

En main()la función, primero inicializamos la ventana gráfica de EasyX. A continuación, generamos aleatoriamente un conjunto de estrellas y almacenamos sus propiedades. En el bucle principal, dibujamos el degradado de fondo, las estrellas y las formas de corazón, y logramos el efecto dinámico de la forma de corazón.


Compartir código fuente

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

resultado

Cuando ejecutes el código anterior, verás un hermoso fondo dinámico con un corazón que gira y un montón de estrellas titilantes. Al ajustar los parámetros, puedes cambiar fácilmente la velocidad, el color y otras propiedades de tu animación.


Recursos de referencia :

  1. Documentación oficial de EasyX
  2. Ecuaciones paramétricas cardioides

Supongo que te gusta

Origin blog.csdn.net/VLOKL/article/details/132840210
Recomendado
Clasificación