zoukankan      html  css  js  c++  java
  • canvas绘图基础及基于粒子系统的雪花飘落

    canvas是html中的一个元素,可以通过js操控绘图!

    可以绘制各种图形,各种填充样式! 

    绘制时可以进行旋转,缩放,平移,但并不是很灵活!

    有一对比较好用的方法是save restore!

    save 与 restore的作用并不是保存图像,而是恢复到之前的偏移,旋转,缩放状态!

    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        </head>
        <body>
        <script>
                //全局变量
                var canvas = document.createElement('canvas');
                var canvasContext = canvas.getContext('2d');
                var canvasWidth = window.innerWidth;
                var canvasHeight = window.innerHeight;
                init();
                function init(){
                    document.body.appendChild(canvas);
                    canvas.width = canvasWidth;
                    canvas.height = canvasHeight;
                    canvas.setAttribute('style','background:black;border:5px solid red');//设置边框
                }
                
                /**绘制矩形快
                 * in_fileStyle  颜色; 
                 * in_x,in_y     左上角坐标
                 * in_width,in_height    宽度和高度
                 */
                function drawRect(in_fileStyle,in_x,in_y,in_width,in_height){
                    canvasContext.fillStyle=in_fileStyle;
                    canvasContext.fillRect(in_x,in_y,in_width,in_height);
                }
                
                /**绘制线条
                 * in_fileStyle  颜色; 
                 * in_x1,in_y1   起点坐标; 
                 * in_x2,in_y2   终点坐标;
                 * in_size       线条宽度
                 */
                function drawLine(in_fileStyle,in_x1,in_y1,in_x2,in_y2,in_size){
                    canvasContext.beginPath();//重置当前路径 或 开始一条路径
                    canvasContext.strokeStyle=in_fileStyle;
                    canvasContext.lineWidth=in_size;
                    canvasContext.moveTo(in_x1,in_y1);
                    canvasContext.lineTo(in_x2,in_y2);
                    canvasContext.stroke();//绘制
                }
                /**绘制圆圈或实心圆
                 * in_fileStyle  颜色;
                 * in_x,in_y      圆心坐标
                 * in_r             半径
                 * in_startAngle,in_endAngle    起始角度,结束角度
                 * in_size         宽度
                 */
                function drawCircle(in_fileStyle,in_x,in_y,in_r,in_startAngle,in_endAngle,in_size){
                    canvasContext.beginPath();
                    canvasContext.strokeStyle=in_fileStyle;
                    canvasContext.lineWidth=in_size;
                    canvasContext.arc(in_x,in_y,in_r,in_startAngle,in_endAngle);
                    canvasContext.stroke();//绘制
                }
                /**绘制文字
                 * in_fileStyle  颜色;
                 * in_x,in_y      左下角坐标
                 * in_size         大小
                 * in_fontType     字体
                 * in_isSolid     是否填充 true or false
                 * in_text         内容
                 * in_lineSize     线条宽度
                 **/
                 function drawText(in_fileStyle,in_x,in_y,in_size,in_fontType,in_isSolid,in_text,in_lineSize){
                    canvasContext.strokeStyle=in_fileStyle;
                    canvasContext.fillStyle=in_fileStyle;
                    canvasContext.font=in_size + "px " + in_fontType;
                    if(in_isSolid==true){
                        canvasContext.fillText(in_text,in_x,in_y);
                    }else{
                        canvasContext.lineWidth=in_lineSize;
                        canvasContext.strokeText(in_text,in_x,in_y);
                    }
                 }
                 
                 /**
                  * 绘制图像,目前此函数是异步绘制,对图层次序不能控制
                  */
                 function drawImge(in_url,in_x,in_y,in_width,in_height){
                    var stop = false;
                    var img=new Image();
                    img.src=in_url;
                    img.onload = function(){
                        canvasContext.drawImage(img,in_x,in_y,in_width,in_height);
                    };
                 }
                /*drawRect("rgba(255,0,0,1)",30,30,720,700);
                drawLine("#FF0000",10,10,720,400,13);
                drawCircle("#00F0F0",300,300,50,0,2*Math.PI,100);
                drawText("#00F0F0",400,500,100,"Arial",false,"HELLO",4);
                drawImge("imges/snow.png",0,0,200,200);*/
                
                //随机产生雪花
                var snows=[];    //雪花数组
                function productSnow(){
                    // clear the canvas
                    canvasContext.fillStyle = "rgba(0,0,0,1)";
                    canvasContext.fillRect(0,0, canvasWidth, canvasHeight);
                    var snow = new oneSnow(Math.random()*canvasWidth, Math.random()*canvasHeight*0.3,100);
                    snows.push(snow);
                    if(snows.length > 100){    //只保留二十个雪花
                        snows.shift();        //删除第一个雪花
                    }
                    //绘制数组中的每一个雪花
                    for(var i=0;i<snows.length;i++){
                        snows[i].showSnow().moveToDown();
                    }
                }
                //定义一个雪花
                function oneSnow(positionX,positionY,snowSize){
                    this.x=positionX;
                    this.y=positionY;
                    this.size=snowSize;
                    
                    //向下运动 y坐标大
                    this.moveToDown=function(){this.y=this.y+5}
                    //显示
                    this.showSnow = function(){
                        drawImge("imges/snow.png",this.x, this.y,this.size,this.size);
                        //drawCircle("#00F0F0",this.x,this.y,10,0,2*Math.PI,20);
                        return this;
                    }
                }
                setInterval(productSnow,1000/150);//每个1/3秒调用一次productSnow函数
        </script>
        </body>
    </html>
    雪花
  • 相关阅读:
    Android Tween和Frame 动画
    Android Tween和Frame 动画
    android:descendantFocusability用法简析
    android:descendantFocusability用法简析
    CodeForces 686A Free Ice Cream (水题模拟)
    UVa 11136 Hoax or what (STL)
    UVa 1616 Caravan Robbers (二分+贪心)
    UVa 10570 Meeting with Aliens (暴力)
    UVa 1153 Keep the Customer Satisfied (贪心+优先队列)
    HDU 2044 一只小蜜蜂...(递推,Fibonacci)
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6196044.html
Copyright © 2011-2022 走看看