【整理】HTML5游戏开发学习笔记(3)- 抛物线运动
1.预备知识
(1)Canvas旋转的实现过程
window.onload = function(){ var ctx = document.getElementById('canvas1').getContext('2d') //旋转
ctx.save()
ctx.translate(200,200)//把(200,200)点作为临时的(0,0)点
ctx.rotate(30*Math.PI/180)//顺时针旋转30度所对应的弧度
ctx.fillRect(0,0,100,150)
ctx.restore() }
(2)抛物线运动中的重力加速度的模拟实现模型
/*
抛物线运动
这个版本做了修改,为了减少一次角度和弧度之间的转换计算(通过Math.atan2可以直接算出弧度),
构造参数中的角度改成了弧度
deleted:
angle = angle, //初始角度
radians = angle*Math.PI/180, //初始弧度 object ParabolicMotion
@velocity:初始速度
@radians:初始弧度
@gravity:初始加速度{x:0,y:2}
*/
function ParabolicMotion(velocity,radians,gravity){
var velocity = velocity,
radians = radians,
gravity = gravity var offsetX = velocity*Math.cos(radians),
offsetY = -velocity*Math.sin(radians) function next(offset,gravity){
var offset1 = offset
var offset2 = offset+gravity return {offset:offset2,dv:(offset1+offset2)*.5}
} return { /*
获取运动轨迹到下一个时间点,x,y轴所偏移的距离
*/
moveNext : function(){
var offsetXD = next(offsetX,gravity.x)
var offsetYD = next(offsetY,gravity.y) offsetX = offsetXD.offset
offsetY = offsetYD.offset //console.log(offsetX+','+offsetY) return {x:offsetXD.dv,y:offsetYD.dv}
} }
}
2.实现思路
涉及的对象,包括球(Ball),弹弓(Slingshot),抛物线运动(ParabolicMotion)。
操作过程是,鼠标键按下拖拽小球,和弹弓的作用点成一定的角度,鼠标键按起后,小球做抛物线运动
3.主要代码
/*弹弓*/
function Slingshot(){ var opts,
ctx,
crtBall,
ballSelected = false function refresh(){
ctx.clearRect(0,0,opts.width,opts.height) drawSling()
crtBall.draw()
} function drawSling(){
var point = opts.actionPoint ctx.beginPath()
ctx.moveTo(point.x,point.y)
ctx.lineTo(point.x,opts.height)
ctx.closePath()
ctx.stroke() if(crtBall!=null&&ballSelected){
//绘制连接球和弹弓的"橡皮筋"
ctx.beginPath()
ctx.moveTo(point.x,point.y)
ctx.lineTo(crtBall.x,crtBall.y)
ctx.closePath()
ctx.stroke()
}
} function isBallSelected(offsetX,offsetY){
var point = opts.actionPoint
var a = Math.abs(point.x-offsetX)
var b = Math.abs(point.y-offsetY)
//var c = Math.sqrt(a*a+b*b) return (a*a+b*b)<=crtBall.radius*crtBall.radius
} // 添加拉弹弓事件
function initEvents(){
var canvas = opts.canvas
/*
addEventListener函数的第3个参数,
false表示内层元素事件先触发,ture则表示外层的事件先触发 alert(e.offsetX+','+e.offsetY)
必须使用offsetX,offsetX是相对于canvas画布的距离(但firefox不支持) 事件参数e没有考虑浏览器兼容问题
*/
canvas.addEventListener('mousedown',function(e){
// 判断球是否被选中
ballSelected = isBallSelected(e.offsetX,e.offsetY) if(ballSelected){
crtBall.locate(e.offsetX,e.offsetY)
refresh()
}
},false) canvas.addEventListener('mousemove',function(e){
if(ballSelected){
crtBall.locate(e.offsetX,e.offsetY)
refresh()
}
},false) canvas.addEventListener('mouseup',function(e){
if(ballSelected){
ballSelected = false crtBall.locate(e.offsetX,e.offsetY)
refresh() //发射炮弹
fire(function(x,y){
//TODO 判断是否打中目标 })
}
},false)
} function fire(onCompleted){
// 获取当前的炮弹发射速度和弧度
var velocity = ($.square(opts.actionPoint.y-crtBall.y)+$.square(opts.actionPoint.x-crtBall.x))/100
var radians = -Math.atan2(opts.actionPoint.y-crtBall.y,opts.actionPoint.x-crtBall.x)//30*Math.PI/180
var gravity = {x:0,y:2} var parabolicMotion = new ParabolicMotion(velocity,radians,gravity)
var completed = false var timer = setInterval(function(){
// 在当前抛物线轨迹下,获取炮弹下一次单位时间内x,y轴需要偏移的单位长度
var offset = parabolicMotion.moveNext() crtBall.move(offset.x,offset.y)
refresh() // 检查是否超出画布边界
completed = (crtBall.x>=opts.width||crtBall.y>=opts.height) if(completed){
clearInterval(timer) if(typeof onCompleted=='function'){
onCompleted(crtBall.x,crtBall.y)
}
}
},100)
} return { init : function(options){
opts = $.extend(options,{
canvas : null,//画布
width : 1000,//画布长
height : 300,//画布高
actionPoint : {x:150,y:200}/*作用力点坐标*/
}) ctx = opts.canvas.getContext('2d')
drawSling() // 添加拉弹弓事件
initEvents() return this
}, loadBall : function(ball){
var point = opts.actionPoint crtBall = ball.init({ctx:ctx,x:point.x,y:point.y})
.draw() return this
} }
}
// app
window.onload = function(){ var canvas = document.getElementById('canvas1')
var ball = new Ball(10)
var slingshot = new Slingshot().init({canvas:canvas}) // 装载一个炮弹
slingshot.loadBall(ball)
}
4.优化和完善
(1)需实现球打中目标物体后,目标物体进行旋转
(2)可以实现同时有多个小球发射,就像游戏里发射子弹的效果
【整理】HTML5游戏开发学习笔记(3)- 抛物线运动的更多相关文章
- 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏
<HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...
- 【整理】HTML5游戏开发学习笔记(5)- 猜谜游戏
距上次学习笔记已有一个多月过去了,期间由于新项目赶进度,以致该学习计划给打断,十分惭愧.书本中的第六章的例子相对比较简单.所以很快就完成. 1.预备知识html5中video标签的熟悉 2.实现思路对 ...
- 【整理】HTML5游戏开发学习笔记(2)- 弹跳球
1.预备知识(1)在画布上绘制外部图片资源(2)梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度.如createLinearGradient,绘制梯度需要颜色组http://w ...
- 【整理】HTML5游戏开发学习笔记(4)- 记忆力游戏
1.预备知识(1)Canvas绘制多边形(2)Canvas绘制文字 2.实现思路涉及的对象 (1)场景Scene 场景代表了画布上的一块区域,场景里的每个物体都是场景里的一个元素,其绘制统一由场景 ...
- HTML5移动开发学习笔记之Canvas基础
1.第一个Canvas程序 看的是HTML5移动开发即学即用这本书,首先学习Canvas基础,废话不多说,直接看第一个例子. 效果图为: 代码如下: <!DOCTYPE html> < ...
- [游戏开发-学习笔记]菜鸟慢慢飞(四)-Camera
游戏开发中,主相机应该是最重要的GameObject之一,毕竟游戏呈现给玩家,就是通过它. 相机的使用,在不同的游戏中,有很大的不同.这里总结一下自己学到的一些相关知识. 固定位置-游戏过程中相机的T ...
- cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境
打开用户文件夹下.bash_profile文件,配置环境 vim ~/.bash_profile //按键i,进行插入编辑(假设输错d进行删除一行) 环境配置过程例如以下: 1.首先配置下androi ...
- [Android游戏开发学习笔记]View和SurfaceView
本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...
- Photon + Unity3D 线上游戏开发 学习笔记(一)
大家好. 我也是学习Photon + unity3D 的新手 有什么说错的地方大家见谅哈. 我的开发环境是 unity3D 4.1.3 , Visual Studio 是2010 版本号的 p ...
随机推荐
- Teaching Machines to Understand Us 让机器理解我们 之二 深度学习的历史
Deep history 深度学习的历史 The roots of deep learning reach back further than LeCun’s time at Bell Labs. H ...
- LevelDB原理解析
LevelDb有如下一些特点: 首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上. 其次, ...
- POW的重力之美
定律一:每一个UTXO都保持其状不变,直到有外力迫使它改变这种状态为止--艾萨克•牛顿,原理2.0 在过去的几年里,关于比特币的工作量证明(PoW)所造成的"巨大的能源浪费"已经被 ...
- 2013 C#单元测试
首先安装Unit Test Generator. 点击拓展和更新——>联机搜索Unit Test Generator 新建项目 新建一个测试类 add函数 选定test 类名 ——>右键 ...
- Beta 冲刺 三
团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 照片 项目进展 岳冠宇 ## 项目进展 昨天的困难 ...
- 11th 回忆整个学期——告学弟学妹
告诉后来的学弟学妹,不要因为艰难而却步,坚持下去才知道,山的对面是什么.很多东西或许一开始看起来是无用,甚至无意义的,但是努力去做,你才知道价值所在.不要等一切结束了,才懂得自己错过了什么.
- day8——ajax传参到action(Struts2)
第一种:url+?+参数 jsp中: $(function(){ $("[name='delemp']").click(function(){ $this = $(this); $ ...
- python进阶:Python进程、线程、队列、生产者/消费者模式、协程
一.进程和线程的基本理解 1.进程 程序是由指令和数据组成的,编译为二进制格式后在硬盘存储,程序启动的过程是将二进制数据加载进内存,这个启动了的程序就称作进程(可简单理解为进行中的程序).例如打开一个 ...
- Shell命令——文件目录
Linux只有一个文件系统树,不同的硬件设备可以挂载在不同目录下. 文件或目录有两种表示方式: - 绝对路径:从根目录”/”开始 - 相对路径:从工作目录开始,使用”..”指向父目录,”.”指向当 ...
- 使用ETL构建数据仓库的思考
使用ETL构建数据仓库的思考 背景:公司的数据仓库建设项目启动在即,所谓万事开头难,如何在我们数仓建设规划的前期做好业务数据准备和系统建设规划是我们需要思考的问题,这里根据之前的自己参与过的公司ODS ...