Flash/Flex学习笔记(27):对象拖拽与投掷

对象拖拽:

这其实就是以前所学知识: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);

 
}

}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值