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

对象拖拽:

这其实就是以前所学知识: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 条评论
登录 后参与评论

相关文章

来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

SSE图像算法优化系列六:OpenCv关于灰度积分图的SSE代码学习和改进。

  最近一直沉迷于SSE方面的优化,实在找不到想学习的参考资料了,就拿个笔记本放在腿上翻翻OpenCv的源代码,无意中看到了OpenCv中关于积分图的代码,仔细...

507100
来自专栏章鱼的慢慢技术路

用OpenGL实现跳跃的立体小球

22320
来自专栏游戏开发那些事

【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

15620
来自专栏移动端开发

Swift 实现俄罗斯方块详细思路解析(附完整项目)

    俄罗斯方块,是一款我们小时候都玩过的小游戏,我自己也是看着书上的思路,学着用 Swift 来写这个小游戏,在写这个游戏的过程中,除了一些位置的计算,数据...

14220
来自专栏章鱼的慢慢技术路

Python中的高级turtle(海龟)作图

59320
来自专栏华章科技

技巧:Excel用得好,天天没烦恼

分析公司DarkHorse Analytics 从美国劳工统计处获得数据,并制作了这张二十四小时会唿吸的地图,显示曼哈顿的工作与在宅人口。

13140
来自专栏图形学与OpenGL

CG实验5 简单光照明模型

(1) 示范代码为立方体在一束平行光照射下的漫反射光照效果。结合示范代码,学习掌握简单光照明模型的基本原理与实现; (2) 修改示范代码,给出不同光照参数...

16430
来自专栏Python爬虫实战

看了《最强大脑》,我决定做这个游戏

今年年初,新一季的《最强大脑》开播了,第一集选拔的时候大家做了一个数字游戏,名叫《数字华容道》,当时何猷君以二十几秒的成绩夺得该项目的冠军,来看一下当时的比赛:

13220
来自专栏移动端开发

Swift 实现俄罗斯方块详细思路解析(附完整项目)

一:写在开发前     俄罗斯方块,是一款我们小时候都玩过的小游戏,我自己也是看着书上的思路,学着用 Swift 来写这个小游戏,在写这个游戏的过程中,除了一些...

41580
来自专栏菩提树下的杨过

silverlight:手写板/涂鸦/墨迹/InkPresenter示例程序

这种应用现在已经比较常见了,比如论坛回贴中的手写功能 ,IM聊天中的个性化手写文字,个性签名等,在Silverlight中要实现该功能其实非常简单,只要一个I...

365100

扫码关注云+社区

领取腾讯云代金券