美文网首页
canvas - 夜空流星

canvas - 夜空流星

作者: PharkiLL | 来源:发表于2020-06-09 15:32 被阅读0次

效果图:


image.png
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>一起来看流星雨</title>
  <script>
    var context;
    var arr = new Array();
    var starCount = 800;
    var rains = new Array();
    var rainCount = 20;
    //初始化画布及context
    function init() {
      //获取canvas
      var stars = document.getElementById("stars");
      windowWidth = window.innerWidth; //当前的窗口的高度
      stars.width = windowWidth;
      stars.height = window.innerHeight;
      //获取context
      context = stars.getContext("2d");
    }
    //创建一个星星对象
    var Star = function () {
      this.x = windowWidth * Math.random();//横坐标
      this.y = 5000 * Math.random();//纵坐标
      this.text = ".";//文本
      this.color = "white";//颜色
      //产生随机颜色
      this.getColor = function () {
        var _r = Math.random();
        if (_r < 0.5) {
          this.color = "#333";
        } else {
          this.color = "white";
        }
      }
      //初始化
      this.init = function () {
        this.getColor();
      }
      //绘制
      this.draw = function () {
        context.fillStyle = this.color;
        context.fillText(this.text, this.x, this.y);
      }
    }
    //画月亮
    function drawMoon() {
      var moon = new Image();
      moon.src = "./images/moon.jpg"
      context.drawImage(moon, -5, -10);
    }
    //页面加载的时候
    window.onload = function () {
      init();
      //画星星
      for (var i = 0; i < starCount; i++) {
        var star = new Star();
        star.init();
        star.draw();
        arr.push(star);
      }
      //画流星
      for (var i = 0; i < rainCount; i++) {
        var rain = new MeteorRain();
        rain.init();
        rain.draw();
        rains.push(rain);
      }
      drawMoon();//绘制月亮
      playStars();//绘制闪动的星星
      playRains();//绘制流星

    }
    //星星闪起来
    function playStars() {
      for (var n = 0; n < starCount; n++) {
        arr[n].getColor();
        arr[n].draw();
      }

      setTimeout("playStars()", 100);
    }

    /*流星雨开始*/
    var MeteorRain = function () {
      this.x = -1;
      this.y = -1;
      this.length = -1;//长度
      this.angle = 30; //倾斜角度
      this.width = -1;//宽度
      this.height = -1;//高度
      this.speed = 1;//速度
      this.offset_x = -1;//横轴移动偏移量
      this.offset_y = -1;//纵轴移动偏移量
      this.alpha = 1; //透明度
      this.color1 = "";//流星的色彩
      this.color2 = ""; //流星的色彩
      /****************初始化函数********************/
      this.init = function () //初始化
      {
        this.getPos();
        this.alpha = 1;//透明度
        this.getRandomColor();
        //最小长度,最大长度
        var x = Math.random() * 80 + 150;
        this.length = Math.ceil(x);
        //         x = Math.random()*10+30;
        this.angle = 30; //流星倾斜角
        x = Math.random() + 0.5;
        this.speed = Math.ceil(x); //流星的速度
        var cos = Math.cos(this.angle * 3.14 / 180);
        var sin = Math.sin(this.angle * 3.14 / 180);
        this.width = this.length * cos; //流星所占宽度
        this.height = this.length * sin;//流星所占高度
        this.offset_x = this.speed * cos;
        this.offset_y = this.speed * sin;
      }
      /**************获取随机颜色函数*****************/
      this.getRandomColor = function () {
        var a = Math.ceil(255 - 240 * Math.random());
        //中段颜色
        this.color1 = "rgba(" + a + "," + a + "," + a + ",1)";
        //结束颜色
        this.color2 = "#090723";
      }
      /***************重新计算流星坐标的函数******************/
      this.countPos = function ()//
      {
        //往左下移动,x减少,y增加
        this.x = this.x - this.offset_x;
        this.y = this.y + this.offset_y;
      }
      /*****************获取随机坐标的函数*****************/
      this.getPos = function () //
      {
        //横坐标200--1200
        this.x = Math.random() * window.innerWidth; //窗口高度
        //纵坐标小于600
        this.y = Math.random() * window.innerHeight; //窗口宽度
      }
      /****绘制流星***************************/
      this.draw = function () //绘制一个流星的函数
      {
        context.save();
        context.beginPath();
        context.lineWidth = 1; //宽度
        context.globalAlpha = this.alpha; //设置透明度
        //创建横向渐变颜色,起点坐标至终点坐标
        var line = context.createLinearGradient(this.x, this.y,
          this.x + this.width,
          this.y - this.height);
        //分段设置颜色
        line.addColorStop(0, "white");
        line.addColorStop(0.3, this.color1);
        line.addColorStop(0.6, this.color2);
        context.strokeStyle = line;
        //起点
        context.moveTo(this.x, this.y);
        //终点
        context.lineTo(this.x + this.width, this.y - this.height);
        context.closePath();
        context.stroke();
        context.restore();
      }
      this.move = function () {
        //清空流星像素
        var x = this.x + this.width - this.offset_x;
        var y = this.y - this.height;
        context.clearRect(x - 3, y - 3, this.offset_x + 5, this.offset_y + 5);
        //         context.strokeStyle="red";
        //         context.strokeRect(x,y-1,this.offset_x+1,this.offset_y+1);
        //重新计算位置,往左下移动
        this.countPos();
        //透明度增加
        this.alpha -= 0.002;
        //重绘
        this.draw();
      }
    }
    //绘制流星
    function playRains() {

      for (var n = 0; n < rainCount; n++) {
        var rain = rains[n];
        rain.move();//移动
        if (rain.y > window.innerHeight) {//超出界限后重来
          context.clearRect(rain.x, rain.y - rain.height, rain.width, rain.height);
          rains[n] = new MeteorRain();
          rains[n].init();
        }
      }
      setTimeout("playRains()", 2);
    }
 /*流星雨结束*/
  </script>
  <style type="text/css">
    body {
      background-color: #090723;
    }
    
    body,
    html {
      width: 100%;
      height: 100%;
      overflow: hidden;
    }
  </style>
