canvas 之 - 精灵 钟表动画

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
#canvas { border:solid 1px #ccc;}
</style>
</head>
<script src="sprite.js"></script>

<body>
<canvas id="canvas" width="600" height="600"></canvas>

<script>

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d"),
CLOCK_RADIUS = canvas.width/2 -15 ,
hour_hand_truncation =35,
ballPainter = {   //画小球
    paint:function(sprite,context){
        var x =sprite.left +sprite.width/2,
        y = sprite.top +sprite.height/2,
        width = sprite.width,
        height = sprite.height,
        radius = sprite.width/2;
        context.save();
        context.beginPath();
        context.arc(x,y,radius,0,Math.PI*2,false);
        context.clip();

        context.shadowColor = "rgb(0,0,0)";
        context.shadowOffsetX = -4;
        context.shadowOffsetY = -4;
        context.shadowBlur = 8;

        context.fillStyle = "rgba(218,165,32,0.1)";
        context.fill();

        context.lineWidth =2;
        context.strokeStyle = "rgb(100,100,195)";
        context.stroke();
        context.restore();
        }
    },
ball =  new Sprite("ball",ballPainter);

// 画网格
function drawGrid(color,stepx,stepy){
    context.strokeStyle = color;
    context.lineWidth =0.5;
    for(var i =stepx +0.5;i<canvas.width;i+=stepx){
        context.beginPath();
        context.moveTo(i,0);
        context.lineTo(i,canvas.height);
        context.stroke();
        }
    for(var  i =stepx +0.5;i<canvas.height;i+=stepx){
        context.beginPath();
        context.moveTo(0,i);
        context.lineTo(canvas.width,i);
        context.stroke();
        }
    }
//画指针函数
function drawHand(loc,isHour){
    var angle = (Math.PI *2 )*(loc/60) - Math.PI/2,
    handRadius = isHour ? CLOCK_RADIUS - hour_hand_truncation : CLOCK_RADIUS,

    lineEnd = {
        x:canvas.width/2 + Math.cos(angle)*(handRadius - ball.width /2),

        y:canvas.height/2 +Math.sin(angle)*(handRadius - ball.width /2)
        };
    context.beginPath();
    context.moveTo(canvas.width/2,canvas.height/2);
    context.lineTo(lineEnd.x , lineEnd.y);
    context.stroke();

    ball.left = canvas.width/2 + Math.cos(angle)*handRadius - ball.width/2;
    ball.top = canvas.height/2 + Math.sin(angle)*handRadius - ball.height/2;

    ball.paint(context);
}

function drawClock (){
    drawClockFace();
    drawHands();
    }
// 画多个指针
function drawHands(){
    var date = new Date(),
    hour = date.getHours();

    ball.width = 20;
    ball.height =20;
    drawHand(date.getSeconds(),false);

    hour = hour >12 ? hour -12 :hour ;
    ball.width = 35;
    ball.height = 35 ;
    drawHand(date.getMinutes() ,false );

    ball.width =50;
    ball.height =50;
    drawHand(hour*5 +(date.getMinutes()/60)*5);

    ball.width =10;
    ball.height =10 ;

    ball.left = canvas.width/2 - ball.width/2;
    ball.top =  canvas.height /2 - ball.height/2 ;

    ballPainter.paint(ball,context);
    }
// 画表盘
function drawClockFace(){
    context.beginPath();
    context.arc(canvas.width/2,canvas.height/2,CLOCK_RADIUS,0,Math.PI*2,false );
    context.save();
    context.strokeStyle = "rgba(0,0,0,0.2)";
    context.stroke();
    context.restore();

}
// 运动函数
function animate(){
    context.clearRect(0,0,canvas.width,canvas.height);
    drawGrid("lightgray",10,10);
    drawClock();

    window.requestNextAnimationFrame(animate);

    }

context.lineWidth =0.5;
context.strokeStyle = "rgba(0,0,0,0.2)";
context.shadowColor = "rgba(0,0,0,0.5)";
context.shadowOffsetX =2;
context.shadowOffsetY = 2;
context.shadowBlur =4;
context.stroke();

window.requestNextAnimationFrame(animate);

drawGrid("lightgray",10,10);

</script>

</body>
</html>

sprite  js

var Sprite = function (name,painter,behaviors){
    if(name!== undefined){this.name = name }
    if(painter!== undefined){this.painter = painter}

    this.top =0;
    this.left =0;
    this.width =10;
    this.height = 10;
    this.velocityX = 0;
    this.velocityY =0;
    this.visible = true;
    this.animating = false ;
    this.behaviors = behaviors || [] ;
    return this ;
}
Sprite.prototype = {
    paint:function (context){
        if(this.painter !== undefined && this.visible){
            this.painter.paint(this,context);
            }
        },
    update:function(context,time){
        for(var i=0;i<this.behaviors.length;++i){
            this.behaviors[i].execute(this,context,time);
            }
        }

    }
