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

简介: 对象拖拽: 这其实就是以前所学知识:Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) + Flash/Flex学习笔记(23):运动学原理 的综合运用,要提一下的是下面代码中对于EnterFrame的添加与移除操作 package { import flash.

对象拖拽:

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

目录
相关文章
|
内存技术
Flash/Flex学习笔记(21):利用colorTransform改变对象的颜色及透明度
transform是flash.Display.DisplayObject的属性之一,而colorTransform又是transform的属性,这也就意味着几乎所有对象都可以使用colorTransform属性   这是官方的解释: 当 ColorTransform 对象应用于显示对象时,将...
865 0
|
内存技术
Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动
对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象,这startDrag/stopDrag是不能用的,这时候只能采用最通常用做法:利用Mouse_Dow...
821 0
|
内存技术
Flash/Flex学习笔记(35):如何正确监听Stage对象的事件
如果想在一个自定义类中注册对stage对象的监听事件,然后在另一个文档类中使用该类的实例(或在fla的时间轴上使用该类的实例),你会很郁闷的发现:在构造函数中始终无法引用到this.stage(用trace(this.
654 0
|
内存技术
Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag)
Flash中只有影片MovieClip(准确的讲是Sprite)可以调用startDrag,endDrag,创建对象拖动最简单的办法只要调用这二个方法即可 myobj.addEventListener(MouseEvent.
937 0
|
内存技术
Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)
FMS中的“远程共享对象”可以让多个Client端的flash应用共享同一个全局对象,并且当客户端中的任何一个改变该对象时,系统会自动将该对象回发到FMS服务器,同时FMS服务器也会将该对象重新广播到所有客户端。
1054 0
|
4月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
169 0
|
4月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
368 1
|
8月前
|
设计模式 容器
13.HarmonyOS流式卡片列表实现指南:Flex多行布局详解
在现代移动应用开发中,流式卡片列表是一种常见且实用的UI设计模式。它能够自适应屏幕宽度,在有限空间内高效展示多个内容项。本教程将详细讲解如何使用HarmonyOS的ArkUI框架中的Flex组件实现一个灵活的流式卡片列表,重点关注多行布局与对齐策略的应用。
286 2
|
8月前
|
开发者 UED 容器
07.精通HarmonyOS Flex对齐:从基础到高级布局技巧(上)
在HarmonyOS Next的ArkUI框架中,Flex容器提供了强大而灵活的对齐系统,使开发者能够精确控制子元素在容器中的排列方式。掌握这些对齐技术,是构建专业级用户界面的关键。
257 0
|
8月前
|
UED 容器
5.HarmonyOS Next开发宝典:掌握Flex布局的艺术
Flex布局(弹性布局)是HarmonyOS Next中最强大的布局方式之一,它提供了一种更加高效、灵活的方式来对容器中的子元素进行排列、对齐和分配空间。无论是简单的居中显示,还是复杂的自适应界面,Flex布局都能轻松应对。
270 0

热门文章

最新文章