Ming Library dengan PHP (Part2)

ditulis oleh mahasiswa saya : Erwin (TI UKDW 03)

Mengisi Obyek Dengan Ming

Ming menyediakan tiga cara untuk melakukan pengisian obyek, yaitu pengisian obyek dengan warna, mengisi obyek dengan gradient, dan mengisi obyek dengan gambar. Kelas SWFShape() menyediakan dua fungsi untuk mengisi obyek yaitu fungsi setLeftFill() dan fungsi setRightFill(). Untuk menggunakan keduanya, perlu menggunakan SWFFill() sebagai argument. SWFFill() dapat dipanggil dengan menggunakan fungsi addFill() yang merupakan bagian dari SWFShape(). Fungsi addFill() ini mempunyai argument warna RGB. Fungsi setRigthFill() digunakan jika ingin mengisi searah dengan jarum jam, sedangkan fungsi setLeftFill() digunakan untuk mengisi berlawanan dengan arah jarum jam.

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Membuat shape baru dan mengisi obyek
   7: $square = new SWFShape();
   8: $square->setLine(5, 0, 0, 0, 255);
   9: $fill = $square->addFill(0, 255, 0);
  10: $square->setRightFill($fill);
  11: // Menggambar kotak
  12: $square->movePenTo(40, 20);
  13: $square->drawLineTo(140, 20);
  14: $square->drawLineTo(140, 120);
  15: $square->drawLineTo(40, 120);
  16: $square->drawLineTo(40, 20);
  17: // Menambahkan shape ke movie
  18: $myMovie->add($square);
  19: // Menampilkan movie
  20: header('Content-type:application/x-shockwave-flash');
  21: $myMovie->output();
  22: ?> 

clip_image002

Cara kedua yang dapat digunakan untuk mengisi obyek adalah dengan menggunakan kelas SWFGradient(). Kelas ini dapat digunakan untuk mengisi obyek dengan efek gradasi dari dua warna atau gradient. Untuk menambah warna yang akan digunakan untuk gradasi dapat dengan menggunakan fungsi addEntry(). Fungsi ini memiliki lima argument, pertama adalah ratio yang berisikan antara 0.0 dan 1.0. Ratio ini digunakan untuk menentukan seberapa banyak warna yang ditampilkan dalam satu sisi. Argument berikutnya adalah warna RGB. Untuk argument kelima bersifat opsional, yaitu chanel alpha dari warna.

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Membuat shape baru and mengatur line style
   7: $square = new SWFShape();
   8: $square->setLine(5, 0, 0, 0, 255);
   9: // Membuat gradient fill
  10: $gradient = new SWFGradient();
  11: $gradient->addEntry(0.0, 255, 0, 0);
  12: $gradient->addEntry(0.5, 255, 255, 255);
  13: // Menambah fill ke shape
  14: $fill=$square->addFill($gradient, SWFFILL_RADIAL_GRADIENT);
  15: $square->setRightFill($fill);
  16: // Menggambar kotak persegi
  17: $square->movePenTo(40, 20);
  18: $square->drawLineTo(340, 20);
  19: $square->drawLineTo(340, 220);
  20: $square->drawLineTo(40, 220);
  21: $square->drawLineTo(40, 20);
  22: // Menambahkan shapes ke movie
  23: $myMovie->add($square);
  24: // Menampilkan movie
  25: header('Content-type:application/x-shockwave-flash');
  26: $myMovie->output();
  27: ?>

clip_image002[4]

Pengisian obyek yang terakhir adalah dengan gambar. Gambar dengan format .jpg dan Define Bit Lossless (*.dbl) yang dapat dibuat dari file gambar dengan format Graphic Interchange Format (*.gif) dan Portable Network Graphic (*.png), dapat digunakan untuk mengisi obyek. Developer Ming menyediakan perangkat lunak png2dbl yang terdapat di alamat http://www.opaque.net/ming/ming-winutils.zip. Perangkat lunak ini dapat mengkonversi *.gif ke format *.dbl. Gambar perlu dipanggil ke buffer menggunakan fungsi yang disediakan PHP. Fungsi tersebut adalah fopen() dan fread(). Berikut ini adalah contoh penggunaanya:

$fp = fopen(“somefile.jpg”, “rb”);

$data = fread($fp, filesize(“somefile.jpg”));

Setelah itu data perlu dipindahkan dari buffer ke kelas SWFBitmap(). Kelas SWFBitmap() adalah kelas untuk mengisi obyek dengan gambar.

$bitmap = SWFBitmap($data);

Kelas SWFBitmap() memiliki fungsi addFill() yang digunakan untuk mengisikan data ke dalam obyek. Dalam penggunaanya memerlukan salah satu dari dua flag dibawah ini:

· SWFFILL_CLIPPED_BITMAP. Flag ini digunakan untuk memasukkan gambar ke obyek sesuai dengan ukuran gambar tersebut.

· SWFFILL_TILED_BITMAP. Flag ini digunakan untuk menyesuaikan gambar sesuai dengan ukuran dari obyek.

