詳解Flash AS代碼實現彈弓弓弦彈性形變
然後在主場景中直接輸入如下代碼:attachMovie("sling", "sling_1", _root.getNextHighestDepth(), {_x:20, _y:200});attachMovie("sling", "sling_2", _root.getNextHighestDepth(), {_x:480, _y:200});attachMovie("ball", "ball", _root.getNextHighestDepth(), {_x:250, _y:100});_root.createEmptyMovieClip("elastic", _root.getNextHighestDepth());ball.onPress = function() {startDrag(this);};ball.onRelease = function() {stopDrag();};二、Flash製作隨小球移動的弦然後我們通過修改上面的代碼,在兩個小球之間繪製一條線,可以隨中間小球任意移動。attachMovie("sling", "sling_1", _root.getNextHighestDepth(), {_x:20, _y:200});attachMovie("sling", "sling_2", _root.getNextHighestDepth(), {_x:480, _y:200});attachMovie("ball", "ball", _root.getNextHighestDepth(), {_x:250, _y:100});_root.createEmptyMovieClip("elastic", _root.getNextHighestDepth());ball.onPress = function() {startDrag(this);};ball.onRelease = function() {stopDrag();};elastic.onEnterFrame = function() {this.clear();this.lineStyle(2, 0x009900);this.moveTo(sling_1._x, sling_1._y);if (ball._y>182) {dist_x = ball._x-sling_1._x;dist_y = ball._y-sling_1._y;distance_from_sling = Math.sqrt(dist_x*dist_x+dist_y*dist_y);elastic_length = Math.sqrt(distance_from_sling*distance_from_sling-18*18);angle = Math.atan2(dist_y, dist_x)+Math.asin(18/distance_from_sling);this.lineTo(sling_1._x+elastic_length*Math.cos(angle), sling_1._y+elastic_length*Math.sin(angle));} else {this.lineTo(sling_2._x, sling_2._y);}this.moveTo(sling_2._x, sling_2._y);if (ball._y>182) {dist_x = ball._x-sling_2._x;dist_y = ball._y-sling_2._y;distance_from_sling = Math.sqrt(dist_x*dist_x+dist_y*dist_y);elastic_length = Math.sqrt(distance_from_sling*distance_from_sling-18*18);angle = Math.atan2(dist_y, dist_x)+Math.asin(18/distance_from_sling)*-1;this.lineTo(sling_2._x+elastic_length*Math.cos(angle), sling_2._y+elastic_length*Math.sin(angle));} else {this.lineTo(sling_2._x, sling_2._y);}};三、Flash計算弦的形變角度在這裡我們可以很輕鬆的計算出小球在線上的角度來。
稍微做一下改動。attachMovie("sling", "sling_1", _root.getNextHighestDepth(), {_x:20, _y:200});attachMovie("sling", "sling_2", _root.getNextHighestDepth(), {_x:480, _y:200});attachMovie("ball", "ball", _root.getNextHighestDepth(), {_x:250, _y:100});_root.createEmptyMovieClip("elastic", _root.getNextHighestDepth());xspeed = 0;yspeed = 0;fire = false;ball.onPress = function() {fire = false;startDrag(this);};ball.onRelease = function() {stopDrag();fire = true;};ball.onEnterFrame = function() {if (fire) {this._x += (xspeed*0.001);this._y += (yspeed*0.001);}};elastic.onEnterFrame = function() {this.clear();this.lineStyle(2, 0x009900);this.moveTo(sling_1._x, sling_1._y);if (ball._y>182) {dist_x = ball._x-sling_1._x;dist_y = ball._y-sling_1._y;distance_from_sling = Math.sqrt(dist_x*dist_x+dist_y*dist_y);elastic_length = Math.sqrt(distance_from_sling*distance_from_sling-18*18);angle = Math.atan2(dist_y, dist_x)+Math.asin(18/distance_from_sling);saved_angle = angle;this.lineTo(sling_1._x+elastic_length*Math.cos(angle), sling_1._y+elastic_length*Math.sin(angle));this.lineTo(ball._x,ball._y);} else {this.lineTo(sling_2._x, sling_2._y);}this.moveTo(sling_2._x, sling_2._y);if (ball._y>182) {dist_x = ball._x-sling_2._x;dist_y = ball._y-sling_2._y;distance_from_sling = Math.sqrt(dist_x*dist_x+dist_y*dist_y);elastic_length = Math.sqrt(distance_from_sling*distance_from_sling-18*18);angle = Math.atan2(dist_y, dist_x)+Math.asin(18/distance_from_sling)*-1;this.lineTo(sling_2._x+elastic_length*Math.cos(angle), sling_2._y+elastic_length*Math.sin(angle));this.lineTo(ball._x,ball._y);} else {this.lineTo(sling_2._x, sling_2._y);}};四、Flash製作小球與弦的互動運動最後我們讓小球自動運動或者你可以用滑鼠拖動小球。 var ball:MovieClip = _root.attachMovie("ball", "ball", 2, {_x:250, _y:100});var elastic:MovieClip = _root.createEmptyMovieClip("elastic", 1);var point1:MovieClip = _root.attachMovie("sling", "point1", 3, {_x:50, _y:200});var point2:MovieClip = _root.attachMovie("sling", "point2", 4, {_x:450, _y:200});var gravity = 0.1;var angle1:Number = 0;var angle2:Number = 0;var radius:Number = 13.0;// Or whatever half the width of your ball is.var elasticCoefficient:Number = 0.001;// This number will affect the stretchiness of the sling. The greater the number// the tighter the elastic will be.var released:Boolean = true;var forced:Boolean = false;var acc:Object = {x:0, y:0};var vel:Object = {x:0, y:0};_root.onMouseDown = function() {ball._x = _root._xmouse;ball._y = _root._ymouse;ball.startDrag();_root.released = false;vel.x = 0;vel.y = 0;};_root.onMouseUp = function() {ball.stopDrag();_root.released = true;};ball.onPress = function() {ball.startDrag();_root.released = false;vel.x = 0;vel.y = 0;};ball.onRelease = function() {ball.stopDrag();_root.released = true;};_root.onEnterFrame = function() {elastic.clear();elastic.lineStyle(3, 0xFF0000);if (released) {ball._x += vel.x;ball._y += vel.y;}if (ball._y>=187) {/* This area differs from the code in the tutorial.The reason for that is I didn"t read the code, I just looked at the examples.I try to gain experience with problem-solving by doing things as close to by myself as possible. */forced = true;var x1:Number = ball._x-point1._x;var y1:Number = ball._y-point1._y;var x2:Number = point2._x-ball._x;var y2:Number = point2._y-ball._y;var distance1:Number = Math.sqrt(x1*x1+y1*y1);var distance2:Number = Math.sqrt(x2*x2+y2*y2);_root.angle1 = Math.atan2(y1, x1);_root.angle2 = Math.atan2(y2, x2);var xOffset:Number = Math.cos(angle1+Math.PI/2)*radius;var yOffset:Number = Math.sin(angle1+Math.PI/2)*radius;var xOffset2:Number = Math.cos(angle2+Math.PI/2)*radius;var yOffset2:Number = Math.sin(angle2+Math.PI/2)*radius;angle1 += Math.sin(radius/distance1);angle2 += Math.sin(radius/distance2)*-1;elastic.moveTo(point1._x, point1._y);elastic.lineTo(ball._x+xOffset, ball._y+yOffset);elastic.moveTo(point2._x, point2._y);elastic.lineTo(ball._x+xOffset2, ball._y+yOffset2);} else {forced = false;elastic.moveTo(point1._x, point1._y);elastic.lineTo(point2._x, point2._y);}acc.x = 0;acc.y = 0;acc.y = gravity;if (released && forced) {/* This section applies the force of the sling to the ball in terms of acceleration based on the stretching ofthe sling, in the direction of the displacement, scaled by a coefficient that also encapsulates the mass ofthe ball. */acc.x += distance1*Math.sin(angle2)*elasticCoefficient;acc.y += -distance1*Math.cos(angle1)*elasticCoefficient;acc.x += distance2*Math.sin(angle1)*elasticCoefficient;acc.y += -distance2*Math.cos(angle2)*elasticCoefficient;}if (released) {vel.x += acc.x;vel.y += acc.y;}};
推薦閱讀:
※交通違法代碼及扣分罰款大全
※我的書櫃(有代碼)
※調整的山東省交通違法行為代碼
※在圖片上直接寫字的代碼編輯技巧【學習交流】
※圖片 文字 移動代碼