用canvas画会旋转的伞

这个例子是我在网上看到,然后仿写的。

主要用到canvas画图。

首先,需要在页面上创建一个画布

<canvas id="mycanvas" width="1200" height="600" style=""></canvas>

现在来开始画图:

先给出用到的参数:

 var ctx;
        var updown; // 上下移动
        var cwidth      = 1200;
        var cheight     = 600;
        var umbrellaArr = [];
        var updownTime  = 0;  // 上下移动计时器
        var rotateTime  = 0;  // 旋转计时器
        var origin      = 2; // 上下的原点
        var rotateAngle = 0; // 上下的原点

步骤一:创建伞对象

// umbrella
        function Umbrella(ux,uy,ucolor){
            this.x         = ux;
            this.y         = uy;
            this.fillStyle = ucolor;
            this.draw      = drawUmbrella;
            this.move      = moveUmbrella;
        }

步骤二:画伞

// draw umbrella
        function drawUmbrella(){
            // 半圆
            ctx.fillStyle = this.fillStyle;
            ctx.beginPath();
            ctx.arc(this.x,this.y,30,0,Math.PI,true);
            ctx.closePath();
            ctx.fill();

            // 伞柄
            ctx.fillRect(this.x - 1.5,this.y,1.5,40)
            ctx.beginPath()
            ctx.strokeStyle = this.fillStyle;
            ctx.arc(this.x - 5,this.y + 40,4,Math.PI,Math.PI * 2,true) // 伞钩
            ctx.stroke()
            ctx.closePath()
        }

步骤三:初始化,可以画伞了

function init(){
            ctx = document.getElementById(‘mycanvas‘).getContext(‘2d‘)
            ctx.translate(200,300) // 重置画图的原点  接下来画图都已 (200,300)位原点

            for(var i = 0;i < 10;i++){
                var umbrella = new Umbrella(i * 70, 0, "rgb(" + (30 * i) + "," + (255 - 30 * i) + ",255)")
                umbrellaArr.push(umbrella)
                umbrella.draw()
            }

        }                

下面来实现上下移动的效果

步骤四:在上下移动的效果中,伞会出现位移,所以需要创建一个moveUmbrella函数

// 移动伞
        function moveUmbrella(dx,dy){
            this.x += dx
            this.y += dy
        }

步骤四:创建上下移动函数

 function updownFunc(){

            if(updownTime % 50 == 0){
                origin = -origin
            }

            clearCanvas(-200,-300)
            updownTime ++;

            for(var i = 0; i < umbrellaArr.length;i++){
                if(i % 2 == 0){
                    umbrellaArr[i].move(0,origin)
                }else{
                    umbrellaArr[i].move(0,-origin)
                }
                umbrellaArr[i].draw()
            }

            updownTime == 100 && clearInterval(updown)

        }

步骤五:查看效果,把初始化函数改一下

function init(){
            ctx = document.getElementById(‘mycanvas‘).getContext(‘2d‘)
            ctx.translate(200,300) // 重置画图的原点  接下来画图都已 (200,300)位原点

            for(var i = 0;i < 10;i++){
                var umbrella = new Umbrella(i * 70, 0, "rgb(" + (30 * i) + "," + (255 - 30 * i) + ",255)")
                umbrellaArr.push(umbrella)
            }

            updown = setInterval(updownFunc, 100);
        }

使用window.onload()函数

window.onload = function () {
            init()
        }

下面来实现旋转效果:

步骤六:创建旋转函数

function rotateUmbrella(){
            clearCanvas(-400,-300)
            rotateTime ++;

            for(var i = 0; i < umbrellaArr.length;i++){
                ctx.save() // 保存初始的状态,方便画下一个伞
                ctx.rotate(Math.PI * (2 / 4 + i / 4))
                ctx.translate(0, rotateAngle)

                umbrellaArr[i].x = 0
                umbrellaArr[i].y = 0
                umbrellaArr[i].draw()

                ctx.restore()  // 当第i 个伞画完之后,恢复到初始的状态
            }

            rotateAngle ++;

            if(rotateAngle == 70){
                rotateAngle = -rotateAngle
            }

        }

在这里会用到清除画布的函数:

 function clearCanvas(x,y){
            ctx.clearRect(x,y,cwidth,cheight)
        }

步骤七:查看效果,把初始化的函数修改一下