Berikut ini adalah contoh script untuk mengisi sebuah obyek dengan gambar yang diambil dari suatu folder dan akan menghasilkan tampilan seperti pada gambar

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Membuat shape baru and mengatur line style
   7: $square = new SWFShape();
   8: $square->setLine(5, 0, 0, 0, 255);
   9: // Membuka gambar and membaca data ke buffer
  10: $fp = fopen("dog.jpg", "rb");
  11: $data = fread($fp, filesize("dog.jpg"));
  12: // Membuat gambar bitmap baru
  13: $bitmap = new SWFBitmap($data);
  14: // mengisikannya ke shape
  15: $fill = $square->addFill($bitmap, SWFFILL_TILED_BITMAP);
  16: $square->setRightFill($fill);
  17: // Menggambar square
  18: $square->movePenTo(40, 20);
  19: $square->drawLineTo(340, 20);
  20: $square->drawLineTo(340, 220);
  21: $square->drawLineTo(40, 220);
  22: $square->drawLineTo(40, 20);
  23: // Menambah shapes ke movie
  24: $myMovie->add($square);
  25: // Menampilkan movie
  26: header('Content-type:application/x-shockwave-flash');
  27: $myMovie->output();
  28: ?>
  29:  

clip_image002[6]

Penggunaan Text Dan Font Dengan Ming

Ming menyediakan kelas SWFFont() yang berguna untuk menambahkan bentuk teks pada file movie Flash yang dibuat.

$font = new SWFFont( '_sans' );

Font yang digunakan dapat berasal dari web browser atau font yang disimpan dalam sebuah folder. Untuk font yang disimpan dalam sebuah folder memerlukan format Font Definition Block (*.fdb). Font ini adalah font yang dapat dibuat dengan mengkonversi font dengan format True Type File (*.ttf). Ming tidak dapat mengkonversikan font tersebut secara langsung secara langsung. Sehingga memerlukan sebuah perangkat lunak tambahan untuk mengkonversinya. Perangkat lunak tersebut adalah ttf2fdb yang salah satunya bisa didapat dari alamat situs http://www.amarasoftware.com/downloaddemo/makefdb.zip. Setelah membuat obyek font baru, diperlukan tempat untuk menampung font tersebut. Sehingga diperlukan kelas SWFText() atau SWFTextField().

$text = new SWFTextField();

Kemudian font dipindahkan ke dalam area teks dengan menggunakan fungsi dari kelas SWFTextField() yaitu setFont().

$text->setFont( $font );

Kelas SWFTextField() atau SWFText() memiliki dua fungsi yang digunakan untuk mengatur teks. Pertama adalah setColor() yang memiliki tiga argument warna RGB, kedua adalah setHeight() untuk mengatur tinggi atau besarnya teks, fungsi ini mempunyai satu argument yaitu tinggi teks dalam pixel. Untuk menambahkan string yang akan dimuat, dapat dengan menggunakan fungsi addString() yang diisi dengan argument string dalam tanda kutip.

   1: <?php
   2: $font = new SWFFont( '_sans' );
   3: $text = new SWFTextField();
   4: //Memuat font ke dalam teks area
   5: $text->setFont( $font );
   6: $text->setColor( 0, 0, 0 );
   7: $text->setHeight( 400 );
   8: //Menambahkan string 'Hello World'
   9: $text->addString( 'Hello World' );
  10: //Membuat movie baru
  11: $myMovie = new SWFMovie();
  12: $myMovie->setDimension( 2500, 800 );
  13: //Menambahkan teks ke dalam movie
  14: $myMovie->add( $text );
  15: //Menampilkan Movie
  16: header( 'Content-type: application/x-shockwave-flash' );
  17: $m->output( );
  18: ?>

clip_image002[8]

Menambahkan Animasi Pada Movie Flash

Pada dasarnya obyek bentuk geometri yang ditambahkan ke movie hanya ditampilkan saja dan tidak dianimasikan.

$movie->add($shape);

Untuk menambahkan animasi pada Flash dengan menggunakan Ming, memerlukan manipulasi dari penambahan obyek dengan fungsi add() yang merupakan fungsi dari kelas SWFMovie().

$shapeHandle = $movie->add($shape);

Manipulasi ini mengakibatkan pengembalian obyek SWFDisplayItem() untuk menganimasikan obyek bentuk geometri ke dalam movie Flash. Hal ini sama artinya dengan mempunyai obyek SWFDisplayItem() baru. Kelas SWFDisplayItem() mempunyai fungsi yang dapat digunakan untuk menggerakan obyek, yang pertama adalah fungsi move() yang memiliki dua argument, yaitu koordinat x dan koordinat y, yang kedua adalah fungsi moveTo() yang memiliki argument sama dengan move(). Selain itu dapat juga membuat obyek berputar dengan menggunakan fungsi rotate() yang hanya memiliki satu argument, yaitu derajat perputaran obyek yang diinginkan.

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Membuat shape baru and mengatur line style
   7: $square = new SWFShape();
   8: $square->setLine(5, 0, 0, 0, 255);
   9: // Menggambar kotak
  10: $square->movePenTo(1, 1);
  11: $square->drawLineTo(61, 1);
  12: $square->drawLineTo(61, 61);
  13: $square->drawLineTo(1, 61);
  14: $square->drawLineTo(1, 1);
  15: // Menambahkan shapes ke dalam movie
  16: $squareHandle = $myMovie->add($square);
  17: // Menggerakan shape
  18: $squareHandle->moveTo(30, 100);
  19: // Memutar shape 45 derajat
  20: $squareHandle->rotate(45);
  21:  
  22: // Tampilan dari movie
  23: header('Content-type:application/x-shockwave-flash');
  24: $myMovie->output();
  25: ?> 

