当前位置:   article > 正文

使用C语言EasyX 创建动态爱心背景_跳动爱心 easyx

跳动爱心 easyx

简介

计算机图形学的世界中,有很多方法可以使程序的界面更加吸引人。在本篇博客中,我将向大家介绍如何使用 EasyX 图形库在 C++ 中创建一个动态的爱心背景。这不仅是一个简单的动画效果,它还包括背景的星星、旋转的心形以及一个美观的背景渐变。


工具介绍:EasyX 图形库

EasyX 是一个简单易用的 C++ 图形库,特别适合初学者和那些想要快速为其应用程序添加图形的开发者。它提供了一系列函数,可以帮助你绘制形状、设置颜色和实现动画效果。


设计目标

我们的目标是创建一个动态的爱心,它会在背景中旋转。背景将有一个从深空蓝渐变到黑色的效果,并散布有颜色各异的小星星。

图片展示


开始编码

定义星星的结构

每颗星星都有其坐标、颜色和亮度。我们使用一个 struct 来表示:

  1. struct Star {
  2. int x, y;
  3. COLORREF color;
  4. float intensity;
  5. float intensityChange;
  6. };
3.2 心形绘制函数

我们使用参数方程来绘制心形,并为它添加了旋转效果:

  1. void DrawHeart(int x, int y, COLORREF color, float scale, float angle) {
  2. BeginBatchDraw(); // 开始批量绘制
  3. const int thickness = 2; // 调整这个值来改变心形的粗细
  4. for (float t = 0; t < 2 * 3.14159; t += 0.01) {
  5. float x_cord = scale * (16 * pow(sin(t), 3));
  6. float y_cord = scale * -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));
  7. // 旋转
  8. float rotatedX = x_cord * cos(angle) - y_cord * sin(angle);
  9. float rotatedY = x_cord * sin(angle) + y_cord * cos(angle);
  10. for (int dx = -thickness; dx <= thickness; dx++) {
  11. for (int dy = -thickness; dy <= thickness; dy++) {
  12. putpixel(x + rotatedX + dx, y + rotatedY + dy, color);
  13. }
  14. }
  15. }
  16. EndBatchDraw(); // 结束批量绘制,并显示在前台
  17. }
主函数逻辑

main() 函数中,我们首先初始化 EasyX 的图形窗口。接着,我们随机生成一组星星,并存储它们的属性。在主循环中,我们绘制背景渐变、星星和心形,并实现心形的动态效果。


源代码分享

  1. #include <graphics.h>
  2. #include <conio.h>
  3. #include <math.h>
  4. #include <vector>
  5. struct Star {
  6. int x, y;
  7. COLORREF color;
  8. float intensity;
  9. float intensityChange;
  10. };
  11. // 修改后的心形公式函数
  12. void DrawHeart(int x, int y, COLORREF color, float scale, float angle) {
  13. BeginBatchDraw(); // 开始批量绘制
  14. const int thickness = 2; // 调整这个值来改变心形的粗细
  15. for (float t = 0; t < 2 * 3.14159; t += 0.01) {
  16. float x_cord = scale * (16 * pow(sin(t), 3));
  17. float y_cord = scale * -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));
  18. // 旋转
  19. float rotatedX = x_cord * cos(angle) - y_cord * sin(angle);
  20. float rotatedY = x_cord * sin(angle) + y_cord * cos(angle);
  21. for (int dx = -thickness; dx <= thickness; dx++) {
  22. for (int dy = -thickness; dy <= thickness; dy++) {
  23. putpixel(x + rotatedX + dx, y + rotatedY + dy, color);
  24. }
  25. }
  26. }
  27. EndBatchDraw(); // 结束批量绘制,并显示在前台
  28. }
  29. int main() {
  30. // 初始化图形窗口
  31. initgraph(640, 480);
  32. setbkcolor(BLACK); // 设置背景色为黑色
  33. cleardevice(); // 清空屏幕
  34. // 创建星星
  35. const int numStars = 100;
  36. std::vector<Star> stars;
  37. for (int i = 0; i < numStars; i++) {
  38. Star star = {
  39. rand() % 640,
  40. rand() % 480,
  41. RGB(rand() % 256, rand() % 256, rand() % 256),
  42. (rand() % 100) / 100.0f,
  43. (rand() % 5 + 1) / 500.0f
  44. };
  45. stars.push_back(star);
  46. }
  47. float scale = 10;
  48. bool increase = true;
  49. COLORREF heartColor = RED;
  50. float angle = 0;
  51. BeginBatchDraw(); // 开始批量绘制
  52. while (!_kbhit()) { // 直到有键被按下
  53. cleardevice(); // 清空屏幕
  54. // 绘制渐变背景
  55. for (int i = 0; i < 480; i++) {
  56. float ratio = (float)i / 480;
  57. COLORREF bgColor = RGB(0, 0, ratio * 50);
  58. setlinecolor(bgColor);
  59. line(0, i, 640, i);
  60. }
  61. // 绘制星星
  62. for (auto& star : stars) {
  63. star.intensity += star.intensityChange;
  64. if (star.intensity > 1 || star.intensity < 0.5) {
  65. star.intensityChange = -star.intensityChange;
  66. }
  67. COLORREF modifiedColor = RGB(GetRValue(star.color) * star.intensity, GetGValue(star.color) * star.intensity, GetBValue(star.color) * star.intensity);
  68. putpixel(star.x, star.y, modifiedColor);
  69. }
  70. if (increase) {
  71. scale += 0.1;
  72. }
  73. else {
  74. scale -= 0.1;
  75. }
  76. if (scale > 15 || scale < 10) {
  77. increase = !increase;
  78. }
  79. // 改变心的颜色
  80. int r = GetRValue(heartColor);
  81. int g = GetGValue(heartColor);
  82. int b = GetBValue(heartColor);
  83. r = (r + 1) % 256;
  84. g = (g + 2) % 256;
  85. b = (b + 3) % 256;
  86. heartColor = RGB(r, g, b);
  87. DrawHeart(320, 240, heartColor, scale, angle);
  88. angle += 0.005; // 调整这个值来改变旋转速度
  89. Sleep(10);
  90. EndBatchDraw(); // 结束批量绘制,并显示在前台
  91. }
  92. closegraph();
  93. return 0;
  94. }

结果

当你运行上述代码时,你将看到一个美丽的动态背景,上面有一个不断旋转的爱心和一群闪烁的星星。通过调整参数,你可以轻松改变动画的速度、颜色和其他属性。


参考资源:

  1. EasyX 官方文档
  2. 心形参数方程
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号