21xrx.com
2024-09-20 00:55:15 Friday
登录
文章检索 我的文章 写文章
C++代码编写简单的烟花效果
2023-07-09 09:16:54 深夜i     --     --
C++ 代码编写 简单烟花效果

烟花是很多人喜爱的一种视觉效果,如何使用C++编写出简单的烟花效果呢?下面我们就一起来学习。

首先,我们需要了解烟花的基本结构,烟花通常由一个圆形的火球和一些火花组成。因此,我们可以先设定一个包含火球属性的结构体,代码如下:


struct Firework ay; // 火球的加速度

  float radius; // 火球半径

  int lifetime; // 火球的存在时间

  int type; // 烟花类型;

接着,我们需要生成一个火球并让其移动和变形。为了实现这一点,我们在每个时间片中,给火球施加一些加速度,并更新其速度和位置。同时,我们还可以调整火球的半径和存在时间,达到不同的燃烧效果,代码如下:


void updateFirework(Firework* f, float dt) {

  f->vx += f->ax * dt;

  f->vy += f->ay * dt;

  f->x += f->vx * dt;

  f->y += f->vy * dt;

  f->radius *= 0.98f; // 模拟燃烧效果

  f->lifetime--; // 消耗寿命

}

接着,我们需要生成一些火花,烟花中的火花通常都是由火球爆炸产生的,我们可以在爆炸的过程中,生成一些随机方向的火花。为了简化代码,我们可以使用OpenGL提供的随机函数来生成随机方向,代码如下:


void explodeFirework(Firework* f) {

  // 产生多个随机方向的火花

  for (int i = 0; i < 100; ++i) {

    Firework fw;

    fw.x = f->x;

    fw.y = f->y;

    fw.vx = (rand() % 100 - 50) / 30.0f; // 随机横向速度

    fw.vy = (rand() % 100) / 10.0f; // 随机纵向速度

    fw.ax = 0; // 没有加速度

    fw.ay = -0.2f; // 重力加速度

    fw.radius = 4; // 火花半径

    fw.lifetime = rand() % 60 + 60; // 火花存在时间

    fw.type = f->type; // 继承父火球的类型

    fireworks.push_back(fw); // 加入火花列表

  }

}

最后,我们需要在OpenGL窗口中渲染出烟花的效果。为了实现这一点,我们可以使用OpenGL提供的绘图函数来绘制出火球和火花。代码如下:


void drawFireworks() {

  for (auto& f : fireworks) {

    if (f.lifetime > 0) {

      // 绘制火球

      if (f.type == 0) {

        glColor3f(1.0f, 0.0f, 0.0f); // 红色火球

      }

      else {

        glColor3f(0.0f, 0.0f, 1.0f); // 蓝色火球

      }

      glBegin(GL_TRIANGLE_FAN);

      for (int j = 0; j < 360; j += 10) {

        float x = f.x + f.radius * cos(j);

        float y = f.y + f.radius * sin(j);

        glVertex2f(x, y);

      }

      glEnd();

      // 更新火球和火花状态

      updateFirework(&f, 0.05f);

      if (f.lifetime <= 0) {

        explodeFirework(&f);

      }

    }

    else {

      // 绘制火花

      glColor3f(1.0f, 1.0f, 1.0f); // 白色火花

      glBegin(GL_POINTS);

      for (int j = 0; j < 10; ++j) {

        glVertex2f(f.x, f.y);

        f.x += f.vx;

        f.y += f.vy;

      }

      glEnd();

    }

  }

}

综上所述,通过上述的代码,我们就可以在OpenGL窗口中成功绘制出一个简单的烟花效果了。当然,这只是一个基础的版本,如果想要实现更加丰富的效果,还需要在其基础上进行更多的改进和优化。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复