as3 模拟“抛”的动作

简介: 以一个小球为示例,在鼠标点击的时修改它的加速度值(在短时间内移动的距离),加速度以一个值加速,在遇到边界时进行反向。 代码参考自:《ActionScript 3.0 动画教程》,添加了拖动时的范围限定。

以一个小球为示例,在鼠标点击的时修改它的加速度值(在短时间内移动的距离),加速度以一个值加速,在遇到边界时进行反向。

代码参考自:《ActionScript 3.0 动画教程》,添加了拖动时的范围限定<在整个文档内进行拖动>。

Ball.as

   1: package  
   2: {
   3:     import flash.display.Sprite;
   4:     
   5:     /**
   6:      * ...
   7:      * @author ...
   8:      */
   9:     public class Ball extends Sprite
  10:     {
  11:         public var radius:Number;
  12:         private var color:uint;
  13:         public var vx:Number;
  14:         public var vy:Number;
  15:         
  16:         public function Ball(radius:Number=40, color:uint=0xff0000) 
  17:         {
  18:             this.radius = radius;
  19:             this.color = color;
  20:             
  21:             init();
  22:         }
  23:         
  24:         private function init():void {
  25:             graphics.clear();
  26:             graphics.beginFill(color);
  27:             graphics.drawCircle(0, 0, radius);
  28:             graphics.endFill();
  29:         }
  30:         
  31:     }
  32:     
  33: }

 

Throwing.as

   1: package  
   2: {
   3:     import flash.accessibility.Accessibility;
   4:     import flash.display.Sprite;
   5:     import flash.display.Stage;
   6:     import flash.display.StageAlign;
   7:     import flash.display.StageScaleMode;
   8:     import flash.events.Event;
   9:     import flash.events.MouseEvent;
  10:     import flash.geom.Rectangle;
  11:     
  12:     /**
  13:      * ...
  14:      * @author ...
  15:      */
  16:     public class Throwing extends Sprite
  17:     {
  18:         
  19:         private var ball:Ball;
  20:         private var vx:Number;
  21:         private var vy:Number;
  22:         private var bounce:Number = -0.7;
  23:         private var gravity:Number = .5;
  24:         private var oldX:Number;
  25:         private var oldY:Number;
  26:         
  27:         public function Throwing() 
  28:         {
  29:             init();
  30:         }
  31:         
  32:         private function init():void {
  33:             stage.scaleMode = StageScaleMode.NO_SCALE;
  34:             stage.align = StageAlign.TOP_LEFT;
  35:             
  36:             ball = new Ball();
  37:             ball.x = stage.stageWidth / 2;
  38:             ball.y = stage.stageHeight / 2;
  39:             vx = Math.random() * 10 - 5;
  40:             vy = -10;
  41:             
  42:             addChild(ball);
  43:             ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  44:             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  45:         }
  46:         
  47:         private function onMouseDown(evt:MouseEvent):void {
  48:             oldX = ball.x;
  49:             oldY = ball.y;
  50:             
  51:             stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  52:             
  53:             ball.startDrag(false, new Rectangle(ball.radius, ball.radius,stage.stageWidth - ball.radius*2, stage.stageHeight - ball.radius*2));
  54:             
  55:             removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  56:             addEventListener(Event.ENTER_FRAME, trackVelocity);
  57:         }
  58:         
  59:         private function onMouseUp(evt:MouseEvent):void {
  60:             stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  61:             ball.stopDrag();
  62:             removeEventListener(Event.ENTER_FRAME, trackVelocity);
  63:             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  64:         }
  65:         
  66:         private function trackVelocity(evt:Event):void {
  67:             vx = ball.x - oldX;
  68:             vy = ball.y - oldY;
  69:             
  70:             oldX = ball.x;
  71:             oldY = ball.y;
  72:         }
  73:         
  74:         private function onEnterFrame(evt:Event):void {
  75:             vx += gravity;
  76:             ball.x += vx;
  77:             ball.y += vy;
  78:             var left:Number = 0;
  79:             var right:Number = stage.stageWidth;
  80:             var top:Number = 0;
  81:             var bottom:Number = stage.stageHeight;
  82:             
  83:             if (ball.x + ball.radius > right) {
  84:                 ball.x = right - ball.radius;
  85:                 vx *= bounce;
  86:             } else if (ball.x - ball.radius < left) {
  87:                 ball.x = left + ball.radius;
  88:                 vx *= bounce;
  89:             }
  90:             
  91:             if (ball.y + ball.radius > bottom) {
  92:                 ball.y = bottom - ball.radius;
  93:                 vy *= bounce;
  94:             } else if (ball.y - ball.radius < top) {
  95:                 ball.y = top + ball.radius;
  96:                 vy *= bounce;
  97:             }
  98:             
  99:         }
 100:         
 101:     }
 102:     
 103: }
目录
相关文章
|
10月前
|
NoSQL Redis Windows
Windows服务简单一例,捕获关机信号做些处理
Windows服务简单一例,捕获关机信号做些处理
按键精灵设计的简单的重复输入动作
按键精灵设计的简单的重复输入动作
90 0
|
Linux
LINUX脚本中如何判断相等
LINUX脚本中如何判断相等
102 0
|
XML 数据格式
模拟外线O口呼入时,看不到来电显示号码怎么处理?
模拟外线呼入时,看不到来电号码 1)将话机直接连接电话线,检查线路是否开通来电显示功能。若话机没有显示正确的号码,请与运营商联系。若号码正确,注意观察号码显示是在第一声振铃前还是在振铃一两声后。 2)进入“外线设置 > 模拟外线 > 高级”页面,查看来电检测是否开启(默认开启); 3)若开启,修改“系统配置 > 模拟外线 > 来电检测模式”,分别用振铃后、振铃前测试,直到与线路匹配。
关于 SVN状态图标不显示的问题(只显示绿色钩匹配) 的解决方法
关于 SVN状态图标不显示的问题(只显示绿色钩匹配) 的解决方法
关于 SVN状态图标不显示的问题(只显示绿色钩匹配) 的解决方法
|
BI 数据格式 XML
解决水晶报表提示&ldquo;未知的查询引擎错误&rdquo; FOR VS2010
原文:解决水晶报表提示“未知的查询引擎错误” FOR VS2010 在VS2010环境下运行水晶报表(当然要先装上Crystal Report For VS2010), 在SetDataSource方法附近提示“未知的查询引擎错误”,可按如下办法解决:打开app.
1113 0
斑马标签打印机蛋疼的打印错误处理方法
斑马标签打印机蛋疼的打印错误处理方法 默认自动检测的纸张,打印预览的时候没有问题,但是打印出来的效果,就一小块,打印不全。这个蛋疼的问题,可能和操作系统有关系,win10打印的时候没有问题,win7就不行。
1330 0
|
C#
【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题
原文:【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题 最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHookEx一直返回0,导致Hook设置失败,有时候调成Release模式又是正常的。
1249 0