【整理】HTML5游戏开发学习笔记(2)- 弹跳球
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)- 弹跳球的更多相关文章
- 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏
<HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...
- 【整理】HTML5游戏开发学习笔记(5)- 猜谜游戏
距上次学习笔记已有一个多月过去了,期间由于新项目赶进度,以致该学习计划给打断,十分惭愧.书本中的第六章的例子相对比较简单.所以很快就完成. 1.预备知识html5中video标签的熟悉 2.实现思路对 ...
- 【整理】HTML5游戏开发学习笔记(4)- 记忆力游戏
1.预备知识(1)Canvas绘制多边形(2)Canvas绘制文字 2.实现思路涉及的对象 (1)场景Scene 场景代表了画布上的一块区域,场景里的每个物体都是场景里的一个元素,其绘制统一由场景 ...
- 【整理】HTML5游戏开发学习笔记(3)- 抛物线运动
1.预备知识(1)Canvas旋转的实现过程 window.onload = function(){ var ctx = document.getElementById('canvas1').getC ...
- 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 ...
随机推荐
- nodejs安装及npm模块插件安装路径配置
在学习完js后,我们就要进入nodejs的学习,因此就必须配置nodejs和npm的属性了. 我相信,个别人在安装时会遇到这样那样的问题,看着同学都已装好,难免会焦虑起来.于是就开始上网查找解决方案, ...
- Nginx+IIS分布式部署和负载均衡
1.IIS中部署2个网站 创建2个网站,端口分别为9001.9002 2.下载Nginx 可以进入Nginx官网进行下载,官网地址: http://nginx.org/,需要下载windows版的 3 ...
- 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)
扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...
- #Linux第四周学习总结——扒开系统调用的三层皮(上)
Linux第四周学习总结--扒开系统调用的三层皮(上) 一.用户态.内核态和中断 系统调用通过库函数. 1.用户态和内核态 区分(不同的指令执行级别): 用户态:在相应的低执行状态下,代码的掌控范围受 ...
- 配置HugePage
翻译自https://www.thegeekdiary.com/centos-rhel-67-how-to-configure-hugepages/ 什么是HugePage HugePages是Lin ...
- 剑指offer:从上往下打印二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路: 实际就是二叉树的中序遍历问题.之前在leetcode刷过类似题目. 利用队列完成即可. 代码: /* struct Tr ...
- Beta阶段综合报告
一. 敏捷冲刺每日报告 http://www.cnblogs.com/mia0502/p/7767628.html http://www.cnblogs.com/mia0502/p/7773872.h ...
- 读C#程序(第三周)
阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...
- _stdcall 和 _cdecl
今天遇到一个问题用C++编写一个动态链接库生成的文件为dll.dll,用在visual stdio 2010调用这个dll 调用形式:[DllImport("dll.dll")] ...
- Linux命令(十五) 打包或解压文件 tar
目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 tar 命令用于将文件打包或解压,扩展名一般为 ".tar" ,指定特定的参数可以调用 gzip 或 bzi ...