function init(){
            ctx = document.getElementById(‘mycanvas‘).getContext(‘2d‘)
            ctx.translate(200,300) // 重置画图的原点  接下来画图都已 (200,300)位原点

            for(var i = 0;i < 10;i++){
                var umbrella = new Umbrella(i * 70, 0, "rgb(" + (30 * i) + "," + (255 - 30 * i) + ",255)")
                umbrellaArr.push(umbrella)
            }

            updown = setInterval(updownFunc, 100);
            setTimeout(function () { // 10s 之后  改变伞的动画
                clearInterval(updown);
                ctx.translate(300,0);//改变中心点
                setInterval(rotateUmbrella, 100);
            }, 10000);
        }

好了 ,到这里,所有的效果都已经实现了,怎么样简单吧

运行效果:http://hjjia.github.io/js_exercises/demo-canvas/umbrella.html

时间: 2024-10-17 23:43:49

用canvas画会旋转的伞的相关文章

樱花的季节,教大家用canvas画出飞舞的樱花树

又到了樱花的季节,教大家使用canvas画出飞舞的樱花树效果. 废话少说,先看效果. 演示效果地址:http://suohb.com/work/tree4.htm 查看演示效果 第一步,我们先画出一棵树的主体. 我画树的使用的原理是,定义一个起始点,从这个点开始,向一个角度移动一段距离.得到另一个点. 画出一条线连接两个点. 以新得到的点,依旧向这个角度,移动一段距离.得到第三个点,连写第二第三个点. 以此类推.一定步长之后,就得到一条射线. 我们根据自然界中的真实树的情况,这条线越来越细,直到

玩转html5(四)----使用canvas画一个时钟(可以动的哦!)

先给个效果图,我画的比较丑,大家可以自己美化一下, 直接上代码: <!DOCTYPE html> <meta charset="utf-8"> <html> <body> <canvas width="500" height="500" id="clock" > 您的浏览器不支持canvas </canvas> <script> //获取画布

canvas画随机闪烁的星星

canvas画一颗星星: 规则的星星有内切圆和外切圆,每两个点之间的角度是固定的,因此可得到星星的每个点的坐标,画出星星. 1 function drawStars(x,y,radius1,radius2,num,drawType,color){ 2 var angle = 360/(num*2); 3 var arr = []; 4 for(var i=0;i<num*2;i++){ 5 var starObj = {}; 6 if(i%2==0){ 7 starObj.x = x+radiu

canvas画圆类似于锯齿指针 angular5

拿到图的时候大致是这样的,里面的圆是有动态效果的,考虑到gif图耗资源,于是想要用canvas画出来: 仔细看图不难发现,这个锯齿圆类似于表盘,计算好弧度,不难实现: 因为项目现在用的框架是angular5,所以获取元素时,要用到ElementRef;直接引用就好: 先来看下页面: import {Component, OnInit, ElementRef, ViewChild, OnDestroy} from "@angular/core";export class LoginCom

Directx11学习笔记【十二】 画一个旋转的彩色立方体

上一次我们学习了如何画一个2D三角形,现在让我们进一步学习如何画一个旋转的彩色立方体吧. 具体流程同画三角形类似,因此不再给出完整代码了,不同的部分会再说明. 由于我们要画彩色的立方体,所以顶点结构体中加入颜色变量 struct Vertex { XMFLOAT3 pos; XMFLOAT4 color; }; 着色器代码 1 cbuffer cbPerObject 2 { 3 float4x4 gWorldViewProj; 4 }; 5 6 struct VertexIn 7 { 8 flo

html5学习(一)--canvas画时钟

利用空余时间学习一下html5. 1 <!doctype html> 2 <html> 3 <head></head> 4 <body> 5 <canvas id="clock" width="500" height="500"></canvas> 6 <script> 7 var clock=document.getElementById('cloc

html5中用canvas画八大行星围绕太阳转

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8&

Android利用canvas画各种图形

canvas通俗的说就是一张画布,我们可以使用画笔paint,在其上面画任意的图形. 原理: 可以把canvas视为Surface的替身或者接口,图形便是绘制在Surface上的.Canvas封装了所有的绘制调用.通过Canvas, 绘制到Surface上的内容首先存储到一个内存区域(也就是对应的Bitmapz中),该Bitmap最终会呈现到窗口上. 使用: 1.Canvas可以直接new Canvas(): 2.在View中重写OnDraw()方法,里面有一个Canvas,今天讨论的内容. 方

HTML5之Canvas画正方形

1.设计源码 <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>HTML5之Canvas画正方形</title> <script type="text/javascript"> function drawFour(id) { //获取canvas元素 var canvas = document.getElementById("