课程/HTML/CSS/前端开发
HTML5小游戏---爱心鱼(上)
-
-
大大米
2020-03-05
5、大鱼吃果实的碰撞检测
原理:
检测大鱼和果实的距离
-
截图
0赞 · 0采集
-
-
兔儿月饼
2017-10-07
- 第一批果实吃了没消失,而后来的果实能吃掉的,可以把fruit初始化中的fruit.born()去掉, 在gameloop中一样可以产生果实.
-
0赞 · 0采集
-
-
java家洼
2016-06-24
- 3,利用calLength2和dead方法完成大鱼吃果实的效果。
//判断大鱼和果实的距离
function momFruitsCollision(){
for(var i=0;i<fruit.num;i++){
if(fruit.alive[i]){
//calculate length
var l=calLength2(fruit.x[i],fruit.y[i], mom.x, mom.y);
if(l<900){
//fruit eaten
fruit.dead(i);
}
}
}
}
好,我们再检查一下,
首先做所有fruit的循环,如果当前这个fruit处于活着的状态,那就计算它跟大鱼之间的距离,我们得到的是距离的平方,如果这个距离很小,那么这个果实就被吃掉了,好,我们把这个函数momFruitsCollision放到总循环里面。我们再来打开浏览器,
的确可以看到,果实被大鱼碰到的,就消失了,没有问题,ok,这样子大鱼吃果实的碰撞检测就写好了,我们看下一个任务。
4,课后总结:
为什么是小于900px,就判定大鱼吃到果实了呢?
因为大鱼的坐标指的是,大鱼身体的中心位置,果实的坐标是果实的中心位置,如果大鱼和果实相切(刚好挨着),那么它们中心的距离就是0.5*21+0.5*50,然后再平方,就差不多是900了。
-
0赞 · 0采集
-
-
java家洼
2016-06-24
- 2,在果实类中添加dead方法
function momFruitsCollision(){
for(var i=0;i<fruit.num;i++){
if(fruit.alive[i]){
//calculate length
var l=calLength2(fruit.x[i],fruit.y[i], mom.x, mom.y);
}
}
}
如果这个距离l小于某一个值,因为l是一个平方值,30的平方就是900,如果小于900的话,那么这个fruit就被吃掉,
这个果实被吃掉了,需要在果实类里面加一个方法,这个方法的功能就是让当前果实死亡,执行一个死亡的状态,什么叫死亡呢?
就是果实从屏幕上消失了,怎么消失呢?也就是它的alive状态被设置成false,这样子它就消失了,
fruitObj.prototype.dead=function(i){
this.alive[i]=false;
}
好,就要使用这个dead方法,
-
1赞 · 0采集
-
-
java家洼
2016-06-24
- 1, 老师封装好的函数calLength2来计算大鱼和果实之间距离的平方和
我们再回到ppt来,画大鱼,身子,尾巴,眼睛已经画好了。我们再看一个下面的,我们下一个任务是大鱼吃果实的碰撞检测:
这个原理就是检测大鱼和果实的距离,也就是我们在每一帧的时候去判断一下,大鱼和这个果实距离是不是足够近,足够近的话,
就判定它已经吃到了,然后如果这个距离非常远,然后就判定这个果实没有被吃掉,好,那么我们回到代码中,我们来新建一个文件,Ctrl+N,Ctrl+s,collision.js这个文件里面只存放碰撞检测的功能,首先把这个脚本包含到html里面。我们要做的是判断大鱼和屏幕上每一个果实的距离,如果小于某一个值,我们就认为大鱼把这个果实吃掉了,如果大于这个值,果实仍然继续它的运动
好,现在来写这个功能,因为果实非常的多,我们需要做一个循环,来对比每一个果实,这所有的果实,首先判断它是否在alive状态,如果在alive状态的话,再去判断它跟大鱼之间的距离,判断距离使用它们的坐标差,我们这样得到一个斜边的大小,而实际上我们在计算的时候不需要去开平方,三角里面不需要去开平方,因为开平方或者不开平方对于我们都没有关系,在commonFunctions.js里面有一个封装好的方法:
function calLength2(x1, y1, x2, y2) {
return Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2);
}
距离值的平方,它是这两对坐标(x1,y1),(x2,y2)的差的平方和,pow是乘方的函数,次数是2(pow第二个参数),也就是(x1-x2)的平方加上(y1-y2)的平方,这样呢,在一个三角里面我们得到的就是斜边的平方,也就是大鱼跟果实之间距离的平方。我们把这封装好的函数拿过来用,大家可以经常把这些很普通的函数封装好,然后我们每次就不必去写,否则每次去写要写正确这些API如pow,还有乘方的次数,大家封装好就可以很好的去用了
-
1赞 · 0采集
-
-
EyreSS
2016-05-12
- 大鱼和果实碰撞
-
截图
0赞 · 0采集
-
-
珍惜小燕子
2016-02-17
- 画大鱼用到的函数
-
截图
0赞 · 0采集