`
xinyu198736
  • 浏览: 17576 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

HTML5尝鲜(让canvas像flash一样工作,从而制作复杂的动画)

阅读更多

效果和源码:(本代码使用了本人自己的js框架,自己修改代码的话,请务必引用我试用的框架,否则会出现错误)

(请务必试用非ie浏览器浏览,极力推荐Safari和chrome,其他浏览器运行速度堪忧)

 

http://www.beiju123.cn/blog/wp-content/uploads/2010/02/canvas-demo.html

 

1.什么是canvas:

引用Firefox开发者中心的一段话:<canvas> is a new HTML element which can be used to draw graphics using scripting (usuallyJavaScript). It can for instance be used to draw graphs, make photo compositions or do simple (and not so simple) animations. The image on the right shows some examples of <canvas>implementations which we will see later in this tutorial.

注意,canvas主要是用来画图的,而不是注重动画,所以在canvas中没有帧的概念,没有精灵(Sprite)的概念,flash中的概念在canvas中很多都不存在.

canvas说白了,就是给js加了几个对象,多了几个方法.并不是一个独立的东西,应该说是JavaScript的一点点补充.就跟其他编程语言中的graphic对象差不多,提供了画基本图形和路径,图像,提供了颜色和样式管理.

更多关于canvas的基础,见https://developer.mozilla.org/en/Canvas_tutorial(英文版)

 


2.基本的动画:

可能很多人会嚼的我这篇文章纯属多余,既然能够画图,那加上一个定时器不就是动画了嘛?

是的,如果你只是想在画布上画出一个圆或者矩形,然后让它动起来的话,那这么做无疑是可以得出结果的.代码也很简单,如下:

var x=0;
    var y=0;
    var ctx = document.getElementById('canvas').getContext('2d');
    setInterval(function(){
        ctx.clearRect(0,0,800,800);//清除画布某某个范围内的内容,参数分别为x,y,宽度,高度
        ctx.fillStyle = '#FFF'//设置颜色
        ctx.fillRect(x++,y++,50,50)//画一个矩形,参数为:x,y,宽,高
    })

效果就是一个方块在画布上向右下角移动.


3.升级需求:

动画往往不是如此简单,在flash里,复杂的动画里会包含很多元素,有剪辑,有精灵,他们之间还有包含关系,我们可以单独控制某个元素的移动,控制速度,控制属性.flash里有帧,我们可以在帧上放置元素,控制帧速.最重要的,做复杂的动画的时候,我们需要把每个元素抽象成一个完整的对象,例如:一个人对象啊,我们需要控制它走动,控制它攻击.

可是在canvas里面,图形并不是一个对象,在整个canvas元素里,有且只有只有一个画布的对象(多次创建的话,只会创建一个引用),如果想把里面的图形作为对象来控制的话,上面的动画方法就做不到了.这个时候,考虑一下flash的工作原理,我想出了如下的解决方案.


4.让画布里的图形变成可以控制的对象:

我们现在需要一种新的方法,这种方法可以让画布上的元素变成可以单独控制的对象.而画布上其实只有一个对象,怎么让它能承载多个动画对象呢?

我们想想flash的工作原理吧,flash中最基本的两个东西,一个是帧,一个是精灵(Sprite).下面我们就给我们的动画程序添加这两个概念.

首先是帧,我们通过一个定时器,每隔一段时间就重画一下画布,在这段时间里我们改变画布上的元素的位置,这样就是最基本的帧了.

然后现在问题就是如何控制画布上元素的属性呢?我们把画布上所有要用到的动画元素都抽象出来,每个元素都抽象成一个对象,这个对象拥有位置和大小,速度等信息.然后在每一帧重画画布的时候,我们遍历这些对象,调用它们自己的draw方法,让它们根据自己的属性把自己画到画布上.我们将这些元素统称为Sprite,也就是动画精灵.

现在,我们就可以控制这些动画元素了,因为它们都被抽象成了对象,可以有自己的属性和方法,他们都要实现一个接口.虽然在js中不存在接口的概念,但是我们要自己去衡量在每个扩展的精灵里是否都实现了接口的方法.因为这些方法都是必须的.我们把这个接口定义成如下的样子:

 /**
     * 精灵对象,类似flash(ActionScript3.0)中的精灵.
     * 所有的动画元素都必须继承自此对象,继承之后自动拥有move方法和速度属性
     * 每个动画元素都必须拥有一个自己的特殊的draw()方法的实现,这个方法用来在渲染每一帧的时候指定自己如何呈现在canvas帧画布上
     * 注意这个所谓的"帧画布"不是指原生的canvas元素,而是指下面定义的一个Canvas对象,此对象的意义就是一个帧,它负责把需要在这一帧上呈现的
     * 图形画在canvas上,然后每一帧开始的时候都会清除上次画的,类似flash中的帧概念
     *
     * 
     */
    var Sprite=function(){
        this.speed={
            x:1,
            y:1
        }
    }
    Sprite.prototype={
        /**
         *每个精灵都必须有自己的draw实现
         */
        draw:function(){

        },
        /**
         *无需单独实现,通用的动画函数
         */
        move:function(){
            this.x+=this.speed.x;
            this.y+=this.speed.y;
            if(this.childs!=null&&this.childs.length>0){
                for(var i=0;i<this.childs.length;i++){
                    this.childs[i].speed=this.speed;
                    this.childs[i].move();
                }
            }
        },
        /**
         *向此精灵添加一个子精灵
         */
        appendChild:function(sprite){
            if(this.childs==null) this.childs=[]
            this.childs.push(sprite)
        },
        /**
         *渲染子精灵
         */
        drawChild:function(){
            if(this.childs!=null&&this.childs.length>0){
                for(var i=0;i<this.childs.length;i++){
                    this.childs[i].draw();
                }
            }
        }
    }

下面定义一个帧的对象,我们将其命名为:Canvas.

/**
     *帧对象,每隔一段时间重画自己一次,类似flash中的帧概念
     *原理就是每到一定时间就清除canvas,然后调用当前帧里的所有的动画元素的draw()方法,将所有动画元素按照新的配置重画
     *从而生成动画,之后程序无需关心元素的重画,只需要调整元素属性即可,这个对象会自动管理元素的渲染
     *
     */
    var Canvas=function(){
        this.interval=null;
        this.sprites=[]
    }
    /**
     *
     */
    Canvas.prototype={
        /**
         * 开始动画
         */
        begin:function(){
            this.interval=setInterval((function(param){
                return function(){param.render();}
            })(this),20);
        },
        /**
         *渲染
         */
        render:function(){
            //    M.trace(this.sprites.length)
            this.ctx.clearRect(-800, -800, 1600, 1600)
            for(var i in this.sprites){
                if(typeof(this.sprites[i])=="function") continue;
                this.sprites[i].draw();
            }
        },
        /**
         *添加动画元素
         */
        addSprite:function(name,sprite){
            this.sprites[name]=sprite;
        },
        /**
         * 停止动画
         */
        stop:function(){
            clearInterval(this.interval)
        },
        clear:function(){
            for(var i in this.sprites){
                if(typeof(this.sprites[i])=="function") continue;
                if(this.sprites[i].x>800&&this.sprites[i].y>800){
                    delete this.sprites[i]
                }
            }
        }
    }

上面两个对象:精灵和帧.是本文讨论中的重点,有了他们,我们就可以开始组建我们的高级动画程序了.


5.开始我们的动画之旅吧:

基础有了,那我们就开始构建动画吧,首先注意上面两个对象,其中的精灵并不是真实的对象,而只是提供一个类似接口的东东,如果我们想构建动画的话,我们需要构建一个继承自精灵的真正的对象.

下面,我们构建一个圆环对象,然后实例化多个圆环对象,之后控制这些实例的运作:

 /**
     * 圆对象
     *
     * @param {Content2d} 一个canvas实例
     * @param {number} 初始x坐标
     * @param {number} 初始y坐标
     * @param {number} 半径
     * @param {json} 配置信息
     */
    var Circle=function(ctx,x,y,radius,config){
        this.ctx=ctx;
        this.x=x;
        this.y=y;
        this.radius=radius;
        this.config={
            strokeStyle:"#000",
            lineWidth:"1"
        }
        M.dom.mixin(this.config, config)
    }
    Circle.prototype=new Sprite();
    /**
     *draw方法的实现
     */
    Circle.prototype.draw=function(){
        this.ctx.beginPath();
        this.ctx.lineWidth = this.config.lineWidth;
        this.ctx.strokeStyle =this.config.strokeStyle;
        this.ctx.arc(this.x,this.y,this.radius,0,Math.PI*2,true)
        this.ctx.stroke();
        this.drawChild();
    }

这就是一个基础的圆环的对象,当然你可以给它添加其他任何属性和方法来使它看起来和动起来像一个真正的"对象"(智能对象?)

下面是重要的一步,通过这一步我们在画布上产生100个圆环,它们的位置会是随机的,而且它们向着不同的方向前进:

首先,我们初始化我们的动画程序:

    var ctx=$("canvas").getContext('2d');
    var can=new Canvas();
    can.ctx=ctx;
    can.begin();//开始渲染
    setInterval(function(){
        for(var i in can.sprites){
            if(typeof(can.sprites[i])=="function") continue;
            can.sprites[i].move()
        }
    },20)//这里就是帧速了,这里是50帧每秒

然后我们创建100个圆环:

    for(var i=0;i<100;i++){
        var circle=new Circle(ctx,0,0,m.random(30))
        circle.speed={x:Math.random(4),y:Math.random(4)}
        can.addSprite(i, circle)
    }

如果此时打开此网页,你会发现一百个圆环从原点处开始向右下角移动了.速度不同,方向不同,俨然一群小生命.俨然一群真正的对象.

具体原理,请揣摩源代码:


6.其他

我在程序里还添加了一个特性,让精灵有了层级的概念,类似flash中的剪辑,当然还很不完善,只是做个演示,这里也就不介绍如何使用了,回头我还要好好修改一下,让精灵变成影片剪辑的概念.这样才能创作出更加复杂的动画

回头等先做个游戏演示一下.canvas看起来简单,其实要想做出大型的东西来还是需要好好思考的.

后期还会写文章介绍,感兴趣的可以关注一下.

  • 大小: 15.1 KB
2
1
分享到:
评论

相关推荐

    HTML5尝鲜(让canvas像flash一样工作,从而制作复杂的动画 pdf

    HTML5尝鲜(让canvas像flash一样工作,从而制作复杂的动画

    HTML5 Canvas, flash version

    HTML5 Canvas是Web开发中的一个关键技术,它允许开发者在网页上进行动态图形绘制,从而创造出丰富的交互式用户体验。Canvas元素是HTML5标准的一部分,通过JavaScript API提供了强大的绘图能力,可以用于创建图表、...

    html5 canvas模仿flash的简单动画banner Demo

    - 动画效果:Flash以其强大的动画制作能力闻名,HTML5 Canvas可以实现类似的效果,如形状变形、移动、淡入淡出等。 - 事件交互:Canvas可以通过监听`mousedown`, `mouseup`, `mousemove`等事件,实现与用户的交互...

    HTML5Canvas雪花动画特效代码

    这款"HTML5 Canvas雪花动画特效代码"正是利用了这一特性,为用户创造出一个逼真的雪花飘落场景,增添了动态视觉效果,常用于网站背景或者节日主题设计。 在HTML5中,`&lt;canvas&gt;`元素是一个矩形区域,我们可以在这个...

    HTML5 Canvas全屏背景动画特效

    在这个“HTML5 Canvas全屏背景动画特效”的主题中,我们将深入探讨如何利用Canvas来创建引人注目的全屏动画背景,以及相关的编程技术和实践技巧。 一、Canvas基础 1. Canvas元素:HTML5引入的Canvas是一个二维绘图...

    html5 canvas小人跳舞动画特效

    总的来说,"html5 canvas小人跳舞动画特效"是一个综合性的项目,涵盖了Canvas API的基础使用,包括图形绘制、动画制作、用户交互以及可能的物理模拟。通过学习这个特效,开发者可以提升在Web前端领域的技能,更好地...

    html5 canvas多层波浪背景动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上直接绘制图形,从而创建出丰富的交互式用户体验。在本示例中,“html5 canvas多层波浪背景动画特效”是一个利用Canvas API实现的动态视觉效果,它可以...

    基于html5 canvas实现的飘动的爱心心形动画特效

    这个压缩包文件“html5-canvas-code”很可能包含了实现这种动画效果的源代码,你可以通过查看和学习代码来深入了解如何用HTML5 Canvas制作飘动的爱心动画。通过深入研究和实践,你可以掌握更多关于Canvas动画的知识...

    html5 canvas模拟满天星空背景动画特效

    在HTML5 Canvas中,我们可以通过JavaScript控制画布上的每一个像素,从而实现各种复杂的动画效果。在这个特效中,主要涉及以下几个关键知识点: 1. **Canvas元素**:HTML5中的`&lt;canvas&gt;`元素是图形绘制的基础,它...

    HTML5 Canvas五彩缤纷的3D发光水晶球动画

    HTML5 Canvas是一个强大的Web图形库,它允许开发者在网页上直接用JavaScript绘制图像,从而创建出丰富的交互式2D和3D图形。在这个名为“HTML5 Canvas五彩缤纷的3D发光水晶球动画”的项目中,我们将深入探讨如何利用...

    HTML5 Canvas彩色渐变背景动画效果

    HTML5 Canvas是一个强大的Web图形接口,它允许开发者在网页上直接绘制图形,...同时,掌握Canvas API对于现代Web开发者来说是一项重要的技能,因为它可以让我们在不依赖额外插件的情况下创建出富有创意的图形和动画。

    html5 canvas制作3D飞行的飞机动画特效

    在这个特定的案例中,“html5 canvas制作3D飞行的飞机动画特效”是一个涉及到JavaScript编程、Canvas API以及可能的WebGL技术的主题。我们将深入探讨这些关键知识点。 1. HTML5 Canvas: HTML5 Canvas是一个基于...

    HTML5 Canvas核心技术源码技术代码

    HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas...

    HTML5 Canvas透明丝带飘动背景动画特效

    在这个特定的案例中,“HTML5 Canvas透明丝带飘动背景动画特效”是一个利用Canvas API实现的优雅视觉效果,它通过流动的线条来模拟丝带在空中飘动的情景,为网站增添了一种动态且梦幻的氛围。 首先,让我们深入了解...

    HTML5 canvas宇宙中星云动画背景特效

    HTML5 canvas是现代网页开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,提供了丰富的绘图功能,使得创建交互式和动画效果成为可能。在这个特定的案例中,“HTML5 canvas宇宙中星云动画背景特效”是一...

    Html5——Canvas实例(制作太阳地球月球三球联动动画)

    在这个实例中,我们将深入探讨如何利用Canvas来制作一个太阳、地球和月球三球联动的动画,这涉及到JavaScript编程以及Canvas API的使用。 首先,Canvas是一个二维绘图上下文,通过JavaScript来控制其行为。在HTML文...

    html5 canvas云粒子数字时钟动画特效

    在这个“html5 canvas云粒子数字时钟动画特效”中,我们看到的是Canvas技术与时间显示、粒子系统相结合的应用实例。下面将详细阐述相关知识点。 1. HTML5 Canvas API: HTML5 Canvas是一个基于矢量图形的画布,...

    html5 canvas制作3D逼真冬天雪景雪花飘洒动画特效

    在这个具体的案例中,“html5 canvas制作3D逼真冬天雪景雪花飘洒动画特效”是一个利用HTML5 Canvas实现的互动式场景,为用户呈现了一个栩栩如生的冬季雪景。下面我们将深入探讨这个主题,解析其背后的技术知识点。 ...

    HTML5 Canvas龙卷风动画特效

    在这个“HTML5 Canvas龙卷风动画特效”项目中,开发者使用了Canvas API结合three.js库来实现了一种模拟龙卷风效果的动画。 首先,我们要理解HTML5 Canvas的基本概念。Canvas是一个HTML元素,通过JavaScript可以控制...

    jQuery HTML5 canvas制作头条新闻动画报纸翻转

    在本文中,我们将深入探讨如何使用jQuery、HTML5和canvas技术来创建一个生动有趣的头条新闻动画,模拟报纸翻转的效果。这个技术结合了前端开发的三大核心元素,为用户提供了一个富有交互性和视觉吸引力的用户体验。 ...

Global site tag (gtag.js) - Google Analytics