clip_image002[10]

Agar pergerakannya kelihatan, maka perlu untuk melakukan perubahan pada obyek secara bertahap pada tiap frame. Untuk menggeser ke frame berikutnya dapat dengan menggunakan fungsi nextFrame() yang merupakan fungsi dari kelas SWFMovie(). Ming juga dapat melakukan animasi morphing. Animasi ini mengubah bentuk sebuah obyek ke bentuk lain. Kelas yang digunakan adalah SWFMorph() yang memiliki dua fungsi, yaitu getShape1() dan getShape2(). Keduanya tidak memiliki argument.

$morph = new SWFMorph();

$shape1 = $morph->getShape1();

$shape2 = $morph->getShape2();

Contoh penggunaanya adalah sebagai berikut:

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(5);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Membuat obyek morph baru
   7: $morph = new SWFMorph();
   8: // Membuat shape baru and mengatur line style
   9: $square = new SWFShape();
  10: $rectangle = new SWFShape();
  11: $square = $morph->getShape1();
  12: $square->setLine(5, 0, 0, 0, 255);
  13: $rectangle = $morph->getShape2();
  14: $rectangle->setLine(5, 0, 0, 0, 255);
  15: // Menggambar kotak persegi
  16: $square->movePenTo(1, 1);
  17: $square->drawLineTo(61, 1);
  18: $square->drawLineTo(61, 61);
  19: $square->drawLineTo(1, 61);
  20: $square->drawLineTo(1, 1);
  21: // Menggambar persegi panjang
  22: $rectangle->movePenTo(1, 1);
  23: $rectangle->drawLineTo(161, 1);
  24: $rectangle->drawLineTo(161, 61);
  25: $rectangle->drawLineTo(1, 61);
  26: $rectangle->drawLineTo(1, 1);
  27: $morphHandle = $myMovie->add($morph);
  28: $morphHandle->moveTo(100, 100);
  29: //Melakukan animasi secara bertahap
  30: for($i = 0.0; $i < 1.0; $i += 0.1)
  31: {
  32: $morphHandle->setRatio($i);
  33: $myMovie->nextFrame();
  34: }
  35: // Tampilan movie
  36: header('Content-type:application/x-shockwave-flash');
  37: $myMovie->output();
  38: ?>

Masih banyak lagi animasi yang dapat dilakukan oleh Ming Library, seperti skew, scale, dan lain sebagainya. Selain itu Ming Library juga mendukung action script. Untuk lebih jelasnya dapat dilihat pada http://phpbuilder.com/manual/en/book.ming.php

Link Ming Library:

Basic:

· http://jerryscript.hostrocket.com/php/ming/lessons/

Contoh:

· http://www.gazbming.com/

· http://redhot.pepper.jp/ming_php/

Ming untuk desain:

· http://www.thatmingthing.com/

Ming pada bahasa pemrograman lain:

· http://kumamushi.org/~k/ming/examples/examples.html à pada Ruby

· http://todbot.com/ming/ à Perl

Reference:

· Php manual.

· Rutledge, Matt, 2004, “PHP Game Programing” cetakan pertama, Premier.

Ditulis dalam PHP. Tag: , . Leave a Comment »

Ming Library dengan PHP (Part1)

ditulis oleh mahasiswa saya : Erwin (TI UKDW 03)

Dengan Ming Library kita dapat membuat file Flash hanya dengan menggunakan PHP script. Ming Library adalah pustaka karya Dave Hayden yang dapat menambah kemampuan PHP untuk menghasilkan file Flash (*.swf). Ming Library mendukung sebagian besar fitur yang terdapat pada Flash 4. Ming Library juga dapat digunakan pada bahasa pemrograman C++, Ruby, Phyton dan Perl.

Untuk dapat menggunakannya kita terlebih dahulu harus memastikan Ming Library terinstall sebagai ekstensi PHP. Petunjuk menginstall Ming dapat dilihat pada http://www.opaque.net/ming/install.html. Bagi pengguna Windows, agar lebih mudah dalam melakukan instalasi, dapat mendownload XAMPP di http://www.apachefriends.org/download.php?xampp-win32-1.6.6a-installer.exe

 

Membuat Movie Flash

Untuk membuat movie Flash membutuhkan kelas SWFMovie. Script yang digunakan adalah sebagai berikut:

$myMovie->new SWFMovie();

