前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用canvas制作彩虹球喷枪(js面向对象小案例)

用canvas制作彩虹球喷枪(js面向对象小案例)

作者头像
剽悍一小兔
发布2018-05-17 14:36:54
1.7K0
发布2018-05-17 14:36:54
举报

前段时间在研究canvas,感觉还挺好玩的,就写了一个小demo,效果如下:

canvas.gif

第一次尝试用js面向对象的方式来写,经验不足,还请大家多多包涵。

下面开始简单介绍代码:

canvas画布:

代码语言:javascript
复制
<canvas id='canvas' width='1050' height='500' style='background:#333;overflow: hidden;'></canvas>

彩虹球的随机颜色是通过下面两个方法来实现的,在《js常用方法和一些封装(2) -- 随机数生成》中曾经提到过。

代码语言:javascript
复制
/**
 * 获取 0 ~ num的随机数(闭区间)
 */
function randomNum(num){
    return Math.floor(Math.random()*(num+1));
};

/**
 *  获取随机颜色(支持任意浏览器)
 */
function randomColor16(){
    //0-255 
    var r = randomNum(255).toString(16);
    var g = randomNum(255).toString(16);
    var b = randomNum(255).toString(16);
    //255的数字转换成十六进制
    if(r.length<2)r = "0"+r;
    if(g.length<2)g = "0"+g;
    if(b.length<2)b = "0"+b;
    return "#"+r+g+b;
};

每当我鼠标点下,其实是在一个矩形区域随机产生不同颜色的彩虹球,彩虹球出现的位置也是随机的,通过范围随机数来实现:

代码语言:javascript
复制
/*
 * 获取范围随机数 (闭区间)
 */
function randomRange(start,end){
    return Math.floor(Math.random()*(end-start+1))+start;
};

接下来是彩虹球的类,用面向对象来做。

代码语言:javascript
复制
//彩虹球的类
var ColorBall = function(){}

ColorBall.prototype.left = 0; //X轴
ColorBall.prototype.top = 0;  //y轴
ColorBall.prototype.r = 10;   //半径

在本案例中,鼠标相当于是彩虹球喷枪,我们也用面向对象的思想来设计它:

代码语言:javascript
复制
//RainbowBrush 彩虹球喷枪
RainbowBrush = function(){}

//生产小球数组的方法
RainbowBrush.prototype.getBalls = function(num){
    var colorBalls = [];
    for(var i = 0; i < num; i++){
        var ball = new ColorBall();
        colorBalls.push(ball);
    }
    return colorBalls;
}

//喷刷彩虹球
RainbowBrush.prototype.brush = function(context,balls,x,y){
    balls.forEach(function(ballIem){
        ballIem.x = randomRange(x - 6,x + 6);
        ballIem.y = randomRange(y - 6,y + 6);
        ballIem.r = 5;
        
        context.beginPath();
        context.fillStyle=randomColor16();
        context.arc(ballIem.x,ballIem.y,ballIem.r,0,Math.PI*2);
        context.fill();
    })
    
}

它有两个方法,一个是生产彩虹球,另一个是喷刷彩虹球。

案例的主要逻辑如下:

代码语言:javascript
复制
var rainbowBrush = new RainbowBrush(); //初始化彩虹球喷枪
var balls = rainbowBrush.getBalls(1);

//当鼠标按下
canvasDom.onmousedown = function(){
    var flag = true;
    canvasDom.onmousemove = function(e){
        var x = e.clientX;
        var y = e.clientY;
        if(flag) rainbowBrush.brush(context,balls,x,y);
    }
    
    canvasDom.onmouseup = function(){
        flag = false;
    }
}

案例全部代码:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>彩虹球喷枪</title>
    </head>
    <body>
        <canvas id='canvas' width='1050' height='500' style='background:#333;overflow: hidden;'></canvas>
        
    </body>
    
    <script type="text/javascript">
    
        /**
         * 获取 0 ~ num的随机数(闭区间)
         */
        function randomNum(num){
            return Math.floor(Math.random()*(num+1));
        };

        /*
         * 获取范围随机数 (闭区间)
         */
        function randomRange(start,end){
            return Math.floor(Math.random()*(end-start+1))+start;
        };
        
        
        /**
         *  获取随机颜色(支持任意浏览器)
         */
        function randomColor16(){
            //0-255 
            var r = randomNum(255).toString(16);
            var g = randomNum(255).toString(16);
            var b = randomNum(255).toString(16);
            //255的数字转换成十六进制
            if(r.length<2)r = "0"+r;
            if(g.length<2)g = "0"+g;
            if(b.length<2)b = "0"+b;
            return "#"+r+g+b;
        };
        
        var canvasDom = document.getElementById('canvas');
        var context = canvasDom.getContext('2d');
        var maxWidth = 1050;
        var maxHeight = 500;
        

        //彩虹球的类
        var ColorBall = function(){}
        
        ColorBall.prototype.left = 0; //X轴
        ColorBall.prototype.top = 0;  //y轴
        ColorBall.prototype.r = 10;   //半径
        
        //RainbowBrush 彩虹球喷枪
        RainbowBrush = function(){}
        
        //生产小球数组的方法
        RainbowBrush.prototype.getBalls = function(num){
            var colorBalls = [];
            for(var i = 0; i < num; i++){
                var ball = new ColorBall();
                colorBalls.push(ball);
            }
            return colorBalls;
        }
        
        //喷刷彩虹球
        RainbowBrush.prototype.brush = function(context,balls,x,y){
            balls.forEach(function(ballIem){
                ballIem.x = randomRange(x - 6,x + 6);
                ballIem.y = randomRange(y - 6,y + 6);
                ballIem.r = 5;
                
                context.beginPath();
                context.fillStyle=randomColor16();
                context.arc(ballIem.x,ballIem.y,ballIem.r,0,Math.PI*2);
                context.fill();
            })
            
        }
        
        var rainbowBrush = new RainbowBrush(); //初始化彩虹球喷枪
        var balls = rainbowBrush.getBalls(1);

        //当鼠标按下
        canvasDom.onmousedown = function(){
            var flag = true;
            canvasDom.onmousemove = function(e){
                var x = e.clientX;
                var y = e.clientY;
                if(flag) rainbowBrush.brush(context,balls,x,y);
            }
            
            canvasDom.onmouseup = function(){
                flag = false;
            }
        }
        
        
        
    </script>
</html>

【资源】文章,代码与素材汇总

免责声明: 博客中所有的图片素材均来自百度搜索,仅供学习交流,如有问题请联系我,侵立删,谢谢。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.09.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档