Pemrograman Berorientasi Objek Pada
Pemrograman Berorientasi Objek Pada
NET
Hendra, S.T.
Buku ini membahas tentang konsep dasar pemrograman berorientasi objek (OOP) dan bagaimana melakukannya pada VB.NET, serta memberikan contoh-contoh keunggulan OOP dibandingkan dengan pendekatan konvensional. Penguasaan terhadap teknik pengembangan berorientasi objek merupakan suatu nilai tambah bagi programmer dewasa ini, karena trend bahasa pemrograman menuju kearah pendekatan OOP, terutama sejak kemunculan Java yang 100% menerapkan OOP. Penulis yakin bagian ini merupakan hal yang tersulit bagi programmer yang ingin melakukan migrasi dari VB6 ke VB.NET, karena OOP merupakan hal yang benar-benar baru. Untuk mempelajari buku ini anda tidak perlu menginstalasi Visual Studio .NET, tetapi anda cukup menginstalasi .Net Framework yang dapat didownload secara gratis dari website Microsoft. Semua contoh dan latihan dibuku ini dapat dikompilasi langsung dari Dos prompt dengan menggunakan kompiler Visual Basic yang langsung tersedia setelah anda menginstalasi .Net Framework.
INDOPROG
Hendra, S.T.
Dasar OOP
Visual Basic merupakan bahasa yang Object-Based (komponen-komponen program dibuat dalam bentuk objek), sedangkan VB.NET adalah Object Oriented, hal ini berarti bahwa VB.NET merupakan bahasa yang benar-benar berorientasi object dengan mendukung empat pilar utama dari OOP yaitu Polymorphism, Inheritance, Abstraction dan Encapsulation. Kalau anda adalah programmer yang terbiasa dengan pendekatan procedural terstruktur, maka anda akan baru dengan beberapa istilah OOP yang kita sebutkan diatas, dan memang hal tersebut senantiasa menjadi masalah bagi programmer yang berasal dari VB dan ingin beralih ke VB.NET. Lalu timbul pertanyaan, apakah pada kita harus menguasai dan memahami semua istilah diatas baru dapat membuat program aplikasi dengan VB.NET ? Tentu saja jawabannya tidak, tetapi sebagai programmer VB.NET yang baik, maka konsep dari OOP tidak dapat diabaikan.
Menekankan pada data dari pada procedure Program terbagi kedalam objek-objek Data disembunyikan dari akses oleh function-function eksternal Objek dapat berkomunikasi satu dengan yang lain melalui function Data baru dan function dapat dengan mudah ditambahkan pada saat dibutuhkan. Mengikuti pendekatan buttom up.
INDOPROG
Hendra, S.T.
Objek
Objek merupakan dasar dari entitas run-time dalam suatu sistem berorientasi objek. Masalah pada pemrograman adalah menganalisa dalam arti objek dan komunikasi alamiah diantara mereka. Ketika suatu program dijalankan, objek berinteraksi satu dengan yang lain dengan saling mengirim message. Objek-objek yang berbeda berinteraksi satu dengan yang lain tanpa mengetahui detail data dari masing-masing data ataupun koding.
Class
Suatu class adalah suatu koleksi dari objek-objek yang bertipe sama. Setelah suatu class telah didefinisikan, sejumlah dari objek-objek dapat dibuat berdasarkan class tersebut.
Catatan : Istilah Class dan Objek sering dicampuradukan, pada objek merupakan instance dari suatu class pada saat runtime, jadi pada saat design, class merupakan cetak biru bagi objek-objek yang akan dibuat pada saat runtime. Anda dapat mengasosiasikan class dengan gambar denah dari rancangan rumah, dan selanjutnya berdasarkan denah ini akan dibangun rumah-rumah (objek) sebenarnya.
INDOPROG
Hendra, S.T.
Catatan : Sebagaimana contoh sebelumnya bahwa TV merupakan gambaran dari Abstraksi, dimana yang perlu ditonjolkan pada pemakai adalah hal-hal penting bagaimana menghidupkan dan mematikan serta berbagai setting dasar, sedangkan permasalahan teknis yang berada didalam kotak TV seperti rangkaian elektronik disembunyikan dari pemakai. Jadi dalam hal ini TV dianggap suatu black box. Menyimpan data dan fungsi-fungsi ke dalam suatu unit tunggal (class) adalah encapsulation. Data tidak dapat diakses oleh dunia luar dan hanya fungsi-fungsi yang mana berada dalam class tersebut dapat mengaksesnya.
Inheritance
Inheritance adalah proses yang mana objek-objek dapat mengusahakan member dari objek class lain. Pada OOP inheritance menyediakan pemakaian kembali, seperti, menambah kemampuan baru pada class yang telah ada dengan tanpa melakukan modifikasi langsung terhadap class tersebut. Hal ini dilakukan dengan menurunkan suatu class baru dari yang class telah ada. Class baru tersebut memiliki kombinasi dari keduanya. Catatan : Pendekatan inheritance dapat dipahami sebagai pengembangan produk, dimana engineer tidak perlu merancang produk dari awal, tetapi dengan melakukan modifikasi terhadap produk yang telah ada untuk menghasilkan suatu produk baru.
Polymorphism
Polymorphism adalah kemampuan untuk memiliki lebih dari satu bentuk. Suatu operasi dapat menunjukan prilaku yang berbeda pada instance yang berbeda. Prilaku tersebut tergantung kepada tipe data yang digunakan dalam operasi. Polymorphism secara ekstensif digunakan dalam implementasi Inheritance. Dengan polymorphism kita dapat membuat beberapa fungsi dengan nama yang sama tetapi memiliki daftar argument yang berbeda baik dari segi jumlah maupun tipe datanya (Overloading), sehingga dalam implementasinya fungsi akan dioperasikan berdasarkan argumen yang diberikan, sehingga program dapat bereaksi secara tepat sesuai dengan jenis tipe data dan jumlah argument. Kemudian polymorphism juga memiliki fungsi dimana pemanfaatan variable dengan tipe base class untuk menampung instance dari class turunannya dan menjalankan metoda class turunannya.
INDOPROG
Hendra, S.T.
OOP menyediakan struktur modular yang jelas untuk program, yang mana cocok untuk mendefinisikan tipe data abstrak yang merupakan detail dari implementasi disembunyikan serta unit memiliki interface yang telah didefinisikan dengan jelas. OOP memudahkan maintenance dan modifikasi terhadap kode yang telah sebagai objek baru yang dapat dibuat dengan perubahan yang minimal OOP menyediakan suatu kerangka kerja yang baik untuk kode library yang mana menyediakan komponen software yang secara mudah dapat disesuaikan dan dimodifikasi oleh programmer. Hal ini khususnya sangat berguna untuk pengembangan user interface secara grafik.
Catatan : Setelah anda membaca uraian tersebut diatas, awalnya anda akan merasa kesulitan untuk memahami dan menerapkan beberapa konsep-konsep diatas pada program anda, dan hal tersebut adalah wajar. Untuk mentransformasi gaya pemrograman anda dari pendekatan procedural terstruktur menjadi OOP membutuhkan waktu dan usaha. Sebab pada pendekatan procedural terstruktur focus programmer langsung kepada logika dan koding untuk pencapaian hasil, sedangkan pada OOP kita harus melakukan abstraksi terhadap data dan fungsi yang berkaitan menjadi class, dan selanjutnya class-class tersebut berinteraksi dengan message untuk mencapai tujuan akhir. Untuk membantu pengertian dan menunjukan keunggulan konsep OOP, penulis akan memberikan beberapa contoh keunggulan pemanfaatan OOP pada bagian-bagian selanjutnya.
INDOPROG
Hendra, S.T.
Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30)
INDOPROG
Hendra, S.T.
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End Sub End Class
Catatan : Jika anda perhatikan perhatikan rancangan class diatas, maka konsep dari data abstraction akan nampak, dimana sebagai interface keluar hanya terdiri metoda New, Draw, Clear, dan Move, sedangkan pengkodean tersembunyi dari program yang akan memanfaatkan Objek dari Class Pantul Kemudian konsep dari data encapsulation, dimana variable x,y,sx,sy,dx, dan dy disatukan beserta fungsi New, Draw, Clear, dan Move didalam satu Class Pantul.
INDOPROG
Hendra, S.T.
Constructors
Suatu constructor adalah anggota function yang mana memiliki tugas untuk menginisialisasi objek dari classnya. Suatu constructor akan dijalankan ketika objek dari class tersebut diciptakan. Kita dapat mengirim data kepada konstruktor dengan mencantumkannya didalam kurung. Pada Visual Basic suatu konstruktor harus dibuat dengan suatu Sub procedure dengan nama New pada class. Koding berikut mendemonstrasikan pemakaian dari konstruktor di Visual Basic.
Public Sub New(f as form) sx = f.width \ 30 sy = f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx = 1 dy = 1 Draw(f) End Sub 'constructor 'lebar form dibagi 30 'tinggi form dibagi 30 'posisi awal random 'arah diagonal ke bawah
Pada contoh diatas, konstruktor digunakan untuk menginisialisasi nilai awal untuk variable pada Objek seperti sx, sy, x, y, dx, dan dy. Untuk konstruktor diatas, pada saat kita membuat instance dari Class dengan
Dim Bola As Pantul Bola = New Pantul(Me)
Destructors
Destructors akan dijalankan ketika suatu objek dimusnahkan. Didalam suatu destructor kita dapat menempatkan koding untuk membersihkan objek setelah digunakan. Kita menggunakan metode Finalize di Visual Basic untuk membuat destructor yang otomatis akan dijalankan ketika runtime .NET menemukan bahwa objek tidak dibutuhkan lagi. Contoh implementasi pemakaian destructor adalah misalnya pada konstruktor kita membuka data maupun file, sehingga pada saat destructor kita perlu menutup data maupun file yang terbuka. Catatan: Setiap objek didunia nyata memiliki fase awal yaitu kelahiran, dan fase akhir yaitu kematian. Pada saat suatu objek dilahirkan tentu saja telah memiliki nilai property bawaan, seperti seorang bayi yang baru dilahirkan telah memiliki jenis kelamin, berat badan, dan tinggi. Demikian juga objek dalam konsep OOP, yang kadang-kadang membutuhkan pemberian nilai awal kepada beberapa property begitu instance dari class dibuat. Tindakan pemberian nilai awal (inisialisasi) ini dapat dilakukan dengan menggunakan metoda
INDOPROG
Hendra, S.T.
Dari hal ini jelaslah bahwa dengan pendekatan OOP kita tidak melakukan perubahan terhadap rancangan Class Pantul sama sekali, melainkan kita membuat 15 instance dari Class Pantul. Listing lengkap dari program 15 ola pantul dengan pendekatan OOP.
Option Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim Bola(14) As Pantul <Sistem.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub New() 'Constructor
INDOPROG
Hendra, S.T.
'Mengerakan objek dengan event tick pada objek MyTimer Private Sub MyTimer_Tick(sender as object, e as eventargs) _ handles MyTimer.Tick For I As Integer = 0 to 14 Bola(I).Move(Me) Next I End Sub End Class Class Pantul Protected x As Single Protected y As Single Private sx As Single Private sy As Single Private dx As Single Private dy As Single Public Sub New(f as form) sx = f.width \ 30 sy = f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx = 1 dy = 1 Draw(f) End Sub
'posisi x dilayar 'posisi y dilayar 'jumlah kolom x 'jumlah baris y 'arah bola terhadap x 'arah bola terhadap y 'constructor 'lebar form dibagi 30 'tinggi form dibagi 30 'posisi awal random 'arah diagonal ke bawah
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy
INDOPROG
10
Hendra, S.T.
INDOPROG
11
Hendra, S.T.
Inheritance
Pemanfaatan Kembali
Kunci dari kemampuan OOP adalah pemakaian kembali. Yang secara nyata akan menghemat waktu jika kita dapat memanfaatkan kembali pada yang pernah kita buat. Pemakaian kembali akan menurunkan pekerjaan untuk testing dan debugging terhadap bagian yang digunakan kembali, karena telah dilakukan sebelumnya. Proses inheritance dilakukan dengan menurunkan suatu class baru dari class yang telah ada. Class yang lama disebut sebagai base class dan class yang baru disebut derived class. Class turunan akan mewarikan semua atau sebagian dari segala sesuatu yang terdapat pada base class. Pada Visual Basic kita menggunakan keyword Inherits untuk menurunkan suatu class: Misalnya kita telah memiliki Class Pantul
Class Pantul member End Class
Selanjutnya misalnya kita ingin mengembangkan Class baru dengan menurunkannya dari Class Pantu
Class Pantul1 : Inherits Pantul member End Class
Maka Class Pantul1 akan mewarisi semua member Pantul yang dideklarasikan sebagai Protected maupun Public.
Overriding
Pada derived class kadang-kadang kita perlu mendefinisikan ulang fungsi maupun sub yang ada pada base class, dalam hal inilah istilash Overriding muncul, dimana kita dapat mendefinisikan ulang fungsi maupun sub pada derived class. Misalnya pada Class Pantul1 gambar yang ingin kita hasilkan adalah persegi, maka kita perlu melakukan Overiding terhadap Sub Draw dan Clear yang ada pada base class. Catatan : Sub maupun Function pada base class harus dideklarasikan sebagai Overridable baru dapat di Overrides pada derived class. Pada Class pantul kita perlu mencantumkan keyword Overridable
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30)
INDOPROG
12
Hendra, S.T.
Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub
Selanjutnya pada class turunannya kita dapat melakukan Overriding terhadap metoda yang dimaksud :
Class Pantul1 : Inherits Pantul Public Sub New(f as form) MyBase.New(f) End Sub 'constructor
Overrides Public Sub Draw(f as form) 'metoda 'gambar persegi ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides Public Sub Clear(f as form) 'metoda 'gambar persegi ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen, x*30,y*30,30,30) End Sub End Class
Shadowing
Jika pada Overriding kita membutuhkan permisi dari base class untuk melakukan overriding dengan keyword Overridable, selain itu kita juga dapat melakukan Shadowing terhadap metoda pada base class yang tidak memberikan permisi Overridable. Contoh : Pada base class :
Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub
INDOPROG
13
Hendra, S.T.
Public Shadows Sub Draw(f as form) 'metoda 'gambar persegi ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub
Catatan : Pemakaian cara Shadowing menyebabkan konsep polymorphism tidak dapat berfungsi sebagaimana pada cara Overriding.
Selanjutnya kita dapat membuat konstruktor (sub New) untuk menginisialisasi keadaan awal dari form kita (misalnya mengatur warna, ukuran, menambah control timer dll)
Public Sub New() 'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle = FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width Me.Height = Screen.PrimaryScreen.Bounds.Height For I As Integer = 0 to 14 Bola(I) = New Pantul(Me) Next I '150 millidetik MyTimer.Interval = 150 MyTimer.Enabled = True End Sub
Pada class MyForm kita dapat juga melakukan overriding terhadap metoda yang telah terdefinisi pada class Form, misalnya untuk metoda paint.
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyBase.OnPaint(e) e.Graphics.DrawLine(MyPen,10,10,200,100) End Sub
INDOPROG
14
Hendra, S.T.
Pada pendekatan OOP, misalnya kita telah memiliki class Pantul yang menampilkan bentuk lingkaran, selanjutnya adalah membuat class Pantul1 yang akan menampilkan bentuk persegi, tetapi kita tidak perlu merancang class Pantul1 dari awal melainkan cukup menurunkannya dari class Pantul dengan melakukan override terhadap metoda draw dan clear. Jadi dalam hal ini kita tidak perlu merancang class dari awal, tetapi cukup memperbaharui maupun mengembangkan class yang telah ada, sehingga waktu pemrograman dapat dipersingkat dan proses debug dapat dikurangi. Listing program menampilkan bola dan persegi pantul dilayar :
Option Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim Bola As Pantul Dim Persegi As Pantul1 <Sistem.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub
'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle = FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width Me.Height = Screen.PrimaryScreen.Bounds.Height Bola = New Pantul(Me) Persegi = New Pantul1(Me) MyTimer.Interval = 150 MyTimer.Enabled = True End Sub Private Sub MyTimer_Tock(sender as object, e as eventargs) _ handles MyTimer.Tick Bola.Move(Me) Persegi.Move(Me) End Sub End Class
Class Pantul Protected x As Single Protected y As Single Private sx As Single Private sy As Single
INDOPROG
15
Hendra, S.T.
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End Sub End Class Class Pantul1 : Inherits Pantul Public Sub New(f as form) MyBase.New(f) End Sub 'constructor 'menjalankan constructor base class
Overrides Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics
INDOPROG
16
Hendra, S.T.
INDOPROG
17
Hendra, S.T.
Polymorphism
Polymorphism merupakan salah satu fasilitas yang krusial pada OOP, yang memiliki arti "satu nama, banyak bentuk". Hal ini disebut juga sebagai Overloading yang berarti menggunakan hal yang sama untuk tujuan yang berbeda. Dengan menggunakan Polymorphism kita dapat membuat banyak fungsi dengan nama yang sama tetapi memiliki daftar argument yang berbeda. Fungsi tersebut dijalankan berdasarkan daftar argument yang digunakan untuk menjalankan fungsi. Misalnya kita memperbaharui class Pantul dimana pada konstruktor kita dapat menentukan warna dari lingkaran.
Class Pantul Protected x As Single 'posisi x dilayar Protected y As Single 'posisi y dilayar Private sx As Single 'jumlah kolom x Private sy As Single 'jumlah baris y Private dx As Single 'arah bola terhadap x Private dy As Single 'arah bola terhadap y Private clr As Sistem.Drawing.Color Public Sub New(f as form) 'constructor me.New(f,Sistem.Drawing.Color.Red) End Sub Public Sub New(f as form, w as sistem.drawing.color) 'constructor sx = f.width \ 30 'lebar form dibagi 30 sy = f.height \ 30 'tinggi form dibagi 30 x = rnd*(sx-2) + 2 'posisi awal random y = rnd*(sy-2) + 2 dx = 1 'arah diagonal ke bawah dy = 1 clr = w Draw(f) End Sub Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Clr,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah
INDOPROG
18
Hendra, S.T.
Dalam hal ini class pantul memiliki dua konstruktor yang masing-masing memiliki daftar argument yang berbeda yaitu :
Public Sub New(f as form) 'constructor
Dan
Public Sub New(f as form, w as sistem.drawing.color)
Sehingga ketika kita membuat instance dari Class Pantul dapat dilakukan dengan :
Bola = New Pantul(Me)
Ataupun :
Bola = New Pantul(Me, Sistem.Drawing.Color.Blue)
Polymorphism juga dapat berupa pemanfaatan variable yang bertype base class untuk mengimplementasikan metoda pada class-class turunannya. Misalnya kita mendeklarasikan variable array bola yang terdiri dari dua elemen Dim Bola(1) As Pantul Bola(0) = New Pantul(Me) Bola(1) = New Pantul1(Me) Dimana variable Bola(n) sebenarnya merupakan variable type Pantul, tetapi dalam pemakaiannya kita gunakan untuk instance Pantul1, selanjutnya : Bola(0).Move(Me) Bola(1).Move(Me) Akan menjalankan metoda Move dari Class yang bersesuaian dengan instance objek yang dibuat.
19
Hendra, S.T.
Dim JlhBola As Integer = Val(Inputbox("Jumlah Bola")) Dim JlhPersegi As Integer = Val(Inputbox("Jumlah Persegi"))
Selanjutnya kita membuat instance dari masing-masing class sesuai dengan jumlah yang ditentukan :
Dim Bola(14) As Pantul Dim Jlh As Integer Dim I As Integer = 0 Do While I < JlhBola Bola(I) = new Pantul(Me) I+=1 Loop Do While I < JlhBola+JlhPersegi Bola(I) = new Pantul1(Me) I+=1 Loop Jlh = JlhBola+JlhPersegi
Dalam hal ini kita mendeklarasikan variable array Bola yang bertipe Pantul, padahal dalam pemakaiannya kita gunakan juga untuk menampung instance untuk class Pantul1. Kemudian untuk mengerakan objek kita gunakan looping :
For I As Integer = 0 To Jlh-1 Bola(I).Move(Me)
INDOPROG
20
Hendra, S.T.
Selanjutnya metoda move yang dijalankan sangat tergantung pada jenis instance dari variable objek. Dapatkah anda bayangkan bagaimana kalau tanpa menggunakan Polymorphism ? Listing program menampilkan bola dan persegi pantul dilayar sesuai dengan jumlah yang diinginkan pemakai :
Option Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim Bola(14) As Pantul Dim Jlh As Integer <Sistem.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub New() 'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle = FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width Me.Height = Screen.PrimaryScreen.Bounds.Height Dim JlhBola As Integer = Val(Inputbox("Jumlah Bola")) Dim JlhPersegi As Integer = Val(Inputbox("Jumlah Persegi")) Dim I As Integer = 0 Do While I < JlhBola Bola(I) = new Pantul(Me) I+=1 Loop Do While I < JlhBola+JlhPersegi Bola(I) = new Pantul1(Me) I+=1 Loop Jlh = JlhBola+JlhPersegi MyTimer.Interval = 150 MyTimer.Enabled = True End Sub Private Sub MyTimer_Tock(sender as object, e as eventargs) _ handles MyTimer.Tick For I As Integer = 0 To Jlh-1
INDOPROG
21
Hendra, S.T.
Class Pantul Protected x As Single 'posisi x dilayar Protected y As Single 'posisi y dilayar Private sx As Single 'jumlah kolom x Private sy As Single 'jumlah baris y Private dx As Single 'arah bola terhadap x Private dy As Single 'arah bola terhadap y Private clr As Sistem.Drawing.Color Public Sub New(f as form) 'constructor me.New(f,Sistem.Drawing.Color.Red) End Sub Public Sub New(f as form, w as sistem.drawing.color) 'constructor sx = f.width \ 30 'lebar form dibagi 30 sy = f.height \ 30 'tinggi form dibagi 30 x = rnd*(sx-2) + 2 'posisi awal random y = rnd*(sy-2) + 2 dx = 1 'arah diagonal ke bawah dy = 1 clr = w Draw(f) End Sub Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Clr,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f)
INDOPROG
22
Hendra, S.T.
Overrides Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen, x*30,y*30,30,30) End Sub
End Class
INDOPROG
23
Hendra, S.T.
Interfaces
Interfaces memungkinkan kita untuk membuat definisi untuk interaksi komponen. Interface juga menyediakan cara lain untuk mengimplementasikan polymorphism. Melalui interface, kita dapat menentukan metoda yang mana suatu komponen harus miliki tanpa menentukan bagaimana metoda tersebut diimplementasikan (koding detail untuk metoda tersebut). Jadi dalam hal ini interface menyerupai prototype bagi class lain yang akan dikembangkan. Anda bisa membayangkan interface sebagai suatu standard pengembangan berbagai fasilitas dalam objek yang dibakukan, jika class mendukung standard interface tersebut, maka wajib memenuhi tata cara penulisan yang telah didefinisikan dalam interface. Misalnya kita membuka pusat layanan pelanggan dimana semua pelayan diwajibkan melakukan sapaan pembukan kepada para tamu yang dating berkunjung, dan kata pembuka sapaan telah distandarisasi untuk pagi, sore, dan malam.
Public Sub Sub Sub Interface Sapaan Pagi() Sore() Malam()
End Interface
Kita menggunakan keyword Interface untuk membuat suatu interface dan keyword implements untuk mengimplementasikan interface tersebut. Selanjutnya sapaan akan disampaikan dalam dua bahasa sesuai dengan asal pengunjung, sehingga kita dapat memgembangkan class dengan mengimplementasikan interface sapaan yang telah dibuat :
Public Class Indonesia : Implements Sapaan Sub Pagi() Implements Sapaan.Pagi Console.WriteLine("Selamat Pagi") End Sub Sub Sore() Implements Sapaan.Sore Console.WriteLine("Selamat Sore") End Sub Sub Malam() Implements Sapaan.Malam Console.WriteLine("Selamat Malam") End Sub End Class Public Class English : Implements Sapaan Sub Pagi() Implements Sapaan.Pagi Console.WriteLine("Good Morning") End Sub Sub Sore() Implements Sapaan.Sore
INDOPROG
24
Hendra, S.T.
INDOPROG
25
Hendra, S.T.
INDOPROG
26
Hendra, S.T.
Abstract Classes
Suatu class abstrak tidak dapat digunakan untuk membuat objek. Suatu class abstrak dirancang untuk berlaku sebagai suatu base class (untuk diwariskan ke class lain). Suatu abstrak class digunakan sebagai konsep design yang menjadi acuan pengembangan bagi class-class yang akan dikembangkan. Class abstrak menyerupai interface. Setelah suatu class abstrak dideklarasikan, dia tidak dapat di buat objek instancenya, melainkan harus diturunkan.
Kemudian pada contoh diatas pada masing-masing metoda sapaan kita menambahkan keyword MustOverride bahwa metoda Pagi, Sore, dan Malam harus di override pada class turunannya.
Option Explicit On Imports Sistem Public Module MyModule Sub Main() Dim Domestik As New Indonesia Dim Internasional As New English Domestik.Pagi() Internasional.Pagi() End Sub MustInherit Public Class Sapaan MustOverride Sub Pagi() MustOverride Sub Sore() MustOverride Sub Malam() End Class Public Class Indonesia : Inherits Sapaan Overrides Sub Pagi() Console.WriteLine("Selamat Pagi") End Sub Overrides Sub Sore() Console.WriteLine("Selamat Sore") End Sub Overrides Sub Malam()
INDOPROG
27
Hendra, S.T.
INDOPROG
28
Hendra, S.T.
Program Tetris
Oleh : Hendra Soewarno Contoh aplikasi pemrograman GDI+ untuk pembuatan games tetris dengan pendekatan berorientasi objek.
Untuk memahami program ini anda perlu mengerti pemrograman form, event handling, dan array, serta GDI+
INDOPROG
29
Hendra, S.T.
Rancangan program
Program ini menggunakan pendekatan berorientasi objek dengan membuat dua class untuk objek Shape dan objek Grid
Class TShape
Class ini berfungsi menghasilkan bentuk-bentuk dengan sistem koordinat berikut :
{1,0},{1,1},{1,2},{1,3}
{0,1},{1,1},{2,1},{3,1}
Berikut ini adalah rincian array untuk masing-masing Shape dan rotasinya
{1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1} {1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{0,2},{1,2} {0,0},{0,1},{1,0},{2,0} {0,0},{1,0},{1,1},{1,2} {0,1},{1,1},{2,0},{2,1} {0,0},{0,1},{0,2},{1,1} {0,0},{1,0},{1,1},{2,0} {1,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,1} {0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0} {0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0}
INDOPROG
30
Hendra, S.T.
Contoh :
Yang selanjutnya dipetakan menjadi suatu array 4 dimensi yang berisi koordinat dari masingmasing shape :
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}}
INDOPROG
31
Hendra, S.T.
'menyimpan warna current shape 'menyimpan warna next shape 'nomor rotasi shape
Konstruktor TShape Konstuktor TShape merupakan metoda yang otomatis dijalankan begitu instance dari TShape terbentuk. Misalnya :
private gtshape as new tshape 'instance class tshape
berfungsi menghasilkan bentuk Shape berikutnya yang akan dimunculkan setelah bentuk sekarang dengan memanggil metoda generateshape.
'konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end sub
Metoda GenerateNextShape Metoda ini berfungsi memindahkan nextshape menjadi currentshape, serta membuat nextshape yang berikutnya.
'Membuat next shape berikutnya, dan menset current shape public sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0 'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape baru end sub
INDOPROG
32
Hendra, S.T.
Catatan : Parameter pada sub ini dilewatkan secara by refrence, sehingga nilai dapat dikembalikan ke variable shape dan shapecolor. Metoda Rotate Metode ini berfungsi menset nilai currentstate ke nilai rotasi berikutnya (0 ke 1, 1 ke 2, 2 ke 3, 3 ke 0).
'Rotasi ke bentuk berikutnya public sub rotate() currentstate = currentstate + 1 if currentstate = 4 then currentstate = 0 end sub
Metoda DeRotate Metode ini berfungsi menset nilai currentstate ke nilai rotasi sebelumnya (1 ke 0, 2 ke 1, 3 ke 2, 0 ke 3).
'Rotasi ke bentuk sebelumnya public sub derotate() currentstate = currentstate - 1 if currentstate = -1 then currentstate = 3 end sub
'Rotasi sebelumnya
Metoda CurrentShapeSel Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan pada array 4 dimensi sarr.
'Mengembalikan sel i,j dari current shape public function currentshapesel(i as integer, j as integer) return sarr(currentshape,currentstate,i,j) end function
Nilai sel yang dikembalikan sangat tergantung pada nilai variable currentshape (bentuk shape), dan currentstate (nomor rotasi)
INDOPROG
33
Hendra, S.T.
{1,0},{0,1},{1,1},{1,2}
Dan CurrentShapeSel(0,0) akan menghasilkan 1 CurrentShapeSel(0,1) akan menghasilkan 0 Property NextShapeSel Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan pada array 4 dimensi sarr.
'Mengembalikan sel i,j dari next shape public function nextshapesel(i as integer, j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function
Nilai sel yang dikembalikan sangat tergantung pada nilai variable nextshape (bentuk shape), dan currentstate defaultnya 0, karena nextshape belum mengalami rotasi.
Class TGrid
Class ini berfungsi menyediakan mekanisme Grid pada permainan Tetris, dimana pada memori computer diwakili dengan array dua dimensi, dengan gambaran sebagai berikut :
INDOPROG
34
Hendra, S.T.
Merupakan array yang mewakili grid dilayar, jika suatu sel terisi gambar, maka nilai parr(x,y) akan berisi nilai 1, dan carr(x,y) akan berisi nilai warna gambar. Kontruktor TGrid Begitu instance dari TGrid terbuat, maka akan mengisi awal array parr menjadi sebagai berikut, yang akan menjadi bingkai dari grid, sehingga area permainan mulai dari (3,0) s/d (12,22)
INDOPROG
35
Hendra, S.T.
'konstruktur class tgrid public sub new() dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'isi bingkai
'isi arena
Metoda TestShape Metoda ini berfungsi mengisi nilai dari shape ke posisi x,y dalam grid, dengan syarat parr(x,y) masih 0
'Menempatkan shape pada posisi x,y di grid public sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3
INDOPROG
36
Hendra, S.T.
Misalnya putshape yang ke 4, keposisi 6,21 pada grid, yang akan mengisi nilai ke parr
Metoda TestShape Metoda ini berfungsi mencoba apakah shape dapat ditempatkan pada posisi x,y dalam grid, dengan syarat parr(x,y) masih 0
'Mengembalikan nilai yang menunjukan apakah 'shape dapat ditempatkan pada grid diposisi x,y public function testshape(x as integer, y as integer, s as tshape)_ as boolean dim i as integer for i = 0 to 3 'apakah sel pada grid telah terisi ( > 0 ) if parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) > 0 then return false end if
INDOPROG
37
Hendra, S.T.
Metoda CheckGrid Metoda ini berfungsi memeriksa apakah ada baris dalam array parr yang berisi nilai 1 dari kolom 3 s/d 12.
'periksa apakah ada baris yang berhasil diselesaikan pemain public function checkgrid() as integer dim i,j as integer dim b,k as integer dim complete as integer complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) <> 0 and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete = complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1 end if loop return complete end function end class
Misalnya array parr pada baris 22 berisi nilai 1 mulai baris 3 s/d 12, maka setelah metoda ChekGrid dijalankan akan menghapus baris 22 dan mengeser baris diatasnya ke bawah, dan mengembalikan nilai berapa baris yang berhasil diselesaikan.
INDOPROG
38
Hendra, S.T.
Class Tetris
Class ini merupakan class utama permainan Tetris
Konstruktor Tetris
Berfungsi mempersiapkan tampilan form, seperti title form, ukuran form, menempatkan label untuk keterangan score dan gameover, membuat objek Graphics yang akan digunakan untuk menyediakan metoda pengambaran, serta mempersiapkan Shape berikutnya.
public sub new() me.text = "Program Tetris" me.size = new size(450, 600) labelscore.location = new point(61,30) me.controls.add(labelscore) labelgameover.location = new point(200,30) me.controls.add(labelgameover) g = me.creategraphics() score = 0 printscore() nextshape() 'persiapkan shape berikutnya end sub
Metoda NextShape
Metoda ini berfungsi mempersiapkan shape berikutnya, dan menset interval timer 200 millidetik, dan posisi awal shape mulai di posisi (7,0)
'metoda mempersiapkan shape berikutnya private sub nextshape() gtimer.interval = 200
INDOPROG
39
Hendra, S.T.
Metoda MoveShape
Metoda ini berfungsi menggambarkan animasi pergerakan Shape pada posisi x,y sesuai dengan arah gerakan yang ditentukan pada dx dan dy, misalnya bergerak ke kiri, kama dx = -1, dy = 0
'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape() x = x + dx y = y + dy drawshape() end sub
Metoda MoveShape
Metoda ini berfungsi memperbaharui nilai score di layar
'metoda untuk mencetak score dilayar private sub printscore() labelscore.text = "Score : " & score.tostring() end sub
Metoda MoveShape
Metoda ini berfungsi mengubah tulisan di labelgameover menjadi Game Over
'metoda untuk mencetak gameover private sub printgameover() labelgameover.text = "Game Over" end sub
Event Tick
Event ini secara otomatis akan dibangkitkan oleh Timer secara berkala untuk mengerakan Shape ke bawah, dengan senantiasa apakah Shape telah mencapai batas gerakan, jika ya, maka akan memanggil metoda putshape pada TGrid. Jika Shape tertahan dibaris < 3 artinya Game Over
'mengerakan shape ke bawah dengan interval waktu tertentu private sub gtimer_tick(sender as object, e as eventargs) _ handles gtimer.tick 'apakah shape masih bisa turun kebawah if gtgrid.testshape(x,y+1,gtshape) then
INDOPROG
40
Hendra, S.T.
movexy(0,1) 'jika ya pindah shape 1 baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score + gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di baris 3, artinya game over if y < 3 then gtimer.enabled = false 'matikan timer karena gameover printgameover() 'tampil pesan gameover else nextshape() 'persiapkan gambar berikutnya end if end if end sub
Event KeyDown
Event ini secara otomatis akan dibangkitkan apabila adanya penekanan tombol oleh pemakai, Jika panah atas akan merotasi shape jika panah kiri akan mengerakan shape ke kiri jika panah kanan akan mengerakan shape ke kanan jika panah bawah akan mempercepat turunya shape
'deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydown select case e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40, 98 : 'Panah bawah, 2 interval dipercepat gtimer.interval = 10 end select end sub
INDOPROG
41
Hendra, S.T.
Metoda DrawSel
Metoda ini berfungsi menggambar sel Shape ke layar untuk animasi, metoda ini akan dipanggil oleh metoda drawshape dan OnPaint
'menggambar sel dari suatu shape private sub drawsel(pen as pen, brush as brush, _ x as integer, y as integer, _ w as integer, h as integer) if y > 2 then g.fillrectangle(brush,x*21,y*21,w,h) g.drawrectangle(pen,x*21,y*21,w,h) end if end sub
Metoda DrawShape
Metoda ini berfungsi menggambar Shape ke layar dengan memanggil metoda DrawSel untuk masing-masing sel
'mengambar shape secara sementara private sub drawshape() dim i as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(gtshape.currentcolor) for i = 0 to 3 drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1), _ 20,20) next i end sub
Metoda DrawShape
Metoda ini berfungsi menghapus Shape di layar dengan memanggil metoda DrawSel untuk masing-masing sel (warna hitam)
'menghapus shape sementara private sub clearshape() dim i as integer dim pen as new pen(color.black,1) dim brush as new solidbrush(color.black) for i = 0 to 3 drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1),20,20) next i end sub
Metoda ReDrawNextShape
Metoda ini berfungsi menggambar NextShape di layar setiap adanya perubahan nextshape
INDOPROG
42
Hendra, S.T.
Metoda ReDrawGrid
Metoda ini berfungsi menggambar ulang Grid dilayar
'mengambar ulang grid private sub redrawgrid dim i,j as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if gtgrid.parr(i,j) <> 0 then 'Menggambar ulang isi grid pen.color = color.white brush.color = gtgrid.carr(i,j) drawsel(pen,brush,i,j,20,20) else pen.color = color.black brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub
Metoda OnPaint
Metoda OnPaint akan secara otomatis diaktifkan oleh windows setiap kali layar form Tetris digambar ulang (misalnya waktu Maximize dan Minimize)
'melakukan overide terhadap sub onpaint pada base class 'untuk menggambar isi grid setiap proses refresh pada form protected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape() end sub
INDOPROG
43
Hendra, S.T.
Program Kongkret
option explicit on imports sistem imports sistem.drawing imports sistem.windows.forms imports microsoft.visualbasic public class tetris : inherits sistem.windows.forms.form <sistem.STAThread> _ public shared sub main() randomize() application.run(new tetris) end sub private private private private private private private private withevents gtimer as new sistem.windows.forms.timer labelscore as new label labelgameover as new label gtgrid as new tgrid 'instance class tgrid gtshape as new tshape 'instance class tshape g as graphics x,y as integer 'posisi x,y shape pada grid score as integer 'score permainan
public sub new() me.text = "Program Tetris" me.size = new size(450, 600) labelscore.location = new point(61,30) me.controls.add(labelscore) labelgameover.location = new point(200,30) me.controls.add(labelgameover) g = me.creategraphics() score = 0 printscore() nextshape() 'persiapkan shape berikutnya end sub 'metoda mempersiapkan shape berikutnya private sub nextshape() gtimer.interval = 200 gtimer.enabled = true gtshape.generatenextshape() redrawnextshape() x = 7 y = 0 end sub 'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape() x = x + dx y = y + dy drawshape() end sub
'set interval 200 millidetik 'mengaktifkan timer 'cetak shape berikutnya 'koordinat awal di 7,0
INDOPROG
44
Hendra, S.T.
'mengerakan shape ke bawah dengan interval waktu tertentu private sub gtimer_tick(sender as object, e as eventargs) _ handles gtimer.tick 'apakah shape bisa turun kebawah if gtgrid.testshape(x,y+1,gtshape) then movexy(0,1) 'pindah shape 1 baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score + gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di baris 3, artinya game over if y < 3 then gtimer.enabled = false 'matikan timer karena gameover printgameover() 'tampil pesan gameover else nextshape() 'persiapkan gambar berikutnya end if end if end sub 'deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydown select case e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40, 98 : 'Panah bawah, 2 interval dipercepat
INDOPROG
45
Hendra, S.T.
INDOPROG
46
Hendra, S.T.
private sub redrawgrid dim i,j as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if gtgrid.parr(i,j) <> 0 then 'Menggambar ulang isi grid pen.color = color.white brush.color = gtgrid.carr(i,j) drawsel(pen,brush,i,j,20,20) else pen.color = color.black brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub 'melakukan overide terhadap sub onpaint pada base class 'untuk menggambar isi grid setiap proses refresh pada form protected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape() end sub end class
public class tgrid public parr(15,25) as integer grid public carr(15,25) as color grid 'konstruktur class tgrid public sub new() dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'Array menyimpan isi sel pada 'Array menyimpan warna sel pada
'isi bingkai
'isi arena
'Mengembalikan nilai yang menunjukan apakah 'shape dapat ditempatkan pada grid diposisi x,y public function testshape(x as integer, y as integer, s as tshape) _ as boolean dim i as integer
INDOPROG
47
Hendra, S.T.
'Menempatkan shape pada posisi x,y di grid public sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3 parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = 1 carr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = s.currentcolor next i end sub 'periksa apakah ada baris yang berhasil diselesaikan pemain public function checkgrid() as integer dim i,j as integer dim b,k as integer dim complete as integer complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) <> 0 and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete = complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1 end if loop return complete end function end class public class tshape private currentshape private nextshape as public currentcolor public nextcolor as
INDOPROG
48
Hendra, S.T.
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}} 'konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end sub 'Membuat next shape berikutnya, dan menset current shape public sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0 'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape baru end sub 'Membuat bentuk dan mengembalikan melalui parameter shape dan shapecolor private sub generateshape(byref shape as integer, _ byref shapecolor as color) dim c as integer shape = int(rnd*6) 'random untuk shape c = int(rnd*8) 'random untuk shape color select case c case 0 : shapecolor = color.red case 1 : shapecolor = color.green case 2 : shapecolor = color.blue case 3 : shapecolor = color.orange case 4 : shapecolor = color.pink case 5 : shapecolor = color.cyan case 6 : shapecolor = color.gray case else shapecolor = color.magenta
INDOPROG
49
Hendra, S.T.
'Rotasi sebelumnya
'Mengembalikan sel i,j dari current shape public function currentshapesel(i as integer, j as integer) return sarr(currentshape,currentstate,i,j) end function 'Mengembalikan sel i,j dari next shape public function nextshapesel(i as integer, j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function end class
Kompilasi Program
Vbc tetris.vb /r:sistem.dll /r:sistem.drawing.dll /r:sistem.windows.forms.dll
INDOPROG
50