window.requestNextAnimationFrame = (function(){
    var originalWebkitMethod, wrapper = undefined,callback = undefined,
    geckoVersion = 0 , userAgent = navigator.userAgent, index =0 , self =this;

    if(window.webkitRequestAnimationFrame){

        wrapper = function (time){

            if(time === undefined ){

                time = +new Date();
                }
                self.callback(time);
            };

        originalWebkitMethod = window.webkitRequestAnimationFrame;

        window.webkitRequestAnimationFrame = function (callback,element){
            self.callback = callback ;
            originalWebkitMethod(wrapper,element);

            }

        }
    if(window.mozRequestAnimationFrame){
        index = userAgent.indexOf("rv:");
        if(userAgent.indexOf("GecKo") != -1){
            geckoVersion = userAgent.substr(index +3 ,3);
            if(geckoVersion ==="2.0"){
                window.mozRequestAnimationFrame = undefined ;
                }

            }
        }
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame ||window.msRequestAnimationFrame || function (callback,element){
        var start,finish;
        window.setTimeout(function(){
            start = +new Date();
            callback(start);
            finish = +new Date();

            self.timeout = 1000/60 - (finish -start);

            },self.timeout);

        }

    })()
    // JavaScript Document

canvas 之 - 精灵 钟表动画

时间: 2024-11-14 12:28:35

canvas 之 - 精灵 钟表动画的相关文章

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器解耦).命令模式(精灵的动作).享元模式(一个实例表示多个精灵) painter属性是一个指向Painter对象的引用,使用paint(sprite,context)方法来绘制精灵,behaviors属性指向一个对象数组,数组中每个对象都会以execute(sprite,context,time)方

HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版?

HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程序直接切入这套API,全面讲解其功能,以求让读者实现出内容丰富且界面一致的网络应用程序,并将开发好的程序部署在多种设备及操作系统之上. 教程地址:HTML5 Canvas核心技术:图形.动画与游戏开发 PDF扫描版? HTML5 Canvas核心技术:图形.动画与游戏开发 目录: 前言 第1章 基础知识 1.

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf5

文本的定位 水平与垂直定位:当使用strokeText()和fillText()绘制文本时,指定了所绘文本的X与Y坐标,还有textAlign与textBaseline两个属性 textAlign:start(默认) center end left right,当canvas元素的dir属性是ltr时,left效果与start相同,right与end相同,如果dir属性是rtl,则相反 textBaseline:top bottom middle alphabetic(默认,基于拉丁字母) id

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4

CanvasRenderingContext2D对象中用于平移.旋转坐标系的方法 镜像 scale(1,-1)绘制垂直镜像:scale(-1,1)绘制水平镜像 自定义的坐标变换 transform(),多次调用会叠加效果 setTransform(),每次调用都会清除上次的效果 两个方法都用于旋转.缩放.及平移坐标系(可以根据公式传入0或其他数据) x'=ax+cy+e y'=bx+dy+f 坐标系旋转公式(angle弧度) x'=x×cos(angle)-(y×sin(angle)) y'=y

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1

canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字符,strokeText()方法使用strokeStyle属性描绘字符的轮廓线,fillStyle属性和strokeStyle属性可以是CSS格式的颜色.渐变色或是图片 fillText()与strokeText()方法都需要3个参数:要绘制的文本内容,以及在canvas中显示文本的横.纵坐标 注意

cocos2dx层精灵、以及精灵的动画与动作

层 精灵 精灵不一定是静态的.通常,一个精灵可以不断变化,变化的方式包括:移动.旋转.缩放.变形.显现消失.动画效果 (类似 GIF 动画)等.精灵按照层次结构组合起来,并与玩家互动,构成了一个完整的游戏. 从绘图的角度来说,图形按照自上而下的顺序绘 制出来.为了绘制场景,需要绘制场景中的层,为了绘制层,需要绘制层中的精灵.因此,关系图实质上安排了图元的绘 图方式,关系图中的每一个元素称作节点(node),关系图则称作渲染树(rendering tree).渲染场景的过程就是遍历 渲染树的过程.

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7

性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在局部变量中 2)应该用循环计数器遍历完整的像素,而非像素分量(每4个一组) 3)逆向遍历与移位技巧效果并不好 4)不要频繁使用getImagedata() 视频处理 var video=document.getElementById('video'); //A <video>element ...

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf3

路径与子路径 在某一时刻,canvas之中只能有一条路径存在,Canvas规范称之为“当前路径”(current path),这条路径却可以包含很多子路径(subpath),子路径是由两个或者更多点组成的 context.beginPath(); context.rect(10,10,100,100); context.stroke(); context.beginPath(); //清除上次调用rect()方法所创建的路径 context.rect(50,50,100,100); contex

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6

操作图像的像素:getImageData() putImageData() ImageData对象 调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含3个属性:1)width以设备像素为单位的图像数据宽度 2)height以设备像素为单位的图像数据高度 3)data包含各个设备像素数值的数组 width和height都是只读的无符号长整数,data属性包含的每个数组元素都表示图像数据中相应的像素值,每个值包含的颜色分量都是含有8个二进制位的整数(