2008年10月16日星期四

《making things move》笔记(第九章)

--竟然十天没有看这本书了

hitTest 总结
hitTest 的基本设置:
■ 对于矩形影片,使用 hitTestObject(displayObject)。
■ 对于非常小的影片,使用 hitTestPoint(x, y, true)(注意将 shapeFlag 设置为 true)。
■ 对于非常不规则的影片图形,如果不要求非常精确或自定义一些解决方法的话,那么也可以使用 hitTestPoint(x, y, true)。

距离碰撞检测
处理圆形时效果最好
两个物体间距离的方法,
var dx:Number = sprite2.x - sprite1.x;
var dy:Number = sprite2.y - sprite1.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);


例:
private function onEnterFrame(event:Event):void {

var dx:Number = ball2.x - ball1.x;
var dy:Number = ball2.y - ball1.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
if (dist < ball1.radius + ball2.radius) {
trace("hit");
}
}


基本的多物体碰撞检测
numSprites = 6;
for (i = 0; i < numSprites - 1; i++) {
spriteA = sprites[i];
for (j = i + 1; j < numSprites; j++) {
spriteB = sprites[j];
if (spriteA.hitTestObject(spriteB)) {
// do whatever
}
}
}

Math.cos 和 Math.sin 求出目标点:
var angle:Number = Math.atan2(dy, dx);
var tx:Number = ball0.x + Math.cos(angle) * minDist;
var ty:Number = ball0.y + Math.sin(angle) * minDist;
但是大家不要忘记,正弦是对边与斜边之比,而余弦是邻边与斜边之比。
请注意,该角的对边就是 dy,邻边就是 dx,而斜边就是 dist。
所以,我们实际上可以将这三行代码缩短为两行:
var tx:Number = ball0.x + dx / dist * minDist;
var ty:Number = ball0.y + dy / dist * minDist;

距离碰撞检测: // 从 spriteA 和 spriteB 开始 // 如果使用一个空白影片,或影片没有半径(radius)属性 166
// 可以用宽度与高度除以 2。 var dx:Number = spriteB.x - spriteA.x; var dy:Number = spriteB.y - spriteA.y; var dist:Number = Math.sqrt(dx * dx + dy * dy); if (dist < spriteA.radius + spriteB.radius) { // 处理碰撞 }
多物体碰撞检测: var numObjects:uint = 10; for (var i:uint = 0; i < numObjects - 1; i++) { // 使用变量 i 提取引用 var objectA = objects[i]; for (var j:uint = i+1; j //使用变量 j 提取引用 var objectB = objects[j]; // 在 objectA 与 objectB 之间进行碰撞检测 } }

没有评论: