Canvas画布之100个小球弹射源码

简介: Canvas画布之100个小球弹射源码

本文转载于,感谢大佬分享

项目文件预览 - CanvasStudy - GitCode

【基础知识】HTML5 Canvas设置Canvas元素width和height的两种不同方式(图文)_canvas.width-CSDN博客

效果展示:

 

<!DOCTYPE html>
 
<html>
<head>
    <title>Bouncing Balls运动小球</title>
 
    <meta charset="UTF-8">
 
    <style>
        body {
            background: #dddddd;
        }
 
        #canvas {
            margin-left: 10px;
            margin-top: 10px;
            background: #ffffff;
            border: thin solid #aaaaaa;
        }
 
        #glasspane {
            position: absolute;
            left: 50px;
            top: 50px;
            padding: 0px 20px 10px 10px;
            background: rgba(0, 0, 0, 0.3);
            border: thin solid rgba(0, 0, 0, 0.6);
            color: #eeeeee;
            font-family: Droid Sans, Arial, Helvetica, sans-serif;
            font-size: 12px;
            cursor: pointer;
            -webkit-box-shadow: rgba(0, 0, 0, 0.5) 5px 5px 20px;
            -moz-box-shadow: rgba(0, 0, 0, 0.5) 5px 5px 20px;
            box-shadow: rgba(0, 0, 0, 0.5) 5px 5px 20px;
        }
 
        #glasspane h2 {
            font-weight: normal;
        }
 
        #glasspane .title {
            font-size: 2em;
            color: rgba(255, 255, 0, 0.8);
        }
 
        #glasspane a:hover {
            color: yellow;
        }
 
        #glasspane a {
            text-decoration: none;
            color: #cccccc;
            font-size: 3.5em;
        }
 
        #glasspane p {
            margin: 10px;
            color: rgba(65, 65, 220, 1.0);
            font-size: 12pt;
            font-family: Palatino, Arial, Helvetica, sans-serif;
        }
    </style>
</head>
 
<body>
<!--玻璃窗格 glass pane-->
<div id='glasspane'>
    <h2 class='title'>弹射小球</h2>
 
    <p>一百个小球弹射</p>
 
    <a id='startButton'>Start</a>
</div>
 
<canvas id='canvas' width='750' height='500'>
    Canvas not supported
</canvas>
 
<script>
    var context = document.getElementById('canvas').getContext('2d'),
        startButton = document.getElementById('startButton'),
        glasspane = document.getElementById('glasspane'),
        paused = true,
        circles = [];
 
    drawGird(context, 'lightgray', 10, 10);
 
    context.lineWidth = 0.5;
    context.font = '32pt Ariel';
 
    //给100个小球设置不同的方向,半径,颜色
    for (var i = 0; i < 100; i++) {
        circles[i] = {
            x: 100,
            y: 100,
            //向x方向移动的像素
            velocityX: 3 * Math.random(),
            velocityY: 3 * Math.random(),
            radius: 50 * Math.random(),
            color: 'rgba(' + (Math.random() * 255).toFixed(0) + ',' +
                (Math.random() * 255).toFixed(0) + ',' +
                (Math.random() * 255).toFixed(0) + ',1.0)'
        };
    }
 
    startButton.onclick = function (ev) {
        //取消默认行为
        ev.preventDefault();
        //阻止冒泡
        ev.stopPropagation();
        paused = !paused;
        startButton.innerText = paused ? '启动' : '暂停';
    };
 
    glasspane.onmousedown = function (ev) {
        ev.preventDefault();
        ev.stopPropagation();
    };
 
    context.canvas.onmousedown = function (ev) {
        ev.preventDefault();
        ev.stopPropagation();
    };
 
    setInterval(function () {
        if (!paused) {
            context.clearRect(0, 0, context.canvas.width, context.canvas.height);
            drawGird(context, 'lightgray', 10, 10);
 
            circles.forEach(function (circle) {
                context.beginPath();
                context.arc(circle.x, circle.y, circle.radius,
                    0, Math.PI * 2, false);
                context.fillStyle = circle.color;
                context.fill();
                adjustPosition(circle);
 
 
            });
        }
    }, 1000 / 60);
 
    /**
     * 调整每个球的位置,如果触碰到边缘,就调整方向
     * @param circle
     */
    function adjustPosition(circle) {
        if (circle.x + circle.velocityX + circle.radius > context.canvas.width || circle.x - circle.radius + circle.velocityX<0)
            circle.velocityX = -circle.velocityX;
 
        if (circle.y + circle.velocityY + circle.radius > context.canvas.height || circle.y - circle.radius + circle.velocityY<0)
            circle.velocityY = -circle.velocityY;
 
        circle.x += circle.velocityX;
        circle.y += circle.velocityY;
    }
 
    /**
     * 画网格线
     * @param context
     * @param color
     * @param stepX X方向网格间距
     * @param stepY Y方向网格间距
     */
    function drawGird(context,color,stepX,stepY) {
        context.strokeStyle = color;
        context.lineWidth = 0.5;
 
        for (var i = stepX+0.5;i<context.canvas.width;i+=stepX){
            context.beginPath();
            context.moveTo(i,0);
            context.lineTo(i, context.canvas.height);
            context.stroke();
        }
 
        for (var i = stepY + 0.5; i < context.canvas.height; i+=stepY) {
            context.beginPath();
            context.moveTo(0, i);
            context.lineTo(context.canvas.width, i);
            context.stroke();
        }
    }
</script>
</body>
</html>
相关文章
|
2月前
|
前端开发
|
2天前
|
前端开发
Canvas添加了橡皮擦工具的画板项目和只能画圆的源码
Canvas添加了橡皮擦工具的画板项目和只能画圆的源码
|
2月前
|
前端开发
canvas详解04-绘制文字
canvas详解04-绘制文字
38 2
canvas详解04-绘制文字
|
11月前
|
移动开发 前端开发 JavaScript
使用Canvas绘制图形和动画
使用Canvas绘制图形和动画
152 0
|
12月前
|
前端开发
canvas画布实现代码雨
canvas画布实现代码雨
76 0
|
12月前
|
XML 前端开发 Java
用Canvas绘制一个数字键盘
用Canvas轻轻松松搞一个数字键盘,本身没什么难度,这种效果实现的方式也是多种多样,这篇只是其中的一种,要说本篇有什么特别之处,可能就是纯绘制,没有用到其它的任何资源,一个类就搞定了。
|
前端开发
canvas绘制五角星
canvas绘制五角星
150 0
|
前端开发
Canvas绘制圆形头像
Canvas绘制圆形头像
208 0
Canvas绘制圆形头像
|
前端开发
Canvas画笔的基本使用
Canvas画笔的基本使用
175 0
Canvas画笔的基本使用
|
前端开发
用canvas绘制一个烟花动画
前言 在我们日常开发中贝塞尔曲线无处不在: svg 中的曲线(支持 2阶、 3阶) canvas 中绘制贝塞尔曲线 几乎所有前端2D或3D图形图表库(echarts,d3,three.js)都会使用到贝塞尔曲线 所以掌握贝塞尔曲线势在必得。这篇文章主要是实战篇,不会介绍和贝塞尔相关的知识, 如果有同学对贝塞尔曲线不是很清楚的话:可以查看我这篇文章——深入理解SVG 绘制贝塞尔曲线 第一步我们先创建ctx, 用ctx 画一个二阶贝塞尔曲线看下。二阶贝塞尔曲线有1个控制点,一个起点,一个终点。 const canvas = document.getElementById( 'canvas'
用canvas绘制一个烟花动画