• 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);
    		}
    		
    		
    	}
    }
    

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【JAVA零基础入门系列】Day13 Java类的继承与多态
    【JAVA零基础入门系列】Day12 Java类的简单应用
    【JAVA零基础入门系列】Day11 Java中的类和对象
    【JAVA零基础入门系列】Day10 Java中的数组
    【JAVA零基础入门系列】Day9 Java中的那个大数值
    【JAVA零基础入门系列】Day8 Java的控制流程
    【JAVA零基础入门系列】Day7 Java输入与输出
    【JAVA零基础入门系列】Day6 Java字符串
    【JAVA零基础入门系列】Day5 Java中的运算符
    【JAVA零基础入门系列】Day4 变量与常量
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1711060.html
Copyright © 2020-2023  润新知