Download - Pemrogaman Visual Basic.NET (Modul 4)

Transcript
Page 1: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 1

Pemrograman Berorientasi Objek pada VB.Net

Oleh : Hendra, ST.

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.

Page 2: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 2

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.

Mengapa harus pendekatan OOP?

Tujuan utama dari pengembangan pendekatan berorientasi objek (OOP) adalah untuk

menghilangkan beberapa kelemahan yang terdapat pada pendekatan procedural. Pada OOP data

diperlakukan sebagai elemen yang penting dan tidak boleh mengalir secara bebas dalam

program. Data yang terikat kepada function dan harus dilindungi terhadap kemungkinan

perubahan dari luar function.

Catatan :

Anda dapat melihat konsep OOP seperti suatu objek Televisi, dimana sebagai pemakai

kita tidak perlu terlalu pusing dengan komponen apa saja yang bekerja didalam televise

tersebut, tetapi sebagai pemakai kita cukup mengerti bagaimana menghidupkan, memilih

channel, mengubah volume suara, dan beberapa setting dasar.

OOP memungkinkan untuk pemecahan masalah kedalam sejumlah entitas yang disebut sebagai

objek dan kemudian mengembangkan data dan fungsi disekitar objek tersebut. Salah satu

manfaat yang terpenting dari OOP adalah pemanfaatan kembali.

Beberapa kemampuan utama dari OOP adalah sebagai berikut :

• 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.

Page 3: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 3

Konsep dari OOP:

• Objects

• Classes

• Data Abstraction dan Encapsulation

• Inheritance

• Polymorphism

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.

Data Abstraction dan Encapsulation

Abstraction mengacu pada usaha untuk menampilkan hal-hal yang penting tanpa

mengikutsertakan detail latarbelakang ataupun penjelasan. Class-class menggunakan konsep dari

abstraksi dan mendefinsikannya sebagai suatu daftar dari atribut-atribut abstrak.

Page 4: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 4

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.

Keunggulan dari OOP

Page 5: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 5

OOP memiliki keunggulan berikut diatas pendekatan konvensional:

• 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.

Page 6: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 6

OOP pada Visual Basic

Membuat Class

Pemrograman OOP pada Visual Basic dapat dilakukan dengan merancang class dari objek

dengan menggunakan struktur class sebagai berikut :

Class nama

'member [variable, property, method and event declarations]

End Class

Contoh :

Misalnya kita ingin membuat program animasi bola pantul yang memanfaatkan GDI+ dengan

pendekatan berorientasi objek, maka sebagai langkah awal adalah merancang Class untuk bola

pantul.

Pada tahap rancangan, kita harus dapat mendefinisikan aksi apa saja yang harus dapat dilakukan

oleh objek bola pantul yaitu bergerak (move) yang tentu saja memiliki koordinat awal (x,y) yang

bergerak kearah tertentu (dx, dy). Dalam pergerakan dilayar, tentu saja dibatasi oleh area tertentu

(sx,sy).

Kemudian sebagai wujud dari animasi gerakan bola dilayar, kita perlu menyediakan aksi draw

dan clear.

Adapun rancangan class tersebut diatas dalam bentuk terprogram adalah sebagai berikut :

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

Public Sub New(f as form) '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

Draw(f)

End Sub

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)

Page 7: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 7

End Sub

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.

Ruang Lingkup member pada suatu class

Pada saat pendeklarasian member pada class anda dapat menggunakan keyword seperti Friend,

Private, Protected, Protected Friend, dan Public, dimana masing-masing memiliki kendali akses

yang berbeda.

Friend, member hanya tersedia bagi kode pada lingkup project yang sama.

Private, member hanya tersedia bagi class itu sendiri

Protected, member tersedia bagi class dan class turunannya.

Protected Friend, member tersedua bagi kode pada lingkup project yang sama, dan class

turunannya.

Public, member tersedia bagi semua kode program.

Jika anda tidak menentukan jenis kendali akses bagai suatu member, maka defaultnya adalah

Public.

Page 8: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 8

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) '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

Draw(f)

End Sub

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)

Dimana Me mengacu pada form yang sedang aktif.

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

Page 9: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 9

khusus yang dikenal sebagai Constructor.

Contoh Keunggulan OOP (Bagian 1)

Jika sekilas kita melihat uraian yang telah disebutkan diatas seakan-akan segala sesuatu yang

dilakukan dengan pendekatan OOP dapat juga dilakukan dengan teknik pemrograman biasanya.

Tetapi misalnya anda bayangkan kita ingin membuat program bola pantul yang terdiri dari 15

buah bola pantul dilayar yang masing-masing bergerak tanpa pendekatan OOP.

Berikut ini saya akan membuat contoh dengan pendekatan OOP, dan anda bandingkan sendiri.

Pertama kita akan membuat variable array untuk bola pantul sebagai array 15 elemen :

Dim Bola(14) As Pantul

Kemudian kita buat instance dari Class Pantul

For I As Integer = 0 To 14

Bola(I) = New Pantul(Me)

Next I

Selanjutnya kita gerakan masing-masing objek dengan looping :

For I As Integer = 0 To 14