Variabel $myMovie merupakan obyek movie baru dan dapat diberi beberapa fundamental yang ada pada movie, seperti dimensi movie, frame rate, dan warna background. Untuk mengeset dimensi pada movie, menggunakan script berikut

$myMovie->setDimension(x,y);

Dengan demikian, ukuran atau dimensi movie Flash yang dibuat berukuran lebar x pixel dan tinggi x pixel. Mengeset frame rate dapat menggunakan fungsi setRate(), sebagai berikut:

$myMovie->setRate(30);

Angka 30 menunjukan banyaknya frame yang natinya ditampilkan tiap detik. Defaultnya adalah 12. Sedangkan untuk mengatur warna background adalah sebagai berikut:

$myMovie->setBackground(0,0,0);

Dengan demikian, warna background yang dihasilkan adalah putih yang merupakan komposisi dari nilai 0 untuk red, nilai 0 untuk green, dan nilai 0 untuk blue. Untuk menampilkan file Flash secara langsung ke dalam web browser menggunakan script sebagai berikut:

header( 'Content-type: application/x-shockwave-flash' );

$myMovie->output();

Sedangkan untuk menyimpan file Flash yang dihasilkan ke dalam diektori dengan format *.swf, menggunakan script sebagai berikut:

$myMovie->save(“namafile.swf”);

Beberapa script di atas jika digabungkan menjadi satu maka akan menghasilkan script PHP yang dapat menghasilkan movie Flash.

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(0, 0, 0);
   6: // Tampilkan movie ke browser
   7: header(‘Content-type:application/x-shockwave-flash’);
   8: $myMovie->output();
   9: ?>
  10:  

Namun dengan cara ini file Flash tidak dapat ditampilkan secara spesifik sesuai dengan dimensi yang telah ditentukan. Hal ini terjadi karena file Flash berupa grafik vektor dan dapat secara dinamis memperbesar dimensinya sesuai dengan besarnya ukuran window Web browser. Cara untuk menampilkan file Flash ke browser agar sesuai dengan dimensi yang ditentukan adalah dengan cara menyimpan terlebih dahulu file Flash ke direktori dan kemudian di-embed-kan ke dalam tag HTML dengan cara sebagai berikut:

   1: <html> 
   2: <body>
   3: <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" ID=objects WIDTH=460 HEIGHT=80> 
   4: <PARAM NAME=movie VALUE="example01.swf"> 
   5: <EMBED src="example01.swf" WIDTH=400 HEIGHT=300 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
   6: </OBJECT>
   7: </body> 
   8: </html>

Sehingga file Flash yang ditampilkan pada web browser akan tampak seperti pada gambar dibawah ini

clip_image002[4]

Menggambar Bentuk Obyek Dengan Ming

Untuk menggambar bentuk geometri pada Flash membutuhkan kelas SWFShape. Kelas ini dapat digunakan untuk menggambar garis maupun kurva.

$shape = new SWFShape();

Kelas SWFShape() mempunyai dua fungsi yang dapat digunakan untuk menggambar garis dan satu fungsi untuk mendefinisikan style dari garis. Untuk mengeset style dari garis dapat menggunakan fungsi setLine() yang mempunyai lima argument, yaitu pertama adalah lebar garis dalam pixel, tiga berikutnya adalah nilai RGB dan yang terakhir chanel alpha untuk garis. Berikut adalah bentuk penulisanya secara lengkap:

$shape->setLine(5, 255, 255, 0. 255);

Sedangkan dua fungsi untuk menggambar garis adalah drawLine() dan drawLineTo(). Setiap fungsi ini memiliki dua argument yaitu koordinat x dan koordinat y. drawLine() digunakan untuk menggambar garis dari titik koordinat (x,y) pen awal ditambahkan dengan x dan y pada argument sehingga dibentuk koordinat baru (x,y), sedangkan drawLineTo() digunakan untuk menggambar garis dari titik pen awal sampai ke koordinat (x,y) yang telah ditentukan.

Untuk menentukan koordinat posisi pen atau posisi awal pen dapat dengan menggunakan fungsi movePenTo() yang juga memiliki dua argument yaitu koordinat x dan koordinat y. Berikut ini adalah contoh script yang menggunakan kedua fungsi menggambar garis yaitu drawLine() dan drawLineTo():

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Menggambar garis ke kanvas menggunakan drawLine()
   7: $line1 = new SWFShape();
   8: $line1->setLine(5, 0, 0, 0, 255);
   9: $line1->movePenTo(40, 20);
  10: $line1->drawLine(100, 100); 
  11: //sehingga garis digambar menuju koordinat (140,120)
  12: //diperoleh dari (100+40,100+20)
  13: // Menggambar garis ke kanvas menggunakan drawLineTo()
  14: $line2 = new SWFShape();
  15: $line2->setLine(5, 0, 0, 0, 255);
  16: $line2->movePenTo(80, 20);
  17: $line2->drawLineTo(200, 100);
  18: // Menambahkan shapes ke movie
  19: $myMovie->add($line1);
  20: $myMovie->add($line2);
  21: // Tampilan dari movie
  22: header('Content-type:application/x-shockwave-flash');
  23: $myMovie->output();
  24: ?>

