1.预备知识
(1)在画布上绘制外部图片资源
(2)梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度。如createLinearGradient,绘制梯度需要颜色组
http://www.w3school.com.cn/tags/canvas_createlineargradient.asp

function test1(){
//在画布上绘制外部图片资源
var ctx = document.getElementById('ballCanvas').getContext('2d')
var image =new Image()
image.src = 'football.jpg' ctx.drawImage(image,0,0,360,300)
}
//test1() function test2(){
/*
梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度。如createLinearGradient,
绘制梯度需要颜色组
http://www.w3school.com.cn/tags/canvas_createlineargradient.asp
*/
var ctx = document.getElementById('ballCanvas').getContext('2d')
var gradient = ctx.createLinearGradient(10,10,200,10)
var hue = ['#FFF','#F00','#000'] gradient.addColorStop(0,hue[0])
gradient.addColorStop(0.5,hue[1])
gradient.addColorStop(1,hue[2]) ctx.fillStyle = gradient
ctx.fillRect(10,10,200,100)
}
//test2()

2.实现思路
整个游戏中涉及的对象,包括运动的球(Ball),墙壁(Box),速度(Speed)。
同时,球必须在墙壁内部进行运动,碰到墙壁则会反弹。

当到球和墙壁碰撞的时候,运行方向会发生改变,这个改变对速度的绝对值没有变化,而是改变速度的正负。在实现过程中,我把方向的概念合并到

了速度对象中,主要是代码实现上的方便。

3.代码(片段)

			// Ball
function Ball(){
var opts,
ctx,
ballX,
ballY function drawBall(){
var ballOpts = opts.ballOpts
ballX = ballOpts.x
ballY = ballOpts.y ctx.lineWidth = ballOpts.lineWidth
ctx.strokeStyle = ballOpts.strokeStyle ctx.beginPath()
ctx.arc(ballX,ballY,ballOpts.radius,0,2*Math.PI,false)
ctx.closePath()
ctx.stroke()
} return { init : function(options){
opts = $.extend(options,{
canvas : null,
ballOpts : {
x : 100,
y : 100,
radius : 50,
lineWidth : 1,
strokeStyle : '#000'
}
}) var canvas = opts.canvas if(canvas==null){
alert('canvas is null.')
return
} ctx = canvas.getContext('2d')
drawBall() return this
}, /*
beginMove
@return:void
@speed:{offsetX:0,offsetY:0}
@box:Box instance
*/
beginMove : function(speed,box){
box.refresh() var boxSize = box.getSize(),
ballOpts = opts.ballOpts,
offsetX = speed.offsetX,
offsetY = speed.offsetY,
directionChanged = false // 判断球ball是在盒子box内边框(上,右,下,左)内
var boxInnerBoundry = { top:boxSize.y+boxSize.lineWidth,
right:boxSize.x+boxSize.lineWidth+boxSize.width,
bottom:boxSize.y+boxSize.lineWidth+boxSize.height,
left:boxSize.x+boxSize.lineWidth } var top = (ballY-ballOpts.radius-ballOpts.lineWidth)+offsetY,
right = (ballX+ballOpts.radius+ballOpts.lineWidth)+offsetX,
bottom = (ballY+ballOpts.radius+ballOpts.lineWidth)+offsetY,
left = (ballX-ballOpts.radius-ballOpts.lineWidth)+offsetX if(top<boxInnerBoundry.top){
ballY += top-boxInnerBoundry.top
offsetY = -offsetY directionChanged = true
} if(right>boxInnerBoundry.right){
ballX += right-boxInnerBoundry.right
offsetX = -offsetX directionChanged = true
} if(bottom>boxInnerBoundry.bottom){
ballY += offsetY - (bottom-boxInnerBoundry.bottom)
offsetY = -offsetY directionChanged = true
} if(left<boxInnerBoundry.left){
ballX += left-boxInnerBoundry.left
offsetX = -offsetX directionChanged = true
} ballX += offsetX
ballY += offsetY /*
必须变更当前速度speed,因为在定时器中传入的速度speed是个常量,
而实际运动中速度(用加号和减号来表示的方向是会改变的)
*/
if(directionChanged){
speed.changeSpeed(offsetX,offsetY)
} //alert(ballOpts.x+offsetX+'-'+ballOpts.y+offsetY) ctx.beginPath()
ctx.arc(ballX,ballY,ballOpts.radius,0,2*Math.PI,false)
ctx.closePath()
ctx.stroke()
} }
}