Bola.Move(Me)

Next I

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

Me.BackColor = Sistem.Drawing.Color.Black

Me.FormBorderStyle = FormBorderStyle.None

Page 10: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 10

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

MyTimer.Interval = 150 '150 millidetik

MyTimer.Enabled = True

End Sub

'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 '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

Public Sub New(f as form) '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

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(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

Page 11: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 11

'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

Page 12: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 12

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)

Page 13: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 13

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

Selanjutnya pada class turunannya kita dapat melakukan Overriding terhadap metoda yang

dimaksud :

Class Pantul1 : Inherits Pantul

Public Sub New(f as form) 'constructor

MyBase.New(f)

End Sub

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

Pada class turunannya :

Page 14: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 14

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.

OOP pada Pemrograman Form

Untuk pemrograman program Windows yang berbasis form, .NET telah menyediakan class

Form yang terdefinisi pada namespace Sistem.Windows.Forms, kemudian didalam

pemakaiannya kita dapat melakukan inheritance dari class form ke program kita dengan menbuat

class baru :

Public Class MyForm : Inherits Form

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

MyTimer.Interval = 150 '150 millidetik

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

Contoh Keunggulan OOP (Bagian 2)

Misalnya kita akan membuat program yang terdiri dari 2 objek pantul yang satu berbentuk bola

dan satu berbentuk persegi.

Page 15: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 15

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

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

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 'posisi x dilayar

Protected y As Single 'posisi y dilayar

Private sx As Single 'jumlah kolom x

Private sy As Single 'jumlah baris y

Page 16: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 16

Private dx As Single 'arah bola terhadap x

Private dy As Single 'arah bola terhadap y

Public Sub New(f as form) '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

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(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) 'constructor

MyBase.New(f) 'menjalankan constructor base class

End Sub

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

Page 17: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 17

Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3)

MyGraphic.DrawRectangle(MyPen, x*30,y*30,30,30)

End Sub

End Class

Page 18: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 18

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

Page 19: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 19

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

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.

Contoh Keunggulan OOP (Bagian 3)

Misalnya kita ingin membuat program animasi bola pantul di layar yang memberi kebebasan

kepada pemakai untuk menentukan jumlah objek masing-masing bentuk dilayar :

Page 20: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 20

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)

Page 21: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 21

Next I

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

Page 22: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 22

Bola(I).Move(Me)

Next I

End Sub

End Class

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)

Page 23: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 23

End Sub

End Class

Class Pantul1 : Inherits Pantul

Public Sub New(f as form) 'constructor

MyBase.New(f)

End Sub

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

Catatan :

Konsep Polymorphism tidak berlaku untuk metoda Shadowing.

Page 24: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 24

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 Interface Sapaan

Sub Pagi()

Sub Sore()

Sub 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

Page 25: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 25

Console.WriteLine("Good Afternoon")

End Sub

Sub Malam() Implements Sapaan.Malam

Console.WriteLine("Good Evening")

End Sub

End Class

Dan listing konkret untuk contoh pemakaian interface :

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

Public Interface Sapaan

Sub Pagi()

Sub Sore()

Sub Malam()

End Interface

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

Console.WriteLine("Good Afternoon")

End Sub

Sub Malam() Implements Sapaan.Malam

Console.WriteLine("Good Evening")

End Sub

Page 26: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 26

End Class

End Module

Dan kalau dijalankan akan menghasilkan tampilan berikut

Page 27: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 27

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.

Membuat class Abstrak

Pada Visual Basic .NET kita dapat membuat abstrak class dengan menggunakan keyword

MustInherit.

MustInherit Public Class Sapaan

MustOverride Sub Pagi()

MustOverride Sub Sore()

MustOverride Sub Malam()

End Class

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()

Page 28: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 28

Console.WriteLine("Selamat Malam")

End Sub

End Class

Public Class English : Inherits Sapaan

Overrides Sub Pagi()

Console.WriteLine("Good Morning")

End Sub

Overrides Sub Sore()

Console.WriteLine("Good Afternoon")

End Sub

Overrides Sub Malam()

Console.WriteLine("Good Evening")

End Sub

End Class

End Module

Page 29: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 29

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+

Page 30: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 30

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}

Dan rotasi ke kanan akan menjadi

{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}

Page 31: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 31

{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}

Contoh :

Yang memiliki rincian array sebagai berikut :

{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}

Yang selanjutnya dipetakan menjadi suatu array 4 dimensi yang berisi koordinat dari masing-

masing 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}}}}

Variabel pada Class TShape

private currentshape as integer 'menyimpan nomor current shape

private nextshape as integer 'menyimpan nomor next shape

Page 32: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 32

public currentcolor as color 'menyimpan warna current shape

public nextcolor as color 'menyimpan warna next shape

private currentstate as integer '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

Sub GenerateShape

Berfungsi menghasilkan shape secara random, dan warnanya

'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

Page 33: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 33

case 6 : shapecolor = color.gray

case else

shapecolor = color.magenta

end select

end sub

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 'Rotasi berikutnya

if currentstate = 4 then currentstate = 0 'Kembali ke bentuk awal

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 'Rotasi sebelumnya