Dari script di atas ini menghasilkan file Flash yang tampat pada web browser pada gambar

clip_image002[6]

Selain menggambar garis, Ming Library juga menyediakan dua fungsi untuk menggambar kurva yaitu drawCurve() dan drawCurveTo(). Fungsi drawCurve()digunakan untuk menggambar kurva secara relatif dari posisi awal pen. Fungsi ini memiliki empat argument, yang pertama adalah koordinat x dan y sebagai control point dari kurva, dan yang terakhir adalah koordinat x dan y yang merupakan anchor point. Ketika Ming menggambar kurva, posisi pen awal disebut sebagai source point. Sedangkan fungsi drawCurveTo() digunakan untuk menggambar kurva dimulai dari posisi awal pen dan menggambarnya menuju anchor point, dengan menggunakan control point untuk mendefinisikan bentuk dari kurva. Fungsi ini juga memiliki empat argument sama seperti pada drawCurve().

clip_image002

Berikut ini adalah contoh script penggunaan dari fungsi drawCurveTo() untuk menggambar kurva menggunakan Ming:

   1: <?php
   2: $myMovie = new SWFMovie();
   3: $myMovie->setDimension(400, 300);
   4: $myMovie->setRate(30);
   5: $myMovie->setBackground(200, 200, 200);
   6: // Menggambar kurva
   7: $curve = new SWFShape();
   8: $curve ->setLine(5, 0, 0, 0, 255);
   9: $curve ->movePenTo(40, 20);
  10: $curve ->drawCurveTo(100, 100, 100, 20);
  11: // Menambahkan shape ke movie
  12: $myMovie->add($curve);
  13: // Menampilkan movie
  14: header(‘Content-type:application/x-shockwave-flash’);
  15: $myMovie->output();
  16: ?>

Dari script di atas ini menghasilkan file Flash yang tampat pada web browser pada gambar

clip_image002[8]

Penggabungan beberapa kurva dapat digunakan untuk menggambar sebuah lingkaran. Pembuat Ming yaitu Dave telah membuat sebuah metode perhitungan untuk menggambar lingkaran dengan Ming. Berikut adalah metode yang disediakan oleh Dave untuk menggambar lingkaran dengan Ming:

   1: // draws a circle with radius $r 
   2: // centered at ($x,$y) into shape $s 
   3: $a = $r * 0.414213562; 
   4: // = tan(22.5 deg) 
   5: $b = $r * 0.707106781; 
   6: // = sqrt(2)/2 = sin(45 deg) 
   7: $s->movePenTo($x+$r, $y); 
   8: $s->drawCurveTo($x+$r, $y-$a, $x+$b, $y-$b); 
   9: $s->drawCurveTo($x+$a, $y-$r, $x, $y-$r); 
  10: $s->drawCurveTo($x-$a, $y-$r, $x-$b, $y-$b); 
  11: $s->drawCurveTo($x-$r, $y-$a, $x-$r, $y); 
  12: $s->drawCurveTo($x-$r, $y+$a, $x-$b, $y+$b); 
  13: $s->drawCurveTo($x-$a, $y+$r, $x, $y+$r); 
  14: $s->drawCurveTo($x+$a, $y+$r, $x+$b, $y+$b); 
  15: $s->drawCurveTo($x+$r, $y+$a, $x+$r, $y); 

Dengan menggabungkan metode tersebut pada kelas SWFShape(), maka dapat dibentuk suatu lingkaran yang sempurna. Berikut adalah contoh script yang digunakan untuk menggambar lingkaran dengan Ming:

 

   1: <?php  
   2: hape=new SWFShape();  
   3: hape->setLine(1,0,0,0);  
   4: hape->setRightFill(255,0,255);  
   5: = 100;  
   6:  40;  
   7:  40;  
   8:  $ra * 0.414213562; // = tan(22.5 deg) 
   9:  $ra * 0.707106781; // = sqrt(2)/2 = sin(45 deg) 
  10: hape->movePenTo($x+$ra, $y);  
  11: hape->drawCurveTo($x+$ra, $y-$a, $x+$b, $y-$b);  
  12: hape->drawCurveTo($x+$a, $y-$ra, $x, $y-$ra);  
  13: hape->drawCurveTo($x-$a, $y-$ra, $x-$b, $y-$b);  
  14: hape->drawCurveTo($x-$ra, $y-$a, $x-$ra, $y);  
  15: hape->drawCurveTo($x-$ra, $y+$a, $x-$b, $y+$b);  
  16: hape->drawCurveTo($x-$a, $y+$ra, $x, $y+$ra);  
  17: hape->drawCurveTo($x+$a, $y+$ra, $x+$b, $y+$b);  
  18: hape->drawCurveTo($x+$ra, $y+$a, $x+$ra, $y);  
  19: ovie=new SWFMovie();  
  20: ovie->setDimension(400,300);  
  21: ovie->setBackground(255,0,0);  
  22: //Menambahkan shape ke movie
  23: stCircle=$myMovie->add($myShape);  
  24: stCircle->moveTo(100,100);  
  25: enampilkan movie
  26: er(‘Content-type:application/x-shockwave-flash’);
  27: ovie->output();
  28:  