4.优化和完善
(1)主要还是在球和墙壁的判断上,通过大量的IF判断,实现得比较恶心
(2)速度实现为了类似的单例方式,不符合重用
(3)风格可以美化,加入外部图片资源等,比如美化成足球和球场
(4)引入加速度

【整理】HTML5游戏开发学习笔记(2)- 弹跳球的更多相关文章

  1. 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏

    <HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...

  2. 【整理】HTML5游戏开发学习笔记(5)- 猜谜游戏

    距上次学习笔记已有一个多月过去了,期间由于新项目赶进度,以致该学习计划给打断,十分惭愧.书本中的第六章的例子相对比较简单.所以很快就完成. 1.预备知识html5中video标签的熟悉 2.实现思路对 ...

  3. 【整理】HTML5游戏开发学习笔记(4)- 记忆力游戏

    1.预备知识(1)Canvas绘制多边形(2)Canvas绘制文字 2.实现思路涉及的对象  (1)场景Scene  场景代表了画布上的一块区域,场景里的每个物体都是场景里的一个元素,其绘制统一由场景 ...

  4. 【整理】HTML5游戏开发学习笔记(3)- 抛物线运动

    1.预备知识(1)Canvas旋转的实现过程 window.onload = function(){ var ctx = document.getElementById('canvas1').getC ...

  5. HTML5移动开发学习笔记之Canvas基础

    1.第一个Canvas程序 看的是HTML5移动开发即学即用这本书,首先学习Canvas基础,废话不多说,直接看第一个例子. 效果图为: 代码如下: <!DOCTYPE html> < ...

  6. [游戏开发-学习笔记]菜鸟慢慢飞(四)-Camera

    游戏开发中,主相机应该是最重要的GameObject之一,毕竟游戏呈现给玩家,就是通过它. 相机的使用,在不同的游戏中,有很大的不同.这里总结一下自己学到的一些相关知识. 固定位置-游戏过程中相机的T ...

  7. cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境

    打开用户文件夹下.bash_profile文件,配置环境 vim ~/.bash_profile //按键i,进行插入编辑(假设输错d进行删除一行) 环境配置过程例如以下: 1.首先配置下androi ...

  8. [Android游戏开发学习笔记]View和SurfaceView

    本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...

  9. Photon + Unity3D 线上游戏开发 学习笔记(一)

    大家好. 我也是学习Photon + unity3D 的新手 有什么说错的地方大家见谅哈. 我的开发环境是 unity3D 4.1.3  ,   Visual Studio 是2010 版本号的  p ...

随机推荐

  1. Python列表知识点讲解

    增删改查 增 X.append函数是在原有列表中的末尾追加一个新的元素存放在列表中 X.extend() 将一个列表中的元素添加到另一个列表中,将所引用的原列表保持不变,同时extend还可以运用到, ...

  2. 阿里云ubuntu16.04安装ruby

    0x0 准备 环境:阿里云轻量服务器ubuntu16.04 目的:安装beef需要的ruby环境 更新软件 sudo apt-get update sudo apt-get upgrade sudo ...

  3. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  4. Linux内核分析第一二章读书笔记

    linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...

  5. APP相关问题汇总

    APP试用过程中,我们的APP存在不少的问题,下面是一些试用者和我们自己发现的一些问题以及一些建议. 1.APP界面有些老气,界面之间过渡僵硬 2.在试用中会出现闪退情况 3.由于我们使用的是绝对布局 ...

  6. SDN可靠性相关

    A subtree-based approach to failure detection and protection for multicast in SDN FRONTIERS OF INFOR ...

  7. 关于java中指针的概念

    今天寡人遇到一个问题,扫描非关系数据库中的图(由node和rel组成),将其转化成由寡人自定义的gnode和gedge组成的图. gnode类包含结点的id,label和包含此gnode的gedge的 ...

  8. vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)

    我们将vmwear虚拟机导出ovf模板后,有三个文件: 1,.mf 保存着.ovf和.vmdk两个文件的SHA1值,用于校验文件的完整性 2,.ovf 以XML格式保存着虚拟机的配置信息 3,.vmd ...

  9. ELK之消息队列选择redis_kafka_rabbitmq

    前言描述 生产初级,Service服务较少,访问量较少,随着业务量的不断增加,日志量成倍增长,然后就遇到了消息队列redis被充爆,不能满足应用的情况.针对此情况,我们来分析下可用的消息多列. 官方推 ...

  10. Java微信二次开发(二)

    第二天,做微信文本消息接口请求与发送 需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar 第一步:新建包com.wtz.message.response,新建类BaseMe ...