利用对象思想来绘制canvas帧动画
绘制思路:
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帧动画的更多相关文章
- 神奇的canvas——点与线绘制的绚丽动画效果
代码地址如下:http://www.demodashi.com/demo/11636.html 前言 之前在某网站上看到了一个canvas绘制的动画效果,虽然组成的元素很简单,只有点和线,但是视觉效果 ...
- 第165天:canvas绘制圆环旋转动画
canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...
- 利用css3-animation来制作逐帧动画
前言 趁着还没有元旦之前先码一篇文章,不然到时候估计又被各种虐了,所以趁现在还有力气先来一篇.今天来聊聊css3中的动画属性animation,对这个属性懵懂是在很早的时候有前辈用这个 animati ...
- 自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,"掏粪男孩Gif"顺便再提提onWindowFocusChanged)
转载请注明出处:王亟亟的大牛之路 之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果.那么自己定义的View当然也有动态的效果也就是我们的Animation.经常使用的有三种 View An ...
- Android游戏开发研究帧动画实现
1.动画的原则框架 帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...
- 利用javascript和WebGL绘制地球 【翻译】
利用javascript和WebGL绘制地球 [翻译] 原翻译:利用javascript和WebGL绘制地球 [翻译] 在我们所有已知的HTML5API中,WebGL可能是最有意思的一个,利用这个AP ...
- 图形绘制 Canvas Paint Path 详解
图形绘制简介 Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...
- 使用javascript和css模拟帧动画的几种方法浅析
我们平时在开发前端页面的时候,经常会播放一段帧序列.这段帧序列就像gif图片那样,反复循环播放.那大家可能会说,直接用gif图片就好了,干嘛还去模拟呢?那是因为要做得更加灵活,我们要做到以下几点: 1 ...
- HTML5标签canvas制作动画
摘要: canvas可以绘制图像,自然而然的就可以制作动画,因为动画的每一帧都是图像.我们可以利用javascript的setInterval函数来实现动画效果. 下面是一个例子,小圆绕着红点圆心不停 ...
随机推荐
- IDEA开发web程序配置Tomcat
1.下载zip版的Tomcat 7,并解压2.在IDEA中配置Tomcat 7 在idea中的Settings(Ctrl+Alt+s)(或者点击图标 ) 弹出窗口左上过滤栏中输入“Applicatio ...
- 【Oracle】事务处理
名词解释 DML:Data Manipulation Language (数据库操纵语言) 例如:DELETE.INSERT.UPDATE.SELECT DDL:Data Definition Lan ...
- win10下Visual Studio 2015,C++ x64编译zlib
前提安装了visual studio 2015 PS.几乎所有方式,x64的编译都会有点坑,鉴于网上的x86编译方式非常的多,所以不再累赘x86的编译方式 zlib下载源: 官网:http: ...
- 使用canvas制作一个移动端画板
概述 使用canvas做一个画板,代码里涵盖了一些canvas绘图的基本思想,各种工具的类也可以分别提出来用 详细 代码下载:http://www.demodashi.com/demo/10503.h ...
- 雪球、牛股王这种股票类App 到底能否帮你赚到钱?
核心观点 股民这个大群体,是需要区分对待的:其中包含一小部分有自己独立判断能力的投资者和一大群没有自己判断能力(尽管他们经常觉得自己有)的普通散户. 当前的互联网证券类App,确实很难保证帮股民赚到钱 ...
- js 随机变换图片
<div style="position:absolute;left:40%;top:10%;border-style:dotted"> <img src=&qu ...
- oracle中number对应java数据类型
本文转自:http://blog.csdn.net/ludongshun2016/article/details/71453125 数据库中为number类型的字段,在Java类型中对应的有Integ ...
- HDUOJ----湫湫系列故事——减肥记I
湫湫系列故事——减肥记I Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 【LeetCode】64. Minimum Path Sum
Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...
- java concurrent之ReentrantLock
在编码的过程中.有时候我们不得不借助锁同步来保证线程安全.synchronizedkeyword在上一篇博客中已经介绍.自从JDK5開始,加入了还有一种锁机制:ReentrantLock. 二者的差别 ...