</head>

<body>
  <canvas id="stars"></canvas>
</body>

</html>

相关文章

  • canvas - 夜空流星

    效果图:

  • 流星问夜空

    迷人的夜空 划过灿烂的流星, 稍纵即逝的生命 凝固着永恒的美丽。 我愿做点缀夜空的流星, 你可愿 愿做包容流星的夜...

  • 失落

    就像流星划过夜空。 流星也曾辉煌,夜空也曾美丽, 但突然,漆黑一片。 让人老大不适应。 流星落入尘埃,夜空失去宁静...

  • 用canvas画一轮明月,夜空与流星

    今天是中秋节,于是突发奇想,欸不如用canvas来画一画月亮吧。 于是一副用canvas画出的星空就这样诞生了。 ...

  • 夜空中的流星

    文丨空梦幻花 我大刀金马端坐云端 狂笑连连 手捻流星幻化天花坠人间 点起那迷城里大红灯笼万盏 城门外篝火冲天娇舞蹁...

  • 流星划过的夜空

    这是我第一次清楚地看到流星,以至于直到它彻底消失了我才反应过来。 晚上睡觉前和叶斯夫力去小溪边洗漱,...

  • 流星划过夜空

    你匆匆地来 如黑夜的流星 没人感觉你的光艳 便匆匆地去 半个世纪的人生 在生命的长度里 虽不够长 但你却无限地延伸...

  • 流星,划亮了夜空

    闪亮的一划 划痛了刚刚入睡的春天 翻个身,正浓的桃花露出来 夜也侧过身 一口一口地吐出香气 像打着十个圆的烟圈 穿...

  • 夜空中的流星

    夏日的骄阳在空中缓慢漂移 不变的是永恒的热浪侵袭 你放下所有想要轻松呼吸 却被无情地打翻在地 炎热的空气 让你心中...

  • 仰望夜空流星过

    晚风习习去暑热,篱院清凉长椅卧。 月光如水清辉洒,仰望夜空流星过。 ...

网友评论

      本文标题:canvas - 夜空流星

      本文链接:https://www.haomeiwen.com/subject/qbostktx.html