Latest Blog

Multimedia Interaktif Tata Surya
Membuat Multimedia Pembelajaran Interaktif tentang tata surya
ALL BLOG
;
Memahami konstrain
Pendahuluan
Konstrain (constraints) adalah kondisi dimana jarak antara ke 2 titik selalu sama. Sebagai contoh ketika membuat gerakan piston, struktur tulang (bone), lengan robot dan sebagainya. Untuk lebih jelasnya perhatikan demo berikut : ( drag ujung spine biru, untuk menggerakkan! )
Untuk membuatnya perhatikan langkah berikut :
-
Buatlah sebuah project baru AS3.
-
Siapkan 3 buah gambar bertipe PNG sebagai lengan dan sensor (titik)
-
Pada file main.as, ketikkan kode berikut :
-
Jalankan aplikasi dengan menekan tombol Ctrl+Enter
package { import flash.display.Bitmap; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; /** * ... * @author Wandah */ public class Main extends Sprite { [Embed(source = "bulat.png")] private var bmp:Class; [Embed(source = "spine.png")] private var bmp1:Class; [Embed(source = "spine2.png")] private var bmp2:Class; private var spine_bmp:Bitmap; private var spine_bmp2:Bitmap; private var spine:MovieClip; private var spine2:MovieClip; private var drag:Boolean = false; private var titik_1:MovieClip; private var titik_2:MovieClip; private var titik_3:MovieClip; public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // atur masing2 elemen jarum1/spine 1 dan jarum2 / spine2 //spine 2 spine_bmp2 = new bmp2; spine_bmp2.x = -17; spine_bmp2.y = -120; spine2 = new MovieClip; spine2.addChild(spine_bmp2); addChild(spine2); //letakkan spine di tengah spine2.x = 400; spine2.y = 200; //spine 1 spine_bmp = new bmp1; spine = new MovieClip; spine_bmp.x = -17; spine_bmp.y = -110; spine.addChild(spine_bmp); addChild(spine); //letakkan spine di tengah spine.x = 400; spine.y = 300; //titik 1 var bulat:Bitmap = new bmp; bulat.x = -20; bulat.y = -20; titik_1 = new MovieClip(); titik_1.addChild(bulat); titik_1.x = 400; titik_1.y = 300; titik_1.alpha = 0; addChild(titik_1); //titik 2 bulat = new bmp; bulat.x = -20; bulat.y = -20; titik_2 = new MovieClip(); titik_2.addChild(bulat); titik_2.x = 400; titik_2.y = 200; titik_2.alpha = 0; addChild(titik_2); //titik 3 bulat = new bmp; bulat.x = -20; bulat.y = -20; titik_3 = new MovieClip(); titik_3.addChild(bulat); titik_3.x = 400; titik_3.y = 100; titik_3.alpha = 0; addChild(titik_3); //listener untuk titik 3 titik_3.addEventListener(Event.ENTER_FRAME, gerak); //listener untuk mouse stage.addEventListener(MouseEvent.MOUSE_DOWN, drag_mouse); stage.addEventListener(MouseEvent.MOUSE_UP, stop_drag); } private function stop_drag(e:MouseEvent):void{ drag = false; titik_3.alpha = 0; titik_3.x = titik_2.x + 100 * Math.cos((spine2.rotation-90) * Math.PI / 180); titik_3.y = titik_2.y + 100 * Math.sin((spine2.rotation-90) * Math.PI / 180); } private function drag_mouse(e:MouseEvent):void{ //deteksi apakah drag mouse mengenai if (titik_3.hitTestPoint(mouseX, mouseY)){ drag = true; titik_3.alpha = 0.3; } } private function constraint(ob1:Object, ob2:Object, jarak:Number, adj:Number):void { var adj2:Number = 1-adj; var dist_x:Number = ob1.x-ob2.x; var dist_y:Number = ob1.y-ob2.y; var jarak_titik:Number = Math.sqrt(dist_x*dist_x+dist_y*dist_y); var sudut_titik:Number = -Math.atan2(dist_x, dist_y); var error:Number = jarak_titik-jarak; ob1.x += (error*adj)*Math.sin(sudut_titik); ob1.y -= (error*adj)*Math.cos(sudut_titik); ob2.x -= (error*adj2)*Math.sin(sudut_titik); ob2.y += (error*adj2)*Math.cos(sudut_titik); } private function gerak(e:Event):void{ if (drag){ titik_3.x = mouseX; titik_3.y = mouseY; constraint(titik_3, titik_2, 100, 0); constraint(titik_2, titik_1, 100, 1); //posisi spine spine.rotation = rotasi(titik_1, titik_2); spine2.x = titik_2.x; spine2.y = titik_2.y; spine2.rotation = rotasi(titik_2, titik_3); } } private function rotasi(ob1:Object, ob2:Object):Number{ var rad:Number = -Math.atan2((ob1.x - ob2.x), (ob1.y - ob2.y)); return rad * 180 / Math.PI; } } }
Penjelasan Kode
private function constraint(ob1:Object, ob2:Object, jarak:Number, adj:Number):void { var adj2:Number = 1-adj; var dist_x:Number = ob1.x-ob2.x; var dist_y:Number = ob1.y-ob2.y; var jarak_titik:Number = Math.sqrt(dist_x*dist_x+dist_y*dist_y); var sudut_titik:Number = -Math.atan2(dist_x, dist_y); var error:Number = jarak_titik-jarak; ob1.x += (error*adj)*Math.sin(sudut_titik); ob1.y -= (error*adj)*Math.cos(sudut_titik); ob2.x -= (error*adj2)*Math.sin(sudut_titik); ob2.y += (error*adj2)*Math.cos(sudut_titik); }
Fungsi tersebut digunakan untuk mengukur posisi antara 2 objek dan meletakkannya pada posisi dengan jarak yang selalu sama.Berikut penjelasan masing-masing vartiabel :
- Variabel ob1 digunakan untuk mendefinisikan objek pertama
- Variabel ob2 digunakan untuk mendefinisikan objek kedua
- Variabel jarak untuk mengatur panjang lengan / jarak statis antara ke dua titik
- Variabel adj digunakan untuk mengkondisikan titik pertama, apakah mengalami perubahan posisi atau tidak
constraint(titik_3, titik_2, 100, 0); constraint(titik_2, titik_1, 100, 1);
Baris pertama digunakan agar titik_3 memiliki posisi yang relatif terhadap titik_2 sedangkan baris ke 2 nilai adj di set menjadi 1 sehingga posisi titik_1 tidak akan berpindah tempat.
function rotasi(ob1:Object, ob2:Object):Number{ .... }
digunakan untuk mengeset rotasi lengan (spine) agar sesuai dengan posisi titik-titik.
Share ( Ayo Berbagi )
Leave me a comment
untuk pertanyaan lebih baik di email langsung ke wandah [at] wandah [dot] com agar cepat direspon