as3 模拟“抛”的动作
以一个小球为示例,在鼠标点击的时修改它的加速度值(在短时间内移动的距离),加速度以一个值加速,在遇到边界时进行反向。
代码参考自:《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: }
浙公网安备 33010602011771号