绘制思路:

1.封装一个对象出来:

2.属性: width . height imgSr speed dir
3.行为: render changeDir

html文件:

 <script>
(function(){
var canvas = document.querySelector( '#cavsElem' );
var ctx = canvas.getContext( '2d' );
canvas.width = 600;
canvas.height = 600;
canvas.style.border = "1px solid #000";
var s=new Sprite({
x:300,//在画布上的坐标
y:300,
w:80,//画布上的宽高
h:130,
fps:4,//速度
originW:40,//截取的精灵图片中的精灵的宽高。
originH:65,
imgSrc:'gameImgs/DMMban.png'
});
s.render(ctx);
var btnLeft = document.getElementById('btn-dir-left');
btnLeft.onclick = function() {
s.changeDir('right');
};
var btnRight = document.getElementById('btn-dir-right');
btnRight.onclick = function() {
s.changeDir('right');
};
var btnUp = document.getElementById("btn-dir-up");
btnUp.onclick = function() {
s.changeDir('up');
};
var btnDown = document.getElementById('btn-dir-down');
btnDown.onclick = function() {
s.changeDir('down');
};
}());
</script>

js文件:

 <script>
function Sprite( option ) {
//构造函数执行的时候,立即调用初始化的函数
this._init( option );
}
Sprite.prototype = {
//初始化
_init: function( option ) {
this.x = option.x === 0 ? 0 : (option.x || 10);//在画布上的坐标
this.y = option.y === 0 ? 0 : (option.y || 10);//
this.w = option.w || 40; // 绘制到canvas上的宽高
this.h = option.h || 65;
this.fps = option.fps || 10; // frame per second
this.originW = option.originW || 40; // 截取的精灵图片中的 精灵的宽高。
this.originH = option.originH ||65;
this._dirIndex = 0;
this._imgSrc = option.imgSrc || '';
},
//渲染当前动画
render: function( ctx ) {// 把自己画 到画布上去
//第一步: 把图片加载
var img = new Image();
img.src = this._imgSrc;
var self = this;
img.onload = function() {
var frameIndex = 0;
// this == img
// 第二步:加载完图片后,启动一个时钟,不停的渲染动画
setInterval(function(){
ctx.clearRect( 0,0 , ctx.canvas.width , ctx.canvas.height);
ctx.drawImage(
img //绘制的原始图片
, frameIndex * self.originW // 剪切图片的x坐标
, self._dirIndex * self.originH
, self.originW
, self.originH
, self.x
, self.y
, self.w
, self.h
);
frameIndex ++ ;
frameIndex %= 4;
}, 1000 / self.fps)
}
},
//改变方向
changeDir: function( dir ) {
if( dir == 'left' ) {
this._dirIndex = 1;
}
if( dir == 'right' ) {
this._dirIndex = 2;
}
if( dir == 'up' ) {
this._dirIndex = 3;
}
if( dir == 'down' ) {
this._dirIndex = 0;
}
}
};
</script>

利用对象思想来绘制canvas帧动画的更多相关文章

  1. 神奇的canvas——点与线绘制的绚丽动画效果

    代码地址如下:http://www.demodashi.com/demo/11636.html 前言 之前在某网站上看到了一个canvas绘制的动画效果,虽然组成的元素很简单,只有点和线,但是视觉效果 ...

  2. 第165天:canvas绘制圆环旋转动画

    canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...

  3. 利用css3-animation来制作逐帧动画

    前言 趁着还没有元旦之前先码一篇文章,不然到时候估计又被各种虐了,所以趁现在还有力气先来一篇.今天来聊聊css3中的动画属性animation,对这个属性懵懂是在很早的时候有前辈用这个 animati ...

  4. 自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,&quot;掏粪男孩Gif&quot;顺便再提提onWindowFocusChanged)

    转载请注明出处:王亟亟的大牛之路 之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果.那么自己定义的View当然也有动态的效果也就是我们的Animation.经常使用的有三种 View An ...

  5. Android游戏开发研究帧动画实现

     1.动画的原则框架        帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...

  6. 利用javascript和WebGL绘制地球 【翻译】

    利用javascript和WebGL绘制地球 [翻译] 原翻译:利用javascript和WebGL绘制地球 [翻译] 在我们所有已知的HTML5API中,WebGL可能是最有意思的一个,利用这个AP ...

  7. 图形绘制 Canvas Paint Path 详解

    图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...

  8. 使用javascript和css模拟帧动画的几种方法浅析

    我们平时在开发前端页面的时候,经常会播放一段帧序列.这段帧序列就像gif图片那样,反复循环播放.那大家可能会说,直接用gif图片就好了,干嘛还去模拟呢?那是因为要做得更加灵活,我们要做到以下几点: 1 ...

  9. HTML5标签canvas制作动画

    摘要: canvas可以绘制图像,自然而然的就可以制作动画,因为动画的每一帧都是图像.我们可以利用javascript的setInterval函数来实现动画效果. 下面是一个例子,小圆绕着红点圆心不停 ...

随机推荐

  1. ios 的 desciption

    前段时间,终于将 ipa 文件打包完毕,上传appStore ,最后被打回,是因为 敏感的调用设备功能没有写描述. 有两种解决方式: A.直接修改 info.plist 文件 1.设置启动图标(CFB ...

  2. Asp.net Mvc (Filter及其执行顺序)

    应用于Action的Filter 在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Actionfi ...

  3. python之函数用法getattr()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法getattr() #getattr() #说明: ''' getattr(...) ...

  4. OpenWrt的开机启动服务(init scripts)

    参考 https://wiki.openwrt.org/doc/techref/initscripts 以一个简单的例子来说明 #!/bin/sh /etc/rc.common # Example s ...

  5. npm换国内淘宝镜像

    来源于:http://yijiebuyi.com/blog/b12eac891cdc5f0dff127ae18dc386d4.html 为什么要换源? npm 官方站点 http://www.npmj ...

  6. xmlhttp.readyState==4 && xmlhttp.status==200的探究

    作为一个后端人员,很惭愧,对Ajax的使用只局限在功能实现层面的交互,对底层通过XMLHttpRequest对象来使用的知识却没有仔细研究过.现总结如下 1. XMLHttpRequest 对象的相关 ...

  7. PHP中curl的使用

    cURL 函数 curl_close — 关闭一个cURL会话 curl_copy_handle — 复制一个cURL句柄和它的所有选项 curl_errno — 返回最后一次的错误号 curl_er ...

  8. jquery api 常见 事件操作

    change.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  9. 【LeetCode】93. Restore IP Addresses

    Restore IP Addresses Given a string containing only digits, restore it by returning all possible val ...

  10. [转]浅析360的危害 & 我为什么推荐卸载360

    http://blog.eqoe.cn/posts/fuck-360-ass.html 首先放一些证据: [视频证据]360安全浏览器暗设后门 360SE.BackDoor.超清可用WMP播放 密码: ...