Bạn có thể chọn theo nhiều kiểu khác nhau sao cho vẫn ñạt hiệu quả như trên, chẳng hạn thay vì chọn khoảng cách từ vị trí ñã ñịnh ñến vị trí của vật bạn chọn một hàm số nào ñó phụ thuộc[r]
(1)DI CHUYỂN ðỐI TƯỢNG
Giả sử có hình graphic sprite ðể làm cho chuyển ñộng ta thường dùng cách sau:
-Tăng tốc cho chuyển qua frame -Tăng tốc cho sau khoảng thời gian
Việc tăng tốc ñược hiểu cho dịch chuyển vị trí theo hướng x hay y hay hai hướng qua frame hay sau khoảng thời gian
Thật hai cách một, thời gian sau qua frame thực chất sau khoảng thời gian Tuy phương diện lập trình AS ta có cách lập trình theo kiểu khác
Với cách ta hay dùng kiện ENTER_FRAME – cịn với cách hai ta dùng TIMER Ví dụ:
import flash.display.Sprite; import flash.events.Event;
var _vx:Number = 5;
var _sprite:Array=new Array(); var _rt:Number=10;
for (var i:int=0;i<50;i++){ _sprite[i]=new Sprite();
_sprite[i].graphics.beginFill(0xff11ff+100000*i, 100); _sprite[i].graphics.drawCircle(0, 0,5);
_sprite[i].graphics.endFill( ); _sprite[i].x = 50+5*i;
_sprite[i].y = 100+100*Math.sin(3.14*i/25); addChild(_sprite[i]);
addEventListener(Event.ENTER_FRAME, onEnterFrame); }
function onEnterFrame(event:Event):void {
for (var j:int=0;j<50;j++){
if(_sprite[j].x<stage.stageWidth){ _sprite[j].x += _vx+0.5*j;;
}
else{_sprite[j].x=50;} }
(2)2 Ví dụ dùng Timer
import flash.display.Sprite; import flash.events.Event;
import flash.events.TimerEvent; import flash.utils.Timer;
var _sprite:Sprite; var _vx:Number = 3; var _vy:Number = 2; var _timer:Timer;
_sprite = new Sprite( );
_sprite.graphics.beginFill(0xff5500, 100); _sprite.graphics.drawCircle(0, 0, 25); _sprite.graphics.endFill( );
_sprite.x = 50; _sprite.y = 100; addChild(_sprite);
_timer = new Timer(30);
_timer.addEventListener("timer", onTimer); _timer.start( );
function onTimer(event:TimerEvent):void { _sprite.x += _vx;
(3)Di chuyển theo hướng xác ñịnh:
Trong AS , thuộc tính rotation dùng đơn vị độ, nhiên phép tốn khác có liên quan đến góc tính đơn vị radian Cơng thức chuyển đổi từ rad sang ñộ ngược lại sau:
radians = degrees * Math.PI / 180; degrees = radians * 180 / Math.PI;
Khi vật di chuyển theo góc anpha tốc độ vật phải có hướng hư hướng chuyển động Vì v tốc ñộ vật tốc ñộ theo hướng x y tương ứng :
Vy= v*Math.sin(anpha) = v*Math.sin(degrees * Math.PI / 180); Vx=v*Math.cos(anpha) = v*Math.cos(degrees * Math.PI / 180);
Ví dụ sau cho vật chuyển động với tốc độ pixel/frame góc chuyển động 135 ñộ package {
import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.Timer;
public class AngularVelocity extends Sprite { private var _sprite:Sprite;
private var _goc:Number = 135; private var _vt:Number = 4; private var _timer:Timer;
public function AngularVelocity ( ) { _sprite = new Sprite( );
_sprite.graphics.beginFill(0x0000ff, 100); _sprite.graphics.drawCircle(200, 100, 25); _sprite.graphics.endFill( );
_sprite.x = 200; _sprite.y = 100; addChild(_sprite); _timer = new Timer(30);
_timer.addEventListener("timer", onTimer); _timer.start( );
}
public function onTimer(event:TimerEvent):void { var goc_rad:Number = _goc* Math.PI / 180; var vx:Number = Math.cos(goc_rad) * _vt; var vy:Number = Math.sin(goc_rad) * _vt; _sprite.x += vx;
_sprite.y += vy; }
} }
(4)4
Nếu muốn vật chuyển động chậm dần đến vị trí dừng vị trí vận tốc vx,vy phải ñược nhân với hệ số bé cho đến vị trí định vx = vy =
Thông thường ta lấy
vx = (khoảng cách từ vị trí định đến vị trí vật theo hướng x) * hệ số vx = (khoảng cách từ vị trí định đến vị trí vật theo hướng y)* hệ số Việc chọn theo mẫu bảo đảm vật đến vị trí định vx = vy =
Nếu chọn theo cách với điểm định xa, tốc ñộ vị trí bắt ñầu vật thường lớn, ñể dễ quan sát ta nên chọn hệ số tương đối bé
Bạn chọn theo nhiều kiểu khác cho ñạt hiệu trên, chẳng hạn thay chọn khoảng cách từ vị trí định đến vị trí vật bạn chọn hàm số phụ thuộc vào vị trí vật cho hàm số triệt tiêu vật tới vị trí định
Ví dụ:
package {
import flash.display.Sprite; import flash.events.Event;
import flash.events.TimerEvent; import flash.utils.Timer;
public class Easing extends Sprite { private var _sprite:Sprite;
(5)private var _timer:Timer;
public function Easing( ) { _sprite = new Sprite( );
_sprite.graphics.beginFill(0x0000ff, 100); _sprite.graphics.drawCircle(0, 0, 25); _sprite.graphics.endFill( );
_sprite.x = 50; _sprite.y = 50; addChild(_sprite); _timer = new Timer(30);
_timer.addEventListener("timer", onTimer); _timer.start( );
}
public function onTimer(event:TimerEvent):void {
var vx:Number = (_targetX - _sprite.x) * _easingSpeed; var vy:Number = (_targetY - _sprite.y) * _easingSpeed; _sprite.x += vx;
_sprite.y += vy; }
} }
Khi đến vị trí định timer cịn hoạt ñộng Trong hám onTimer sau ñây ta cho vật ñến gần ñiểm ñích cho khoảng cách chúng bé cho vật vị trí đích dừng timer
public function onTimer(event:TimerEvent):void { var dx:Number = _targetX - _sprite.x;
var dy:Number = _targetY - _sprite.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy); if(dist < 1)
{
_sprite.x = _targetX; _sprite.y = _targetY; _timer.stop( ); }
else {
var vx:Number = dx * _easingSpeed; var vy:Number = dy * _easingSpeed; _sprite.x += vx;
_sprite.y += vy; }
}
(6)6 Ví dụ sau cho vx,vy tăng lên lượng theo frame: package {
import flash.display.Sprite; import flash.events.Event;
public class Accel extends Sprite { private var _sprite:Sprite; private var _ax:Number = 3; private var _ay:Number = 2; private var _vx:Number = 0; private var _vy:Number = 0;
public function Accel( ) { _sprite = new Sprite( );
_sprite.graphics.beginFill(0x0000ff, 100); _sprite.graphics.drawCircle(0, 0, 25); _sprite.graphics.endFill( );
_sprite.x = 50; _sprite.y = 100; addChild(_sprite);
addEventListener(Event.ENTER_FRAME, onEnterFrame); }
public function onEnterFrame(event:Event):void { _vx += _ax;
_vy += _ay;
_sprite.x += _vx; _sprite.y += _vy; }
} }
Chuyển ñộng dao ñộng quanh vị trí cân : ta dùng định luật Hooke vật lý : F = - kx , x khoảng cách vật so với vị trí cân ( ñộ biến dạng ) , k hệ số ( hệ số ñàn hồi) , dấu trừ ñể lực ngược chiều với ñộ biến dạng
import flash.display.Sprite; import flash.events.Event;
var _sprite:Sprite; var _vx:Number = 20; var _vy:Number = 0; var _k:Number = 1;