4.1速度
运动最基本的属性就是速度。注意这里的速度是物理中所说的速度(Velocity),它包括大小及方向两部分组成。在动画中,如果我们已知当前一帧对象的位置以及速度,那在下一帧我们就能计算出物体所在的位置。在大多数情况下,速度的大小是按像素/帧为单位的,但实际运行中,由于浏览器的帧率不稳定性,会出现小的差别。如果应用对于统一帧率要求很严格,可以使用其它的方式来处理,之后我们会介绍这方面的知识。
向量
物理中我们使用向量来表示速度,向量包括大小和方向两个属性。其大小是一个非负整数。向量是没有位置的,它只能表示在某一方向上大小的改变快慢。两个向量在大小和方向都相同的情况下是相等的。
对于向量的相加,我们通常会将向量按坐标轴正交分解,之后在每个坐标轴方向上执行对应的加法,最后再将两个坐标轴上的结果进行正交合成,即得到向量相加的结果。
一维坐标系统下的速度
我们给之前的的Ball类添加vx与vy 来分别表示X轴及Y轴下的速度大小。对象的移动就可以在每一帧开始时给其坐标增加加对应的速度大小来实现。如下:
window.onload=function(){
var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");
var ball1=new Ball();
ball1.vx=1;
ball1.x=100;
(function animationLoop(){
window.requestAnimFrame(animationLoop,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
ball1.x+=ball1.vx;
ball1.paint(context);
})();
};
如上代码所示,每一帧开始时,我们为小球的X坐标ball.x增加了其在X轴上的速度ball.vx,于是就可以实现小球从初始位置一直向右移动的效果。
二维坐标系统下的速度
二维坐标下的速度计算非常简单,我们只需要分别对X与Y轴上运动对象的位置属性增加对应坐标轴上运动对象的速度大小即可(如果速度是反向的,就需要减少速度大小)。此时,代码为:
window.onload=function(){
var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");
var ball1=new Ball();
ball1.vx=1;
ball1.vy=1;
ball1.x=100;
ball1.y=100;
(function animationLoop(){
window.requestAnimFrame(animationLoop,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
ball1.x+=ball1.vx;
ball1.y+=ball1.vy;
ball1.paint(context);
})();
};
如上代码所示,每一帧开始时,我们为小球的X坐标ball.x增加了其在X轴上的速度ball.vx,同时为小球Y坐标ball.y增加了其在Y轴上的速度ball.vy。这样,在运动中速度正交合并后,就可以实现小球从初始位置开始沿合并方向运动以速度大小移动的效果。
已知初始方向及大小的速度
前面我们实现的都是已知两个正交坐标轴方向速度大小的运动,但在实际应用中,这种情况很少见,更多的是已知速度的大小及方向的运动。此时,我们就需要使用之前介绍的三角函数。常见的变换如下:
vx=Math.cos(angle)*V;
vy=Math.sin(angle)*V;
此时,我们之前的运动小球的代码如下:
window.onload=function(){
var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");
var angle=45;
var speed=1;
var ball1=new Ball();
//注意此处必须执行角度弧度转换
angle=angle*Math.PI/180;
ball1.vx=Math.cos(angle)*speed;
ball1.vy=Math.sin(angle)*speed;
ball1.x=100;
ball1.y=100;
(function animationLoop(){
window.requestAnimFrame(animationLoop,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
ball1.x+=ball1.vx;
ball1.y+=ball1.vy;
ball1.paint(context);
})();
};
此时就实现了小球从初始位置,以方向45度,大小为1的速度移动的效果。
鼠标跟随效果
之前,我们实现了一个跟随鼠标位置转到的箭头,在此我们给箭头添加速度,让箭头跟随鼠标移动。首先,需要给箭头添加两个坐标轴方向的速度属性。接着,在每一帧中我们计算出箭头中心到鼠标所在位置的向量,此时箭头的速度给箭头位置添加此向量后即可。代码实现如下:
window.onload=function(){
var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");
var mouse=utils.captureMousePosition(canvas);
var speed=5;
var arrow=new Arrow();
arrow.x=canvas.width/2;
arrow.y=canvas.height/2;
(function animationLoop(){
window.requestAnimFrame(animationLoop,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
//取得变化向量(从箭头位置指向鼠标位置)
var dx=mouse.x-arrow.x;
var dy=mouse.y-arrow.y;
var angle=Math.atan2(dy,dx);
arrow.rotation=angle;
//速度位移更新
arrow.vx=Math.cos(angle)*speed;
arrow.vy=Math.sin(angle)*speed;
arrow.x+=arrow.vx;
arrow.y+=arrow.vy;
arrow.paint(context);
})();
};
速度扩展
除了对于运动对象的位置使用速度来改变,我们也可以对于运动对象的其它属性使用这种方式来进行改变。比如对象的旋转属性,在游戏中就是经常使用到的一个功能。下面我们实现一个对象自旋的功能。
window.onload=function(){
var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");
var rotationSpeed=1;
var arrow=new Arrow();
arrow.x=canvas.width/2;
arrow.y=canvas.height/2;
(function animationLoop(){
window.requestAnimFrame(animationLoop,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
//更新箭头旋转属性值
arrow.rotation+=rotationSpeed*Math.PI/180;
arrow.paint(context);
})();
};
分享到:
相关推荐
9. **最佳实践**:分享HTML5 Canvas开发的最佳实践,包括代码组织、调试技巧以及如何确保兼容性。 10. **社区与资源**:可能还会介绍一些HTML5和Canvas的在线社区、工具、库和框架,帮助读者持续学习和提高。 总的...
在这个"HTML5 Canvas核心技术图形、动画与游戏开发"的PDF扫描版中,读者可以深入学习到Canvas的核心概念和实践技巧。 首先,Canvas的基本使用方法是通过JavaScript API来实现的。这个API提供了大量的绘图命令,如`...
HTML5的Canvas是一个强大的绘图API,它允许开发者在网页上进行动态的、基于...随着对Canvas的深入理解和实践,你会发现它的潜力无穷无尽。在实际项目中,可以结合CSS3、WebGL等技术,构建更复杂的交互式Web应用。
在微信小程序中,Canvas是一个非常重要的组件,它允许开发者在...以上就是关于"小程序canvasDemo"项目中涉及的主要技术点,通过学习和实践,你可以掌握微信小程序中canvas的使用技巧,进一步提升你的小程序开发能力。
HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。在这个“html5_canvas_...这样的实现不仅方便分享,也为开发者提供了一个学习和实践Canvas API的好平台。
《canvas+js绘制图形的实践探索》 在Web开发领域,HTML5的canvas元素提供了一种强大的机制,允许开发者在浏览器上进行动态图形绘制。这篇博文将深入探讨如何结合JavaScript,利用canvas API来构建一个简单的绘图小...
这个功能在很多场景下都非常有用,比如网页分享、游戏截图、在线编辑器保存草图等。 首先,我们要了解canvas的基本用法。canvas是一个矩形画布,通过JavaScript来控制它的内容。我们可以通过`<canvas>`标签在HTML中...
HTML5 Canvas是Web开发中的一个关键技术,...通过学习和实践这些HTML5 Canvas的核心技术,开发者可以构建出交互性强、视觉效果丰富的Web应用程序,无论是数据可视化、游戏开发还是艺术创作,Canvas都能提供强大的支持。
9. **保存和导出**:Canvas上的内容可以导出为图像,或者使用toDataURL方法生成数据URL,方便分享和存储。 10. **实际应用**:书中实例可能涵盖游戏开发、图表绘制、数据可视化、地图应用等多个实际场景,帮助...
这篇博客"canvas画图测试"可能涉及了使用Canvas进行图形绘制的基础知识和实践技巧。Canvas API的使用通常包括以下几个核心知识点: 1. **Canvas元素**:在HTML中,`<canvas>`标签定义了一个可编程的画布,通过...
2. 用户界面(UI):Android游戏通常使用自定义View或SurfaceView来实现游戏画面,结合Canvas进行绘制。UI的设计也包括菜单、暂停、设置等交互元素。 3. 图形渲染:游戏可能使用OpenGL ES进行高性能的2D或3D图形...
在“HTML5 Canvas学习笔记(6)拼图游戏(数字版)”这篇博文中,作者分享了如何利用Canvas构建一个数字拼图游戏。下面我们将详细探讨这个知识点。 1. **HTML5 Canvas基础**: - Canvas是一个基于矢量图形的画布元素...
1. Canvas绘图:H5游戏常用Canvas API进行动态绘图,实现游戏场景的渲染。通过JavaScript操作Canvas的绘图方法,可以绘制角色、障碍物并实现动画效果。 2. Event Handling:JavaScript的事件监听和处理机制在游戏中...
H5游戏源码的分享,对于学习者来说是一次宝贵的实践机会,可以了解游戏逻辑、动画效果、用户交互等核心元素的实现方法。 【标签】"游戏":游戏是软件的一种类型,它可以提供娱乐、挑战或教育功能。H5游戏作为游戏的...
这个技术的引入极大地扩展了网页的交互性和动态性,尤其在创建复杂的动画效果和游戏场景时表现得尤为出色。在这个特定的场景中,我们讨论的是如何使用HTML5 Canvas实现视频网站的文字弹幕动画特效。 首先,我们要...
在“H5自写的小游戏源码分享”这...同时,这也是一个很好的学习实践机会,可以提升你的JavaScript编程水平,理解游戏开发中的逻辑思维和问题解决能力。不断练习和学习,你将能够创造出更多有趣、引人入胜的HTML5游戏。
HTML5 Canvas API是Web开发中的一个强大工具,它允许开发者在网页上绘制2D图形,创建动态、交互式的游戏和应用程序。在这个项目中,“games:使用canvas api...在实践中,不断探索和创新,制作出更丰富、更有趣的游戏。
8. **性能优化**:分享关于Canvas性能的技巧,如批处理绘图操作、使用图像数据缓冲区和避免不必要的重绘。 9. **高级应用**:深入探讨更复杂的用例,如粒子系统、游戏开发、图表绘制和数据可视化。 10. **实践案例...
【标题】:“jQuery HTML5微信分享游戏:围住神经猫游戏源码下载” 【描述】:这个资源提供了基于jQuery和HTML5技术开发的微信分享...对于希望从事移动互联网游戏开发的初学者来说,这是一个非常有价值的实践案例。
通过理解和实践这个项目,开发者可以掌握QML中的2D绘图技术,以及如何结合鼠标事件来实现动态的用户交互功能。这对于开发桌面应用、游戏或者任何需要在屏幕上绘制图形的场景都具有很高的实用价值。