2008年10月5日星期日

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

设置边界
播放器窗口改变大小后希望舞台的尺寸与播放器尺寸相匹配
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

影片的左上边界将为零,而右下边界将为 stage.stageWidth 和 stage.stageHeight。
如下:
private var left:Number = 0;
private var top:Number = 0;
private var right:Number = stage.stageWidth;
private var bottom:Number = stage.stageHeight;

看它们是否仍在这个空间内,这里可以使用 if 语句
if(ball.x > stage.stageWidth) {
// do something
}
else if(ball.x < 0) {
// do something
}
if(ball.y > stage.stageHeight) {
// do something
}
else if(ball.y < 0)
{ // do something
}
移除对象
1. removeChild(对象名),删除影片或显示对象,会将对象实例从舞台上移除。请注意,被移除的显示对象仍然存在,只是看不到而已。如果要将该对象彻底删除,还应该调用 delete 对象名 将其完全删除。
2. removeEventListener(Event.ENTER_FRAME, onEnterFrame);

因为注册点在中心,所以,可以将宽度的一半保存为 radius 属性。
代码如下:
if(ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0) {
removeChild(ball);
}


var ball:Ball=Ball(balls[i]);????????????????????????????????
移除对象
for (var i:Number=balls.length - 1; i > 0; i--) { var ball:Ball=Ball(balls[i]); 97
ball.x+= ball.vx; ball.y+= ball.vy; if (ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0) { removeChild(ball); balls.splice(i,1);

重置对象
if (ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0) { ball.x = stage.stageWidth / 2; ball.y = stage.stageHeight; ball.vx = Math.random() * 2 - 1; ball.vy = Math.random() * -10 - 10; }

屏幕环绕
var left:Number = 0; var right:Number = stage.stageWidth; var top:Number = 0; var bottom:Number = stage.stageHeight; if (ship.x - ship.width / 2 > right) { ship.x = left - ship.width / 2; } else if (ship.x + ship.width / 2 < left) { ship.x = right + ship.width / 2; } if (ship.y - ship.height / 2 > bottom) { ship.y = top - ship.height / 2; } else if (ship.y < top - ship.height / 2) { ship.y = bottom + ship.height / 2; }

反弹
如果物体超出了左、右边界,只需要使它的 x 速度向量取反。如果超出了上、下边界,只需要让 y 速度向量取反
:vx *= -1 或 vy *= -1。

摩擦力,正确的方法
摩擦力是与速度向量相反的力
var speed:Number = Math.sqrt(vx * vx + vy * vy);
var angle:Number = Math.atan2(vy, vx);
然后就可以从速度向量中减去速度。如果摩擦力大于速度,速度就变为零,计算代码如下: if (speed > friction) {
speed -= friction;
} else {
speed = 0;
}
正弦和余弦将角速度转换回 vx 和 vy,如下:
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;

摩擦力,简便的方法
vx *= friction; 106
vy *= friction;

本章重要公式

移除出界对象:
if(sprite.x - sprite.width / 2 > right || sprite.x + sprite.width / 2 < left || sprite.y – sprite.height / 2 > bottom || sprite.y + sprite.height / 2 < top) { // 移除影片的代码
}

重置出界对象:
if(sprite.x - sprite.width / 2 > right || sprite.x + sprite.width / 2 < left || sprite.y – sprite.height / 2 > bottom || sprite.y + sprite.height / 2 < top) {
// 重置影片的位置和速度
}

屏幕环绕出界对象:
if (sprite.x - sprite.width / 2 > right) {
sprite.x = left - sprite.width / 2;
} else if (sprite.x + sprite.width / 2 < left) {
sprite.x = right + sprite.width / 2;
} if (sprite.y – sprite.height / 2 > bottom) {
sprite.y = top – sprite.height / 2;
} else if (sprite.y + sprite.height / 2 < top) {
sprite.y = bottom + sprite.height / 2;
}

摩擦力应用(正确方法):
speed = Math.sqrt(vx * vx + vy * vy);
angle = Math.atan2(vy, vx);
if (speed > friction) {
speed -= friction;
} else {
speed = 0;
}
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;

摩擦力应用(简便方法):
vx *= friction;
vy *= friction;

没有评论: