zoukankan      html  css  js  c++  java
  • 物体的运动(四)

    这是一个物体被抛动的例子,原例子来自于《Flash ActionScrpt3 动画教程》一书,我在此做了小小修改,加入了球体自身的转动效果。

    先用FlashDevelop建立一个FlashIDE工程,建立一个主Fla文件Main.fla,在Main.fla中创建一个继承自Sprite类型的圆形,链接类名为Ball,记下球体的半径,此例中我画的球半径为25。新建一个Ball类,设置其vx,vy属性用来保存球的速度,具体代码:

    Ball.as

    package  
    {
    	import flash.display.Sprite;
    	
    	/**
    	 * ...
    	 * @author ywxgod--http://www.cnblogs.com/ywxgod/
    	 */
    	public class Ball extends Sprite
    	{
    		public var vx:Number = 0;
    		public var vy:Number = 0;
    		
    		public function Ball() 
    		{
    			
    		}
    		
    	}
    
    }

    Main.as

    package  
    {
    	import flash.display.Sprite;
    	import flash.events.Event;
    	import flash.events.MouseEvent;
    	
    	/**
    	 * ...
    	 * @author ywxgod--http://www.cnblogs.com/ywxgod/
    	 */
    	public class Main extends Sprite
    	{
    		private var _ball:Ball;
    		private var _bounce:Number = -0.8;
    		private var _gravity:Number = 0.5;
    		private var _oldx:Number;
    		private var _oldy:Number;
    		
    		public function Main() 
    		{
    			if (stage) init();
    			else addEventListener(Event.ADDED_TO_STAGE, init);
    		}
    		
    		private function init(e:Event = null):void 
    		{
    			_ball = new Ball();
    			addChild(_ball);
    			_ball.vx = Math.random() * 10 - 5;
    			_ball.vy = -10;
    			_ball.x = stage.stageWidth / 2;
    			_ball.y = stage.stageHeight / 2;
    			
    			_ball.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
    			addEventListener(Event.ENTER_FRAME, onFrame);
    		}
    		
    		private function onDown(e:MouseEvent):void 
    		{
    			_oldx = _ball.x;
    			_oldy = _ball.y;
    			stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
    			_ball.startDrag();
    			addEventListener(Event.ENTER_FRAME, trackVelocity);
    			removeEventListener(Event.ENTER_FRAME, onFrame);
    		}
    		
    		private function trackVelocity(e:Event):void 
    		{
    			_ball.vx = _ball.x - _oldx;
    			_ball.vy = _ball.y - _oldy;
    			_oldx = _ball.x;
    			_oldy = _ball.y;
    		}
    		
    		private function onUp(e:MouseEvent):void
    		{
    			stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
    			removeEventListener(Event.ENTER_FRAME, trackVelocity);
    			addEventListener(Event.ENTER_FRAME, onFrame);
    			stopDrag();
    		}
    		
    		private function onFrame(e:Event):void 
    		{
    			_ball.rotation += _ball.vx;
    			_ball.vy += _gravity;
    			_ball.x += _ball.vx;
    			_ball.y += _ball.vy;
    			
    			setBounds();
    		}
    		
    		private function setBounds():void 
    		{
    			var left:Number = 0;
    			var right:Number = stage.stageWidth;
    			var top:Number = 0;
    			var bottom:Number = stage.stageHeight;
    			if (_ball.x+25>right)
    			{
    				_ball.x = right - 25;
    				_ball.vx *= _bounce;
    			}
    			else if (_ball.x-25<left)
    			{
    				_ball.x = left + 25;
    				_ball.vx *= _bounce;
    			}
    			if (_ball.y+25>bottom)
    			{
    				_ball.y = bottom - 25;
    				_ball.vy *= _bounce;
    			}
    			else if (_ball.y-25<top)
    			{
    				_ball.y = top + 25;
    				_ball.vy *= _bounce;
    			}
    		}
    		
    	}
    
    }

    在鼠标点击球体时,记下球当前的位置,在函数trackVelocity执行中(此时正拖动着球体,鼠标未释放):

    每帧将球当前的位置,减去前一位置的x,y方向的距离赋予球的x,y方向的速度。

    释放鼠标时,球的x,y方向的速度即为:释放鼠标前最后一帧中球前后连个位置的差值,也就是看在最后一帧中移动球的距离多少,距离越大,释放鼠标时球的速度越大。

    在setBounds()中,直接用的是球的半径25,没有用_ball.width/2或者_ball.height/2。这样做的作用在前一篇已经说明。

  • 相关阅读:
    "Principles of Reactive Programming" 之<Actors are Distributed> (3)
    Clojure语法学习-循环
    建立Clojure开发环境-使用IDEA和Leiningen
    速查笔记(Linux Shell编程<上>)
    Exception thrown in catch and finally clause
    linux fork的缺点
    redhat6.4 install 163 source
    linux /etc/hosts 配置问题
    linux sed
    STL 源码分析 (SGI版本, 侯捷著)
  • 原文地址:https://www.cnblogs.com/ywxgod/p/1709206.html
Copyright © 2011-2022 走看看