对象拖拽:
这其实就是以前所学知识:Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) + Flash/Flex学习笔记(23):运动学原理 的综合运用,要提一下的是下面代码中对于EnterFrame的添加与移除操作
package
{
import
flash.display.Sprite;
import
flash.display.StageAlign;
import
flash.display.StageScaleMode;
import
flash.events.Event;
import
flash.events.MouseEvent;
import
flash.ui.Mouse;
import
flash.ui.MouseCursor;
public
class
Bouncing2
extends
Sprite {
private
var
ball:Ball;
private
var
vx:
Number
;
private
var
vy:
Number
;
private
var
bounce:
Number
=-
0.8
;
//反弹速度百分比
private
var
gravity:
Number
=
0.9
;
//重力加速度百分比
private
var
frictionX:
Number
=
0.98
;
//摩擦力因子--水平方向
private
var
frictionY:
Number
=
0.99
;
//摩擦力因子--垂直方向
public
function
Bouncing2() {
init();
}
private
function
init():
void
{
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
ball=
new
Ball(
20
) ;
ball.x=stage.stageWidth/
2
;
ball.y=stage.stageHeight/
2
;
vx=(Math.random()*
2
-
1
) *
20
;
vy=-
10
;
addChild(ball);
ball.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);
ball.addEventListener(MouseEvent.MOUSE_OVER,
function
(){ Mouse.cursor = MouseCursor.HAND;});
ball.addEventListener(MouseEvent.MOUSE_OUT,
function
(){ Mouse.cursor = MouseCursor.AUTO;});
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
}
private
function
EnterFrameHandler(event:Event):
void
{
vy+=gravity;
//加入重力加速度,所以肯定会向下掉
vx *= frictionX;
//加入摩擦力,所以最终会停下来
vy *= frictionY;
ball.x+=vx;
//产生移动
ball.y+=vy;
var
left:
Number
=
0
;
var
right:
Number
=stage.stageWidth;
var
top:
Number
=
0
;
var
bottom:
Number
=stage.stageHeight;
//水平方向边界检测
if
(ball.x+ball.radius>right) {
ball.x=right-ball.radius;
vx*=bounce;
}
else
if
(ball.x - ball.radius < left) {
ball.x=left+ball.radius;
vx*=bounce;
}
//垂直方向边界检测
if
(ball.y+ball.radius>bottom) {
ball.y=bottom-ball.radius;
vy*=bounce;
}
else
if
(ball.y - ball.radius < top) {
ball.y=top+ball.radius;
vy*=bounce;
}
}
private
function
MouseDownHandler(e:MouseEvent):
void
{
stage.addEventListener(MouseEvent.MOUSE_UP,MouseUpHandler);
ball.startDrag();
removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);
//移除EnterFrame事件,否则在拖动过程中,小球还在不断下掉
}
private
function
MouseUpHandler(e:MouseEvent):
void
{
stage.removeEventListener(MouseEvent.MOUSE_UP,MouseUpHandler);
ball.stopDrag();
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
//拖动完成后,恢复EnterFrame事件监听,以便小球能不断运动
}
}
}
对象投掷:
在上面的代码中,鼠标的拖拽只影响了小球的y坐标(注:指对运动方面的影响),即仅相当于举高了小球。而投掷则意味着:在鼠标松开小球的那一瞬间,小球也应该具备有一定的出口速度(即鼠标最终的移动速度)。Flash中每一帧对应的时间基本上是相同的,可以认为这就是物理中的“单位时间”,根据刚才对投掷概念的理解,只要代码能得知在鼠标松开小球的最后一帧,小球在x,y轴方向的位移,即为小球的出口x,y轴速度.
package
{
import
flash.display.Sprite;
import
flash.display.StageAlign;
import
flash.display.StageScaleMode;
import
flash.events.Event;
import
flash.events.MouseEvent;
import
flash.ui.MouseCursor;
import
flash.ui.Mouse;
public
class
Throwing
extends
Sprite {
private
var
ball:Ball;
private
var
vx:
Number
;
private
var
vy:
Number
;
private
var
bounce:
Number
=-
0.8
;
private
var
gravity:
Number
=
0.75
;
private
var
frictionX:
Number
=
0.98
;
private
var
frictionY:
Number
=
0.99
;
private
var
oldX:
Number
;
private
var
oldY:
Number
;
public
function
Throwing() {
init();
}
private
function
init():
void
{
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
ball =
new
Ball(
30
);
ball.x = stage.stageWidth/
2
;
ball.y = stage.stageHeight/
2
;
vx = Math.random()*
10
-
5
;
vy = -
10
;
addChild(ball);
ball.addEventListener(MouseEvent.MOUSE_DOWN, MouseDownHandler);
ball.addEventListener(MouseEvent.MOUSE_OVER,
function
(){Mouse.cursor = MouseCursor.HAND;});
ball.addEventListener(MouseEvent.MOUSE_OUT,
function
(){Mouse.cursor = MouseCursor.AUTO;});
addEventListener(Event.ENTER_FRAME, EnterFrameHandler);
}
private
function
MouseDownHandler(event:MouseEvent):
void
{
oldX = ball.x;
oldY = ball.y;
stage.addEventListener(MouseEvent.MOUSE_UP, MouseUpHandler);
ball.startDrag();
removeEventListener(Event.ENTER_FRAME, EnterFrameHandler);
addEventListener(Event.ENTER_FRAME, TrackVelocity);
}
private
function
EnterFrameHandler(event:Event):
void
{
vy += gravity;
vx *= frictionX;
vy *= frictionY;
ball.x += vx;
ball.y += vy;
var
left:
Number
=
0
;
var
right:
Number
=stage.stageWidth;
var
top:
Number
=
0
;
var
bottom:
Number
=stage.stageHeight;
if
(ball.x+ball.radius>right) {
ball.x=right-ball.radius;
vx*=bounce;
}
else
if
(ball.x - ball.radius < left) {
ball.x=left+ball.radius;
vx*=bounce;
}
if
(ball.y+ball.radius>bottom) {
ball.y=bottom-ball.radius;
vy*=bounce;
}
else
if
(ball.y - ball.radius < top) {
ball.y=top+ball.radius;
vy*=bounce;
}
}
//跟踪每一帧小球的速度(坐标位置)
private
function
TrackVelocity(event:Event):
void
{
vx = ball.x-oldX;
vy = ball.y-oldY;
oldX = ball.x;
oldY = ball.y;
}
private
function
MouseUpHandler(e:MouseEvent):
void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, MouseUpHandler);
ball.stopDrag();
removeEventListener(Event.ENTER_FRAME, TrackVelocity);
addEventListener(Event.ENTER_FRAME, EnterFrameHandler);
}
}
}