clip_image002[10]

Ditulis dalam PHP. Tag: , . 3 Komentar »

Object Oriented Programming in C# (Part4)

Pada Turtorial keempat ini akan dibahas beberapa topik yaitu:

  • Abstract Class
  • Sealed Class
  • “Object” akar dari semua class
  • Boxing dan Unboxing Types
  • Interfaces

Abstract Class

Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan harus mempunyai method tertentu maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract.

Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.

Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.

   1: //mendeklarasikan abstract class
   2:     public abstract class Window
   3:     {
   4:         //konstruktor
   5:         public Window(int top, int left)
   6:         {
   7:             this.top = top;
   8:             this.left = left;
   9:         }
  10:
  11:         //method abstract
  12:         public abstract void DrawWindow();
  13:
  14:         protected int top;
  15:         protected int left;
  16:     }     // end class Window
  17:
  18:     // ListBox diturunkan dari Window
  19:     public class ListBox : Window
  20:     {
  21:         // konstruktor
  22:         public ListBox(int top, int left, string contents)
  23:             : base(top, left) // memanggil konstruktor dari base class
  24:         {
  25:             listBoxContents = contents;
  26:         }
  27:
  28:         //implementasi method abstract pada class anak
  29:         public override void DrawWindow()
  30:         {
  31:             Console.WriteLine("Writing string to the listbox: {0}",
  32:             listBoxContents);
  33:         }
  34:         private string listBoxContents; // member variable yang baru
  35:     }     // end class ListBox
  36:
  37:     public class Button : Window
  38:     {
  39:         public Button(
  40:         int top,
  41:         int left)
  42:             : base(top, left) { }
  43:
  44:         // implementasi abstract method
  45:         public override void DrawWindow()
  46:         {
  47:             Console.WriteLine("Drawing a button at {0}, {1}\n",
  48:             top, left);
  49:         }
  50:     }        // end class Button
  51:
  52:     public class Tester
  53:     {
  54:         static void Main()
  55:         {
  56:             Window[] winArray = new Window[3];
  57:             winArray[0] = new ListBox(1, 2, "First List Box");
  58:             winArray[1] = new ListBox(3, 4, "Second List Box");
  59:             winArray[2] = new Button(5, 6);
  60:
  61:             for (int i = 0; i < 3; i++)
  62:             {
  63:                 winArray[i].DrawWindow();
  64:             }     // end for loop
  65:         }        // end main
  66:     }           // end class Tester

Sealed Class

Ini merupakan kebalikan dari abstract class, jika sebuah class dideklarasikan sebagai sebagai sealed class maka class tersebut tidak dapat diturunkan.

Object Root dari semua class

Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.

Beberapa method yang ada pada class object adalah:

image_thumb[8]

Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.

   1: public class Dog
   2:     {
   3:         private int weight;
   4:
   5:         // konstruktor
   6:         public Dog(int weight)
   7:         {
   8:             this.weight = weight;
   9:         }
  10:
  11:         // override dari Object.ToString
  12:         public override string ToString()
  13:         {
  14:             return weight.ToString();
  15:         }
  16:     }
  17:
  18:     public class Tester
  19:     {
  20:         static void Main()
  21:         {
  22:             int i = 5;
  23:             Console.WriteLine("The value of i is: {0}", i.ToString());
  24:
  25:             Dog milo = new Dog(62);
  26:             Console.WriteLine("My dog Milo weighs {0} pounds", milo);
  27:         }
  28:     }

Boxing dan Unboxing Types

Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.

Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.

image_thumb[9]

   1: int myIntegerValue = 5;
   2: object myObject = myIntegerValue; // cast to an object
   3: myObject.ToString();

Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.

image_thumb[10]

   1: int myIntegerVariable = 123;
   2:
   3: //Boxing
   4: object myObjectVariable = myIntegerVariable;
   5: Console.WriteLine( "myObjectVariable: {0}",
   6: myObjectVariable.ToString(  ) );
   7:
   8: // unboxing (harus explicit)
   9: int anotherIntegerVariable = (int)myObjectVariable;
  10: Console.WriteLine( "anotherIntegerVariable: {0}",
  11: anotherIntegerVariable );
  12:
  13: Output:
  14: myObjectVariable: 123
  15: anotherIntegerVariable: 123

Menghindari Boxing dengan Generic

Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.

Interfaces

Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.

Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan fasilitas ini maka anda harus mengimplementasi method, dan property-nya”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.

