很久没写东西了,比较懒,真的不太喜欢写东西,也不太擅长写,不过群友们对此颇有微言,说我总说理论,没有实例,于是写点实例吧,堵一堵某些人的嘴,嘿嘿。
对与写JS动画,很多初学者喜欢让每个运动的物体拥有一个计数器,或者出现让运动的速度与时钟的频率一致,
1.第一种方式很显然不方便对动画的整体控制,并且资源消耗大。
2.第二种方式,是把动画的帧率和速率概念混淆了,会引起不同的浏览器出现不同速率的问题
我所设计的动画框架是由一个动画引擎来管理所有的动画,每个动画对象在生成的时候,把自己注册到动画引擎中,动画引擎调用每个动画对象的帧方法来实现动画,多说无益,直接上代码吧,懒毛病又翻了......;
希望大家能给一些框架上的意见,方便完善这个框架。嘿嘿
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<style>
div{width:20px;height:20px;border:1px solid #000;position:absolute}
</style>
<script>
var $ = function(o){ return document.getElementById(o)};
var SpriteEngine = {//动画引擎,由动画引擎调度所有的动画对象
sprites : {},//动画对象字典
frame : 30,//每秒30帧
timer : null ,//动画计时器
register: function(spriteObj){//注册动画对象
if(spriteObj.id && ! this.sprites[spriteObj.id]){
this.sprites[spriteObj.id] = spriteObj;
}
},
unRegister:function(spriteObj){//删除动画对象
if(spriteObj.id){
delete this.sprites[spriteObj.id];
}
},
startFrame : function(){//开始动画
this.timer = setInterval(this.enterFrameFunction, 1000 / this.frame);
},
stopFrame : function(){//暂停动画
if(this.timer)
clearInterval(this.timer);
},
enterFrameFunction : function(){//内部启动方法
var sprites = SpriteEngine.sprites;
for(var key in sprites){
var sprite = sprites[key];
//$("debug").innerHTML += sprite.id;
if(sprite.id && sprite.enterFrame){//检查是否是Sprite的接口实例
sprite.enterFrame(1000 / SpriteEngine.frame);
}
}
}
};
/**
* 动画对象
* 设定内部接口为
* id 动画对象的标识
* enterFrame 由动画引擎调用
* 外部接口为
* addEnterFrameFunction 设定动画对象的运动函数
*/
var Sprite = function(id,speed,direction){
this.id = id;//接口,必须有ID,内部接口
this.x = 0;
this.y = 0;
this.dom = $(id);
this.speed = speed;//运动的速度,每毫秒多少像素
this.direction = direction;//运动的角度,单位弧度
this.enterFrameFun = [];//动画方程列表
SpriteEngine.register(this);
if(this.dom){//初始化位置
this.dom.style.top = 0;
this.dom.style.left = 0;
}
};
Sprite.prototype.setXY = function(x, y){//设置内部dom位置,这个仅仅是演示用的,不算Sprite的接口
this.x = x;
this.y = y;
if(this.dom){
this.dom.style.top = y + 'px';
this.dom.style.left = x + 'px';
}
}
Sprite.prototype.addEnterFrameFunction = function(fun){//添加动画的方法接口,外部接口
this.enterFrameFun.push(fun);
};
Sprite.prototype.enterFrame = function(stepTime){//引擎调用的接口,内部接口
for(var i = this.enterFrameFun.length; i--; ){
this.enterFrameFun[i].call(this,stepTime);
}
};
var movefun1 = function(stepTime){//demo 直线运动
var move = this.speed * stepTime
var _x = move * Math.cos(this.direction);
var _y = move * Math.sin(this.direction);
this.setXY(this.x + _x, this.y + _y);
}
var movefun2 = function(stepTime){//demo 给定一个角速度
this.direction += 0.1;
}
var movefun3 = function(stepTime){//demo 往复运动
if (this.x > 500){
this.direction = Math.PI;
}
if(this.x < 50){
this.direction = 0;
}
}
function init(){
var a = new Sprite("demo1", 0.5, 0);
var b = new Sprite("demo2", 0.3, 30);
a.setXY(20,100);//直线运动,叠加往复运动
a.addEnterFrameFunction(movefun1);
a.addEnterFrameFunction(movefun3);
b.setXY(100,200);//直线运动,叠加角速度
b.addEnterFrameFunction(movefun1);
b.addEnterFrameFunction(movefun2);
}
function pauseOrStart(o){
if(o.value == '暂停'){
o.value = '开始'
SpriteEngine.stopFrame();
}else{
o.value = '暂停';
SpriteEngine.startFrame();
}
}
</script>
</head>
<body onload="init()">
<div id="demo1"></div>
<div id="demo2"></div>
<input type="button" value="开始" onclick="pauseOrStart(this)" />
</body>
</html>
分享到:
相关推荐
原生JavaScript实现风箱式演示(Demo)涉及到多个知识点,主要包括以下几个方面: 1. **JavaScript实现轮播图**: - 轮播图是前端开发中常见的交互元素,用于展示一系列的图片或者内容。 - 在这个Demo中,使用...
1.5.1 版本是其一个重要的发布,包含API中文文档以及演示示例,帮助开发者更好地理解和使用该框架。 1. **jQuery EasyUI 基础** - **jQuery**:jQuery 是一个快速、简洁的JavaScript库,简化了HTML DOM元素操作、...
**jQuery EasyUI 知识点详解** jQuery EasyUI 是一个基于 jQuery 的前端框架,它提供了一系列的 UI 组件,使得开发者能够快速构建出美观且功能丰富的 ...通过实践和探索这个 Demo,你将能更好地理解和运用这一框架。
在“PhoneGap demo 3.1”中,重点是演示如何通过插件来模拟原生应用的页面过渡效果,这通常涉及到更流畅的动画和更好的用户体验。原生页面切换效果可以让用户感觉应用程序更像本地应用,而非一个简单的网页封装。 ...
Three.js是一个广泛使用的JavaScript库,专门用于在浏览器中处理3D图形,基于WebGL标准。TWaver在底层使用了Three.js,但为其提供了更高级别的API和封装,降低了开发者对WebGL直接操作的难度。通过TWaver,开发者...
Vue.js 是一个流行的前端JavaScript框架,它用于构建用户界面,特别是单页面应用程序(SPA)。Vue时间组件是Vue.js生态系统中的一个重要部分,它帮助开发者轻松处理与时间相关的交互,如选择日期、时间或时间范围。...
这个“DOJO-DEMO 官网提取版”是基于 DOJO 官方网站在 2013 年 1月的演示示例集合,对于学习和理解 DOJO 的核心概念、API 以及实践应用具有很高的参考价值。 1. **DOJO 概述** DOJO 是由 Dojo Foundation 维护的一...
这个"easyui demo"是一个包含了一系列示例的集合,展示了EasyUI的各种组件和功能,同时也对API进行了离线封装,方便开发者在没有网络的情况下查阅和使用。在这个压缩包中,主要包含了一个名为 "jquery-easyui-1.3.6...
而“vue”标签则表明这个案例是基于Vue.js框架实现的,Vue.js是一个非常流行的前端JavaScript框架,以其轻量级、易上手和灵活性著称。 Vue.js在构建大屏展示应用时,提供了丰富的特性,如组件化、虚拟DOM、响应式...
《最新jQuery EasyUI Demo》是面向开发者的一份珍贵资源,旨在帮助学习者深入理解和掌握jQuery EasyUI框架。jQuery EasyUI是一套基于JavaScript和jQuery的UI组件库,它为Web应用程序提供了一套美观、功能丰富的用户...
JavaScript插件是Web开发中广泛使用...总的来说,这个压缩包包含的内容可能涵盖了JavaScript插件的使用、Bootstrap框架的应用,以及一个实际的演示案例,对于学习和应用JavaScript插件进行网页开发具有很高的参考价值。
1. **jQuery基础**:jQuery库是JavaScript的一个轻量级框架,它简化了DOM操作、事件处理、动画设计和Ajax交互。jQuery的核心概念包括选择器(用于选取HTML元素)、链式调用(允许连续执行多个方法)和封装(将复杂...
3. 图形库和框架:可能包含一些预封装的WebGL库,如Three.js或 Babylon.js,它们简化了WebGL的使用,提供了高级功能,如相机控制、加载3D模型等。 总之,这个压缩包是深入学习和实践WebGL的宝贵资源。通过研究这些...
**jQuery 1.3.1** 是一个历史悠久的版本,它是JavaScript库jQuery的重要迭代,以其高效、简洁的语法和强大的功能著称。该版本在2009年发布,为开发者提供了丰富的DOM操作、事件处理、动画效果以及Ajax交互等功能。...
**jQuery 框架详解与实战演示** jQuery 是一个高效、简洁且易用的 JavaScript 库,它极大地简化了 JavaScript 对HTML文档的遍历、事件处理、动画制作以及Ajax交互。这个“jquery_demo”主题将深入讲解jQuery的核心...
【countUp-demo】是一个基于Vue框架的简单封装的在线演示项目,主要展示了如何在Web应用中集成和使用JavaScript库`countUp.js`。`countUp.js`是一个轻量级的库,专门用于创建平滑、动态的数字计数动画效果,通常用于...
引导卡(Bootcards)是一种专为构建响应式、基于卡片的用户界面而设计的框架,它基于Bootstrap 3,旨在提供一个简单、灵活且高效的解决方案,使得开发者可以快速创建在手机、平板和桌面设备上都能良好展示的应用。...
这个"silverlight传值demo"很可能是演示了上述的一种或多种技术。它可能包含了一个简单的用户界面,通过按钮点击触发事件,然后在后台代码中处理这些事件并传递数据。你可能会看到如何创建和配置依赖属性,如何设置...
- `demo.js`:可能是一个示例脚本,演示如何初始化和交互日历控件。 综上所述,JS火狐兼容日历控件涉及了JavaScript的事件处理、DOM操作、CSS样式以及浏览器特定的兼容性策略。开发者需要对这些方面有深入理解,并...
这个标题揭示了一个基于Web技术的移动端项目,主要是为红旅动漫设计的一个网站演示版本。项目采用了一些主流的前端框架和技术,包括AngularJS、Swiper和jQuery,实现了模块化的开发方式。以下是这些技术的相关知识点...