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

  1. function test1(){
  2. //在画布上绘制外部图片资源
  3. var ctx = document.getElementById('ballCanvas').getContext('2d')
  4. var image =new Image()
  5. image.src = 'football.jpg'
  6.  
  7. ctx.drawImage(image,0,0,360,300)
  8. }
  9. //test1()
  10.  
  11. function test2(){
  12. /*
  13. 梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度。如createLinearGradient,
  14. 绘制梯度需要颜色组
  15. http://www.w3school.com.cn/tags/canvas_createlineargradient.asp
  16. */
  17. var ctx = document.getElementById('ballCanvas').getContext('2d')
  18. var gradient = ctx.createLinearGradient(10,10,200,10)
  19. var hue = ['#FFF','#F00','#000']
  20.  
  21. gradient.addColorStop(0,hue[0])
  22. gradient.addColorStop(0.5,hue[1])
  23. gradient.addColorStop(1,hue[2])
  24.  
  25. ctx.fillStyle = gradient
  26. ctx.fillRect(10,10,200,100)
  27. }
  28. //test2()

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

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

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

3.代码(片段)

  1. // Ball
  2. function Ball(){
  3. var opts,
  4. ctx,
  5. ballX,
  6. ballY
  7.  
  8. function drawBall(){
  9. var ballOpts = opts.ballOpts
  10. ballX = ballOpts.x
  11. ballY = ballOpts.y
  12.  
  13. ctx.lineWidth = ballOpts.lineWidth
  14. ctx.strokeStyle = ballOpts.strokeStyle
  15.  
  16. ctx.beginPath()
  17. ctx.arc(ballX,ballY,ballOpts.radius,0,2*Math.PI,false)
  18. ctx.closePath()
  19. ctx.stroke()
  20. }
  21.  
  22. return {
  23.  
  24. init : function(options){
  25. opts = $.extend(options,{
  26. canvas : null,
  27. ballOpts : {
  28. x : 100,
  29. y : 100,
  30. radius : 50,
  31. lineWidth : 1,
  32. strokeStyle : '#000'
  33. }
  34. })
  35.  
  36. var canvas = opts.canvas
  37.  
  38. if(canvas==null){
  39. alert('canvas is null.')
  40. return
  41. }
  42.  
  43. ctx = canvas.getContext('2d')
  44. drawBall()
  45.  
  46. return this
  47. },
  48.  
  49. /*
  50. beginMove
  51. @return:void
  52. @speed:{offsetX:0,offsetY:0}
  53. @box:Box instance
  54. */
  55. beginMove : function(speed,box){
  56. box.refresh()
  57.  
  58. var boxSize = box.getSize(),
  59. ballOpts = opts.ballOpts,
  60. offsetX = speed.offsetX,
  61. offsetY = speed.offsetY,
  62. directionChanged = false
  63.  
  64. // 判断球ball是在盒子box内边框(上,右,下,左)内
  65. var boxInnerBoundry = { top:boxSize.y+boxSize.lineWidth,
  66. right:boxSize.x+boxSize.lineWidth+boxSize.width,
  67. bottom:boxSize.y+boxSize.lineWidth+boxSize.height,
  68. left:boxSize.x+boxSize.lineWidth }
  69.  
  70. var top = (ballY-ballOpts.radius-ballOpts.lineWidth)+offsetY,
  71. right = (ballX+ballOpts.radius+ballOpts.lineWidth)+offsetX,
  72. bottom = (ballY+ballOpts.radius+ballOpts.lineWidth)+offsetY,
  73. left = (ballX-ballOpts.radius-ballOpts.lineWidth)+offsetX
  74.  
  75. if(top<boxInnerBoundry.top){
  76. ballY += top-boxInnerBoundry.top
  77. offsetY = -offsetY
  78.  
  79. directionChanged = true
  80. }
  81.  
  82. if(right>boxInnerBoundry.right){
  83. ballX += right-boxInnerBoundry.right
  84. offsetX = -offsetX
  85.  
  86. directionChanged = true
  87. }
  88.  
  89. if(bottom>boxInnerBoundry.bottom){
  90. ballY += offsetY - (bottom-boxInnerBoundry.bottom)
  91. offsetY = -offsetY
  92.  
  93. directionChanged = true
  94. }
  95.  
  96. if(left<boxInnerBoundry.left){
  97. ballX += left-boxInnerBoundry.left
  98. offsetX = -offsetX
  99.  
  100. directionChanged = true
  101. }
  102.  
  103. ballX += offsetX
  104. ballY += offsetY
  105.  
  106. /*
  107. 必须变更当前速度speed,因为在定时器中传入的速度speed是个常量,
  108. 而实际运动中速度(用加号和减号来表示的方向是会改变的)
  109. */
  110. if(directionChanged){
  111. speed.changeSpeed(offsetX,offsetY)
  112. }
  113.  
  114. //alert(ballOpts.x+offsetX+'-'+ballOpts.y+offsetY)
  115.  
  116. ctx.beginPath()
  117. ctx.arc(ballX,ballY,ballOpts.radius,0,2*Math.PI,false)
  118. ctx.closePath()
  119. ctx.stroke()
  120. }
  121.  
  122. }
  123. }

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. MOSFET简介以及PMOS和NMOS的差异

    最近在工作中,一直在调试关于MOSFET的电路.在设计过程中发现了PMOS和NMOS的差异,在此记录. 一. MOSFET简介 MOSFET (metal-oxide-semiconductor fi ...

  2. 自动化部署-Jenkins+SVN+MSBuild 一些补充

    1.ftp的使用 系统管理->插件管理 安装插件Publish Over FTP 系统管理->系统设置 配置ftp参数 如下图 进入任务配置,添加构建后操作 在使用过程中还遇到一个本地防火 ...

  3. Intellij Idea 创建JavaWeb项目入门(一)

    Idea创建JavaWeb项目步骤:1.打开Intellij Idea IDE,然后点击Create New Project 2.左侧选择Java Enterprise,右侧选择Web Applica ...

  4. UART协议总结

    之前一直使用UART作为单片机之间以及和计算机的简单通信,但一直没有研究过该协议的内部原理.今天刚买了一个逻辑分析仪,于是使用该分析仪对UART数据进行分析,以便更好的理解UART协议原理. UART ...

  5. NetScaler 10.1的配置以及结合StoreFront的部署

    工作需要,所以英文+中文,绝壁不是装逼...(关于这点勿喷) This post will cover only the basics for getting NetScaler up and run ...

  6. Dummy Sample

    转载至:http://www.bubuko.com/infodetail-2495860.html :https://www.cnblogs.com/richered/p/8417378.html

  7. 部分机器进入bios 的 方法

  8. 2013长春网赛1004 hdu 4762 Cut the Cake

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题意:有个蛋糕,切成m块,将n个草莓放在上面,问所有的草莓放在同一块蛋糕上面的概率是多少.2 & ...

  9. 数据库中增加操作insert into的用法和查询select的用法

    insert into的用法 1.一条insert into 可以插入多条记录 2.insert into 能判断主键是否冲突,和做出冲突处理 如果主键冲突的话会报错,还能写成如果冲突就更新的形式格式 ...

  10. java学习一 path与classpath

    path 任意目录下执行 javac JAVA  classpath找到指定目录下的.class文件 前提是进入该文件目录里面 生成.class文件; 变量 的两个特性:1.约束了类型 2.约束了范围 ...