Perbedaan Interface dan Abstract Class

Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:

  • Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
  • Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
  • Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
  • Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
  • Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
  • Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
  • Access Modifier pada method dan member variable di Interface secara implisit adalah public.
   1: //deklarasi interface
   2:     interface IStorable
   3:     {
   4:         void Read();
   5:         void Write(object obj);
   6:         int Status { get; set; }
   7:
   8:     }
   9:
  10:     public class Document : IStorable
  11:     {
  12:         // implementasi dari member variabel yang dideklarasikan di interface
  13:         private int status = 0;
  14:
  15:         public Document(string s)
  16:         {
  17:             Console.WriteLine("Creating document with: {0}", s);
  18:         }
  19:
  20:
  21:         //implementasi method yang ada pada interface
  22:         public void Read()
  23:         {
  24:             Console.WriteLine(
  25:             "Implementing the Read Method for IStorable");
  26:         }
  27:
  28:         public void Write(object o)
  29:         {
  30:             Console.WriteLine(
  31:             "Implementing the Write Method for IStorable");
  32:         }
  33:
  34:         public int Status
  35:         {
  36:             get { return status; }
  37:             set { status = value; }
  38:         }
  39:
  40:
  41:     }
  42:
  43:     class Tester
  44:     {
  45:         public void Run()
  46:         {
  47:             Document doc = new Document("Test Document");
  48:             doc.Status = -1;
  49:             doc.Read();
  50:             Console.WriteLine("Document Status: {0}", doc.Status);
  51:         }
  52:
  53:         static void Main()
  54:         {
  55:             Tester t = new Tester();
  56:             t.Run();
  57:         }
  58:     }
  59:
  60: Output:
  61: Creating document with: Test Document
  62: Implementing the Read Method for IStorable
  63: Document Status: -1

Mengimplementasikan lebih dari satu Interface

Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat tidak menggunakannya, menggunakan satu interface saja, atau menggunakan lebih dari satu interface.

   1: interface IStorable
   2:     {
   3:         void Read();
   4:         void Write(object obj);
   5:         int Status { get; set; }
   6:
   7:     }
   8:
   9:     // lebih dari satu interface
  10:     interface ICompressible
  11:     {
  12:         void Compress();
  13:         void Decompress();
  14:     }
  15:
  16:
  17:     public class Document : IStorable, ICompressible
  18:     {
  19:         private int status = 0;
  20:
  21:         public Document(string s)
  22:         {
  23:             Console.WriteLine("Creating document with: {0}", s);
  24:         }
  25:
  26:         #region IStorable
  27:
  28:         public void Read()
  29:         {
  30:             Console.WriteLine(
  31:             "Implementing the Read Method for IStorable");
  32:         }
  33:
  34:         public void Write(object o)
  35:         {
  36:             Console.WriteLine(
  37:             "Implementing the Write Method for IStorable");
  38:         }
  39:
  40:         public int Status
  41:         {
  42:             get { return status; }
  43:             set { status = value; }
  44:         }
  45:
  46:         #endregion     // IStorable
  47:
  48:         #region ICompressible
  49:
  50:         public void Compress()
  51:         {
  52:             Console.WriteLine("Implementing Compress");
  53:         }
  54:
  55:         public void Decompress()
  56:         {
  57:             Console.WriteLine("Implementing Decompress");
  58:         }
  59:
  60:         #endregion  // ICompressible
  61:     }
  62:
  63:
  64:     class Tester
  65:     {
  66:         public void Run()
  67:         {
  68:             Document doc = new Document("Test Document");
  69:             doc.Status = -1;
  70:             doc.Read();          // dipanggil dari method IStorable
  71:             doc.Compress();      // dipanggil dari method ICompressible
  72:             Console.WriteLine("Document Status: {0}", doc.Status);
  73:         }
  74:
  75:         static void Main()
  76:         {
  77:             Tester t = new Tester();
  78:             t.Run();
  79:         }
  80:     }
  81:
  82: Output:
  83: Creating document with: Test Document
  84: Implementing the Read Method for IStorable
  85: Implementing Compress
  86: Document Status: -1

pustaka: “Learning C# 2005″, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Ditulis dalam .NET Tech, C#. Tag: , , . Leave a Comment »

Object Oriented Programming in C# (Part3)

Pada Turtorial ketiga ini akan dibahas beberapa topik yaitu:

  • Specialization dan Generalization
  • Inheritance
  • Memanggil Base Class Constructor
  • Polymorphism

Specialization dan Generalization

Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian pula pada OOP.

Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.

Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.

Misal gambar dibawah akan menunjukan hirarki antara class window, button, dan listbox

image

Gambar diatas menunjukan relasi antara window, button, dan listbox. Button dan listbox sama-sama memiliki karakteristik yang dimiliki oleh window, tetapi button dan listbox juga memiliki ciri-ciri spesifik khas mereka sendiri. Contoh lain yang lebih rinci untuk menggambarkan spesialisasi dan generalisasi dapat digambarkan sebagai berikut:

image

Inheritance

Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut

public class ListBox : Window

Kode diatas berarti class ListBox adalah turunan dari class Window