if currentstate = -1 then currentstate = 3

end sub

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)

Page 34: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 34

Misalnya nilai currentshape = 4, dan nilai currentstate = 3

{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 :

Page 35: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 35

Variabel yang digunakan public parr(15,25) as integer 'Array menyimpan isi sel pada grid

public carr(15,25) as color 'Array menyimpan warna sel pada grid

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)

Page 36: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 36

'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 'isi bingkai

next j

next i

for i = 3 to 12

for j = 0 to 22

parr(i,j) = 0 'isi arena

next j

next i

end sub

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

Page 37: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 37

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

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

Page 38: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 38

next i

return true

end function

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.

Page 39: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 39

Class Tetris

Class ini merupakan class utama permainan Tetris

Variabel yang digunakan

private withevents gtimer as new sistem.windows.forms.timer

private labelscore as new label

private labelgameover as new label

private gtgrid as new tgrid 'instance class tgrid

private gtshape as new tshape 'instance class tshape

private g as graphics

private x,y as integer 'posisi x,y shape pada grid

private score as integer 'score permainan

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 'set interval 200 millidetik

Page 40: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 40

gtimer.enabled = true 'mengaktifkan timer

gtshape.generatenextshape()

redrawnextshape() 'cetak shape berikutnya

x = 7 'koordinat awal di 7,0

y = 0

end sub

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() 'hapus gambar sebelumnya

x = x + dx 'ubah posisi x,y

y = y + dy

drawshape() 'gambar diposisi baru

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

Page 41: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 41

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

Page 42: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 42

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

Page 43: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 43

'mengambar ulang nextshape

private sub redrawnextshape

dim i as integer

dim pen as new pen(color.black,1)

dim brush as new solidbrush(color.black)

g.fillrectangle(brush,300,60,120,120)

pen.color = color.white

brush.color = gtshape.nextcolor

for i = 0 to 3

drawsel(pen,brush, _

16+gtshape.nextshapesel(i,0), _

4+gtshape.nextshapesel(i,1), _

20,20)

next i

end sub

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

Page 44: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 44

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 withevents gtimer as new sistem.windows.forms.timer

private labelscore as new label

private labelgameover as new label

private gtgrid as new tgrid 'instance class tgrid

private gtshape as new tshape 'instance class tshape

private g as graphics

private x,y as integer 'posisi x,y shape pada grid

private 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 'set interval 200 millidetik

gtimer.enabled = true 'mengaktifkan timer

gtshape.generatenextshape()

redrawnextshape() 'cetak shape berikutnya

x = 7 'koordinat awal di 7,0

y = 0

end sub

'memindahkan shape keposisi x,y

private sub movexy(dx,dy)

clearshape() 'hapus gambar sebelumnya

x = x + dx 'ubah posisi x,y

y = y + dy

drawshape() 'gambar diposisi baru

end sub

Page 45: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 45

'metoda untuk mencetak score dilayar

private sub printscore()

labelscore.text = "Score : " & score.tostring()

end sub

'metoda untuk mencetak gameover

private sub printgameover()

labelgameover.text = "Game Over"

end sub

'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

Page 46: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 46

gtimer.interval = 10

end select

end sub

'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

'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

'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

'mengambar ulang nextshape

private sub redrawnextshape

dim i as integer

dim pen as new pen(color.black,1)

dim brush as new solidbrush(color.black)

g.fillrectangle(brush,300,60,120,120)

pen.color = color.white

brush.color = gtshape.nextcolor

for i = 0 to 3

drawsel(pen,brush, _

16+gtshape.nextshapesel(i,0), _

4+gtshape.nextshapesel(i,1), _

20,20)

next i

end sub

'mengambar ulang grid

Page 47: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 47

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 'Array menyimpan isi sel pada

grid

public carr(15,25) as color 'Array menyimpan warna sel pada

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 'isi bingkai

next j

next i

for i = 3 to 12

for j = 0 to 22

parr(i,j) = 0 'isi arena

next j

next i

end sub

'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

Page 48: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 48

for i = 0 to 3

'apakah sel pada grid telah terisi

if parr(x+s.currentshapesel(i,0), _

y+s.currentshapesel(i,1)) > 0 then

return false

end if

next i

return true

end function

'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 as integer 'menyimpan nomor current shape

private nextshape as integer 'menyimpan nomor next shape

public currentcolor as color 'menyimpan warna current shape

public nextcolor as color 'menyimpan warna next shape

private currentstate as integer 'nomor rotasi shape

Page 49: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 49

'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

Page 50: Pemrogaman Visual Basic.NET (Modul 4)

Pemrograman Berorientasi Objek pada VB.NET Hendra, S.T.

INDOPROG 50

end select

end sub

'Rotasi ke bentuk berikutnya

public sub rotate()

currentstate = currentstate + 1 'Rotasi berikutnya

if currentstate = 4 then currentstate = 0 'Kembali ke bentuk awal

end sub

'Rotasi ke bentuk sebelumnya

public sub derotate()

currentstate = currentstate - 1 'Rotasi sebelumnya

if currentstate = -1 then currentstate = 3

end sub

'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