上一篇文章,只是簡單的求出了拋物線的座標,而且也不夠靈活。如果只是單純的畫線,使用as3自帶的curveTo(二次貝塞爾曲線)就已經足夠了。
二次貝塞爾曲線演示動畫 t in [0, 1] (圖片來源於wiki貝塞爾曲線>>)
下面的例子,根據鼠標的位置,繪製經過指定起始點、結束點和鼠標位置的曲線。
Code:
1: package 2: { 3: import flash.display.Sprite; 4: import flash.events.Event; 5: 6: /** 7: * ... 8: * @author Meteoric 9: */ 10: public class DrawCurveDemo extends Sprite 11: { 12: private var x0:Number = 100; 13: private var y0:Number = 400; 14: private var x1:Number; 15: private var y1:Number; 16: private var x2:Number = 500; 17: private var y2:Number = 400; 18: 19: public function DrawCurveDemo() 20: { 21: initView(); 22: } 23: 24: private function initView():void 25: { 26: addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); 27: 28: onEnterFrameHandler(); 29: } 30: 31: private function onEnterFrameHandler(e:Event=null):void 32: { 33: x1 = mouseX; 34: y1 = mouseY; 35: 36: graphics.clear(); 37: graphics.lineStyle(2, 0x3399cc); 38: graphics.moveTo(x0, y0); 39: graphics.curveTo(x1, y1, x2, y2); 40: } 41: 42: } 43: 44: }
上面僅僅支持線條的繪製,如果是一個影片剪輯想要移動,則會比較麻煩。好在AS3的類庫TweenMax已經完全支持了。
參考文檔說明,實現如下的示例效果:
先定義一個名爲Arrow.as,它用於在舞臺上畫一個紅色的“箭頭”
1: package 2: { 3: import flash.display.Sprite; 4: 5: /** 6: * ... 7: * @author Meteoric 8: */ 9: public class Arrow extends Sprite 10: { 11: 12: public function Arrow() 13: { 14: initView(); 15: } 16: 17: private function initView():void 18: { 19: graphics.clear(); 20: graphics.lineStyle(1, 0xff0000); 21: graphics.moveTo(-100, -5); 22: graphics.lineTo(-20, -5); 23: graphics.lineTo(-20, -20); 24: graphics.lineTo(0, 0); 25: graphics.lineTo(-20, 20); 26: graphics.lineTo(-20, 5); 27: graphics.lineTo(-100, 5); 28: graphics.lineTo(-100, -5); 29: } 30: 31: } 32: 33: }
然後定義一個ArrowTest.as用於測試效果:
1: package 2: { 3: import flash.display.Sprite; 4: import flash.utils.setTimeout; 5: import gs.TweenMax; 6: /** 7: * ... 8: * @author Meteoric 9: */ 10: public class ArrowTest extends Sprite 11: { 12: 13: public function ArrowTest() 14: { 15: initView(); 16: } 17: 18: private var arrow:Arrow; 19: 20: private function initView():void 21: { 22: if (arrow == null) 23: { 24: arrow = new Arrow(); 25: addChild(arrow); 26: } 27: arrow.x = 100; 28: arrow.y = 300; 29: 30: graphics.clear(); 31: graphics.lineStyle(1, 0x000000); 32: graphics.moveTo(arrow.x, arrow.y); 33: 34: TweenMax.to(arrow, 3, {x:600, y:400, bezierThrough:[{x:300, y:100}], orientToBezier:true, onUpdate:onUpdateHandler, onComplete:onCompleteHandler}); 35: } 36: 37: private function onUpdateHandler():void 38: { 39: graphics.lineTo(arrow.x, arrow.y); 40: } 41: 42: private function onCompleteHandler():void 43: { 44: setTimeout(initView, 2 * 1000); 45: } 46: 47: } 48: 49: }