Penggunaan inheritance dapat dilihat pada program dibawah ini

   1: public class Window
   2:     {
   3:         //objek konstruktor
   4:         public Window(int top, int left)
   5:         {
   6:             this.top = top;
   7:             this.left = left;
   8:         }
   9:
  10:         // simulasi menggambar pada windows
  11:         public void DrawWindow()
  12:         {
  13:             Console.WriteLine("Drawing Window at {0}, {1}",
  14:             top, left);
  15:         }
  16:
  17:         //variabel didefinisikan private sehingga 
  18:         //tidak dapat digunakan pada kelas turunannya
  19:         private int top;
  20:         private int left;
  21:     }
  22:
  23:     // ListBox diturunkan dari class Window
  24:     public class ListBox : Window
  25:     {
  26:         // menambahkan parameter pada konstruktor
  27:         public ListBox(int top, int left, string theContents) :
  28:             base(top, left) // call base constructor
  29:         {
  30:             mListBoxContents = theContents;
  31:         }
  32:
  33:         // new version (new keyword) karena
  34:         // pada method di kelas turunan dirubah isinya
  35:         public new void DrawWindow()
  36:         {
  37:             base.DrawWindow(); // memanggil dari base class
  38:             Console.WriteLine("Writing string to the listbox: {0}",
  39:             mListBoxContents);
  40:         }
  41:         private string mListBoxContents; // member variabel baru
  42:     }
  43:
  44:     public class Tester
  45:     {
  46:         public static void Main()
  47:         {
  48:             // membuat instan class baru
  49:             Window w = new Window(5, 10);
  50:             w.DrawWindow();
  51:
  52:             // membuat instan dari class turunan
  53:             ListBox lb = new ListBox(20, 30, "Hello world");
  54:             lb.DrawWindow();
  55:         }
  56:     }

Memanggil Base Class Constructor

Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)

public ListBox(int top, int left, string theContents):base(top, left)

Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.

Polymorphism

Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window

Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.

Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:

  • Membuat virtual method pada base class (class induk)
  • Membuat class turunan yang mempunyai method dengan keyword override yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya.

Penggunaan prinsip polymorphism dapat dilihat pada contoh program dibawah ini

   1: public class Window
   2:     {
   3:         //deklarasi konstruktor dengan dua parameter
   4:         public Window(int top, int left)
   5:         {
   6:             this.top = top;
   7:             this.left = left;
   8:         }
   9:
  10:         //method untuk draw window
  11:         public virtual void DrawWindow()
  12:         {
  13:             Console.WriteLine("Window: drawing Window at {0}, {1}",
  14:             top, left);
  15:         }
  16:
  17:         //member variabel dideklarasikan protected
  18:         //berarti dapat diakses dari class turunannya
  19:         protected int top;
  20:         protected int left;
  21:
  22:     }  // end Window
  23:
  24:     // class ListBox diturunkan dari class Window
  25:     public class ListBox : Window
  26:     {
  27:         //konstruktor yang menmanggil konstruktor dari base class nya
  28:         public ListBox(int top,int left,string contents): base(top, left)
  29:         {
  30:             listBoxContents = contents;
  31:         }
  32:
  33:         //method yang di override dari base class-nya
  34:         //karena mempunyai implementasi yang berbeda
  35:         public override void DrawWindow()
  36:         {
  37:             base.DrawWindow(); // invoke the base method
  38:             Console.WriteLine("Writing string to the listbox: {0}",
  39:             listBoxContents);
  40:         }
  41:
  42:         private string listBoxContents; // member variabel baru
  43:     }  // end ListBox
  44:
  45:     public class Button : Window
  46:     {
  47:         public Button(
  48:         int top,
  49:         int left)
  50:             : base(top, left)
  51:         { }
  52:
  53:         // an overridden version (note keyword) because in the
  54:         // derived method we change the behavior
  55:         public override void DrawWindow()
  56:         {
  57:             Console.WriteLine("Drawing a button at {0}, {1}\n",
  58:             top, left);
  59:         }
  60:     }  // end Button
  61:
  62:     public class Tester
  63:     {
  64:         static void Main()
  65:         {
  66:             Window win = new Window(1, 2);
  67:             ListBox lb = new ListBox(3, 4, "Stand alone list box");
  68:             Button b = new Button(5, 6);
  69:             win.DrawWindow();
  70:             lb.DrawWindow();
  71:             b.DrawWindow();
  72:
  73:             Window[] winArray = new Window[3];
  74:             winArray[0] = new Window(1, 2);
  75:             winArray[1] = new ListBox(3, 4, "List box in array");
  76:             winArray[2] = new Button(5, 6);
  77:
  78:             for (int i = 0; i < 3; i++)
  79:             {
  80:                 winArray[i].DrawWindow();
  81:             }   // end for
  82:         }   // end Main
  83:     }      // end Tester

Jika dijalankan akan diperoleh output sebagai berikut:

   1: Window: drawing Window at 1, 2
   2: Window: drawing Window at 3, 4
   3: Writing string to the listbox: Stand alone list box
   4: Drawing a button at 5, 6
   5:
   6: Window: drawing Window at 1, 2
   7: Window: drawing Window at 3, 4
   8: Writing string to the listbox: List box in array
   9: Drawing a button at 5, 6

Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.

bersambung ke Object Oriented Programming in C# (Part 4)

pustaka: “Learning C# 2005″, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Ditulis dalam .NET Tech, C#. Tag: , , . Leave a Comment »