Flash动画教程学习(四)--高级动画2
第九章 碰撞检测
- 两种方法:基于对象实际像素;基于对象间的距离
- 基于对象实际像素:
1> hitTestObject方法:测试一个显示对象是否碰撞到另一个
sprite1.hitTestObject(sprite2):如果碰撞返回true//非常不精确,基于矩形检测
2> hitTestPoint方法:测试一个指定的点是否碰撞到一个显示对象
不适合检测两个精灵之间的碰撞;还是检测点和矩形;
Sprite1.hitTestPoint(100,100);
3> 使用shapeFlag的碰撞测试:检测点和精灵可视图像的碰撞
If(ball1.hitTestPoint(mouseX,mousy,true)):非常准确,但是不一定应用到所有碰撞检测
拓展:两个星星,每个星星五个测试点;对于非常小的精灵可以用上述方法检测
- 基于对象间的距离:不是内置方法
Dist = Math.sqrt(x*x + y*y);
关于碰撞的弹性:
- 多物体碰撞检测策略:
1> 检查是否有重复碰撞检测、最初的结果是所需要的两倍
物体两两相撞嵌套循环:
for(var i:uint = 0; i < numBalls - 1; i++)
for(var j:uint = i + 1; j < numBalls; j++)
2> 其他的碰撞检测方法:
www.gskinner.com
第十章 坐标旋转和角度回弹
- 简单的坐标旋转:
ball.x = stage.stageWidth / 2 + Math.cos(angle) * radius;
trace(ball.x);
ball.y = stage.stageHeight / 2 + Math.sin(angle) * radius;
angle += vr;
- 高级坐标旋转:高效
var x1:Number = ball.x - stage.stageWidth / 2;
var y1:Number = ball.y - stage.stageHeight / 2;
var x2:Number = cos * x1 - sin * y1;
var y2:Number = cos * y1 + sin * x1;
ball.x = stage.stageWidth / 2 + x2;
ball.y = stage.stageHeight / 2 + y2;
- 沿角度回弹:
坐标旋转:
x1 = cos * x2 - sin * y2;
y1 = cos * y2 + sin * x2;
反转坐标旋转:
x1 = cos * x2 +sin * y2;
y1 = cos * y2 - sin * x2;
第十一章 台球物理
- 质量、
- 动量:p = m * v ;
- 动量守恒:m0*v0+m1*v1 = m0*v0final+m1+v1final;
KE = 0.5*v2
得出:m0*v02+m1*v12 = m0*v0final2+m1*v1*final2
两个小球相撞:
var vx0Final:Number = ((ball0.mass - ball1.mass) * ball0.vx + 2 * ball1.mass * ball1.vx) / (ball0.mass + ball1.mass);
var vx1Final:Number = ((ball1.mass - ball0.mass) * ball1.vx + 2 * ball0.mass * ball0.vx) / (ball0.mass + ball1.mass);
ball0.vx = vx0Final;
ball1.vx = vx1Final;
ball0.x += ball0.vx;
ball1.x += ball1.vx;