SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.




                     Pemrograman GDI+ pada VB.Net
                                  Oleh : Hendra, ST.




 Buku ini membahas tentang pengolahan grafik pada VB.NET, dan ditujukan kepada siapa saja
    yang serius untuk mempelajari pemrogrman grafik dengan GDI+ secara koding (tanpa
  menggunakan fasilitas designer pada Visual Studio .NET). Bagi anda yang belum mengenal
    bahasa pemrograman VB.NET sebaiknya memulai proses belajar dengan buku Bahasa
                 Pemrograman VB.NET dan Pemrogram Form pada VB.NET

  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.

  Pada akhir tutorial ini, penulisa memberikan contoh pemrograman GDI+ yang diaplikasikan
                                 pada pemrograman games Tetris.




INDOPROG                                                                             1
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.




Pemrograman Grafik pada VB.NET
Untuk pemrograman Grafik di VB.NET kita membutuhkan GDI+ (Graphic Device Interface)
yang merupakan bagian dari system operasi XP.

GDI+ yang memiliki kemampuan untuk mengolah grafik vector dua dimensi (garis), imaging
(bitmap) dan typography (font) pada Layar maupun Printer.

Dengan GDI, programmer tidak perlu mengetahui detail dari masing-masing peralatan untuk
menampilkan grafik diatasnya, tetapi cukup menggunakan fasilitas yang telah disediakan oleh
GDI+ class.

Catatan :
Pada pemrograman tradisional, menggambar garis ke layar akan sangat berbeda dengan
menggambar garis ke printer.


System Koordinat pada GDI+

GDI+ menggunakan system koordinat dilayar x,y mulai dari 0,0.




Dan pada layar computer, koordinat tersebut, merupakan pixel pada layar.




Misalnya kita menggambar sebuah garis mulai dari koordinat 4,2 sampai 12, 8, maka tampilan
dilayar adalah sebagai berikut :



INDOPROG                                                                             2
Pemrograman GDI+ pada VB.NET                                             Hendra, S.T.




Mengambar Garis pada Form

Pengambaran Graphics diatas form dapat dilakukan melalui Objek Graphics yang dapat
dideklarasikan sebagai berikut :

Dim MyGraphics As System.Drawing.Graphics = Me.CreateGraphics

Objek Graphics menyediakan berbagai metode untuk menggambar seperti DrawLine,
DrawRectangle, dll

Dalam pengembaran, kita membutuhkan Objek Pen menyediakan atribut seperti Warna dan
Ketebalan garis dalam ukuran pixel.

Objek Pen dapat dideklarasikan sebagai berikut :

Dim Pen As New System.Drawing.Pen(Warna,Tebal)

Dimana Warna adalah warna yang diinginkan, dan Tebal adalah tebal pen dalam ukuran point.

Contoh program GDI+ anda yang pertama :

Option Explicit On
Imports System
Imports System.Windows.Forms
Imports Microsoft.VisualBasic

Public Class MyForm : Inherits Form

   <System.STAThread()> _
   Public Shared Sub Main()
       Application.Run(New MyForm)
   End Sub


   Public Sub New()                          'Constructor
       Me.Text = "Mengambar garis pada Form"
   End Sub

   Private Sub MyForm_Click(Sender As Object, e As System.EventArgs) _



INDOPROG                                                                             3
Pemrograman GDI+ pada VB.NET                                                Hendra, S.T.


       Handles MyBase.Click
       Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3)
       Dim MyGraphic As System.Drawing.Graphics = Me.CreateGraphics
       MyGraphic.DrawLine(MyPen,10,10,200,100)
   End Sub

End Class

Kemudian simpan program diatas dengan mana grafik.vb

Proses kompilasi
Proses kompilasi dengan menggunakan perintah :

Vbc grafik.vb /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll

Dan ketika anda jalankan, dan klik pada form akan menghasilkan tampilan :




Catatan :
Mengenai pemrogram form pada VB.NET dapat anda baca di ebook pemrogram form
pada VB.NET

Salah satu kelemahan dari cara diatas adalah, kalau form mengalami refresh, maka garis
yang telah digambarkan tersebut akan hilang (VB.NET tidak menyediakan property
AutoRedraw seperti yang terdapat pada VB6)

Untuk membuktikannya coba anda minimize dan maximize kembali form diatas, maka
garis tersebut akan hilang.




INDOPROG                                                                                 4
Pemrograman GDI+ pada VB.NET                                              Hendra, S.T.


Melakukan overriding terhadap Metoda OnPaint

OnPaint Event Handle adalah event yang akan dibangkitkan setiap kali form mengalami refresh
(pada saat minimize, maximize maupun ditimpa oleh form lain), jadi jika kita melakukan
overriding terhadap Event ini dan menempatkan perintah pengambaran garis didalamnya ini,
maka garis tersebut akan digambar setiap proses refresh.

Parameter PaintEventArgs pada Sub OnPaint merupakan objek Graphics, sehingga kita tidak
perlu melakukan Me.CreateGraphics.

Contoh :

Option Explicit On
Imports System
Imports System.Windows.Forms
Imports Microsoft.VisualBasic

Public Class MyForm
       Inherits Form


   <System.STAThread()> _
   Public Shared Sub Main()
       Application.Run(New MyForm)
   End Sub


   Public Sub New()                         'Constructor
       Me.Text = "Membuat garis pada Form dengan OnPaint"

   End Sub

   Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
       Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3)
       MyBase.OnPaint(e)
       e.Graphics.DrawLine(MyPen,10,10,200,100)
   End Sub

End Class

Kalau program diatas dijalankan, maka akan menampilkan garis pada form, dan tetap akan ada
walaupun form direfresh.

Catatan :
Pada contoh diatas kita melakukan overriding terhadap metoda OnPaint yang ada pada
Base class dengan Metoda baru yang kita buat dimana didalamnya akan mengambarkan
garis, sehingga setiap kejadian OnPaint akan menjalankan Event baru tersebut.

Kemudian dalam koding kita menulis MyBase.OnPaint(e), yang artinya kita menjalan
kembali event OnPaint pada Base class yang telah kita overriding.



INDOPROG                                                                             5
Pemrograman GDI+ pada VB.NET                                             Hendra, S.T.



Mengambar grafik vector 2 dimensi
Grafik vector merupakan kemampuan menggambar bentuk-bentuk tradisional seperti garis,
kurva dan bentuk berdasarkan sekumpulan titik tertentu.

Untuk pengambaran grafik vector kita dapat menggunakan objek Pen dan Brush, dimana objek
Pen untuk pengambaran bentuk garis, dan Brush untuk objek isian.


Mengambar garis dengan Pen

Perintah DrawLine(pen, x1,y1, x2,y2) digunakan untuk menggambar garis dari koordinat awal
(x1,y1) ke koordinat akhir (x2,y2).

Contoh :

Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3)
e.Graphics.DrawLine(MyPen,10,10,200,100)

Akan menghasilkan




Mengambar persegi dengan Pen

Kita dapat menggunakan metoda DrawRectangle(Pen, x,y,lebar,tinggi) pada objek grafik untuk
mengambar persegi pada koordinat x,y dengan lebar dan tinggi tertentu.

Contoh :



INDOPROG                                                                           6
Pemrograman GDI+ pada VB.NET                                              Hendra, S.T.



e.Graphics.DrawRectangle(MyPen,10,10,200,100)

Akan menghasilkan :




Mengambar Ellipse pada Form dengan Pen

Kita dapat menggunakan metoda DrawEllipse(Pen,x,y,lebar,tinggi) pada objek grafik untuk
mengambar ellipse pada koordinat x,y dengan ukuran lebar dan tinggi tertentu :




Contoh :

e.Graphics.DrawEllipse(MyPen,10,10,200,100)

Akan menghasilkan :




INDOPROG                                                                            7
Pemrograman GDI+ pada VB.NET                                              Hendra, S.T.




Mengambar Arc pada Form dengan Pen

Kita dapat menggunakan metoda DrawArc(Pen,x,y,lebar,tinggi,sudutawal,sudutakhir) untuk
mengambar arcus, adapun perbedaan antara Ellipse dengan Arc adalah, kalau ellipse adalah
gambar kurva tertutup, sedangkan Arc ditentukan oleh sudut awal dan akhir pengambaran kurva.

Contoh :

e.Graphics.DrawArc(MyPen,10,10,200,100,0,270)

Akan menghasilkan :




INDOPROG                                                                            8
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.


Mengambar Pie pada Form dengan Pen

Kalau Arc adalah kurva dengan sudut awal dan akhir, demikian juga pie, bedanya adalah pie
merupakan kurva tertutup. Untuk menggambar pie dapat digunakan metoda
DrawEllipse(Pen,x,y,lebar,tinggi).

Contoh :

e.Graphics.DrawPie(MyPen,10,10,200,100,0,90)

Akan menghasilkan :




Menggunakan structure Point

Kita juga dapat menggunakan structure point untuk penentuan koordinat (x,y) awal dan akhir
pada perintah DrawLine(pen, point1, point2).

Catatan :
DrawLine(pen, point1, point2) merupakan metode overloading terhadap DrawLine(pen,
x1,y1,x2,y2)


Contoh :

Dim Point1 As New System.Drawing.Point(10,10)
Dim Point2 As New System.Drawing.Point(200,100)
e.Graphics.DrawLine(MyPen,Point1,Point2)




INDOPROG                                                                             9
Pemrograman GDI+ pada VB.NET                                                Hendra, S.T.


yang kalau dijalankan akan menghasilkan garis yang sama dengan perintah :

e.Graphics.DrawLine(MyPen,10,10,200,100)

Akan menghasilkan :




Menggambar poligon dengan array dari point

DrawPolygons(Pen,PointArray) merupakan kurva tertutup yang dibentuk oleh garis-garis, untuk
menggambar poligon anda perlu menyediakan array yang berisi koordinat (x,y) dari sudut-sudut
polygon.




Contoh :

Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3)
Dim MyArr As System.Drawing.Point() = _
          {new System.Drawing.Point(0,0), _
           new System.Drawing.Point(250,130), _
           new System.Drawing.Point(190,160)}
e.Graphics.DrawPolygon(MyPen,MyArr)

Akan menghasilkan :



INDOPROG                                                                            10
Pemrograman GDI+ pada VB.NET                                                   Hendra, S.T.




Menggambar cardinal splines dengan array dari point

Jika polygon merupakan kurva tertutup yang dihubungan oleh garis lurus pada setiap koordinat
(x,y) sudutnya, maka DrawCurve(Pen, PointArray, Tangen) merupakan kurva terbuka yang
dibentuk dengan garis lengkung yang memiliki nilai tangent tertentu, berikut ini adalah contoh
gambar cardinal splines yang memiliki tiga titik dengan nilai tangent yang berbeda (0, 1, 1.5, dan
2).




Contoh :
Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3)
Dim MyArr As System.Drawing.Point() = _
          {new System.Drawing.Point(0,0), _
           new System.Drawing.Point(250,130), _
           new System.Drawing.Point(190,160)}
e.Graphics.DrawCurve(MyPen,MyArr,1.5F)

Akan menghasilkan :




INDOPROG                                                                               11
Pemrograman GDI+ pada VB.NET                                          Hendra, S.T.




Kemudian kita dapat juga menggunakan DrawClosedCurve(pen, PointArray) untuk
menghasilkan kurva tertutup.

Contoh :

Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3)
Dim MyArr As System.Drawing.Point() = _
          {new System.Drawing.Point(0,0), _
           new System.Drawing.Point(250,130), _
           new System.Drawing.Point(190,160)}
e.Graphics.DrawClosedCurve(MyPen,MyArr)

Akan menghasilkan :




INDOPROG                                                                      12
Pemrograman GDI+ pada VB.NET                                                Hendra, S.T.




Menggambar Bezier splines dengan array dari point

DrawBezier(pen, x1, y1, x2, y2, x3, y3, x4, y4) merupakan kurva dengan dari koordinat (x1,y1)
awal ke koordinat (x2,y2), dengan dua koordinat control (x3,y3) dan (x4,y4).




Pada gambar diatas p1 awal koordinat awal, p2 adalah koordinat akhir, dan c1, c2 adalah
koordinat control Bezier.

Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3)
e.Graphics.DrawBezier(MyPen,0,0,200,200,70,50, 150, 40)




INDOPROG                                                                            13
Pemrograman GDI+ pada VB.NET                                          Hendra, S.T.




Menggunakan Path

Path dibentuk oleh kombinasi dari berbagai bentuk seperti :

   •   Lines
   •   Rectangles
   •   Ellipses
   •   Arcs
   •   Polygons
   •   Cardinal splines
   •   Bézier splines




Dengan perintah AddLine, AddRectangle, AddEllipse, AddArc, AddPolygon, AddCurve, dan
AddBezier.

Contoh :

Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3)
Dim MyPath As New System.Drawing.Drawing2D.GraphicsPath()
MyPath.AddLine(0,0,65,20)
MyPath.AddEllipse(30,20,100,50)
MyPath.AddLine(130,45,200,50)



INDOPROG                                                                      14
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.


e.Graphics.DrawPath(MyPen,MyPath)

Akan menghasilkan :




Menggunakan structure rectangle

Sebagaimana dengan structure point, kita dapat juga menggunakan struktur rectangle untuk
mengambar bentuk yang membutuhkan koordinat x,y dan ukuran lebar, tinggi, misalnya
DrawRectangle(pen, rectangle), DrawArc(Pen,x,y,rectangle,sudutakhir),
DrawEllipse(Pen,rectangle), DrawEllipse(Pen,rectangle),

Contoh :
Dim Rect As New System.Drawing.Rectangle(10,10,200,100)
e.Graphics.DrawRectangle(MyPen,Rect)

yang hasilnya akan sama dengan :

e.Graphics.DrawRectangle(MyPen,10,10,200,100)




INDOPROG                                                                           15
Pemrograman GDI+ pada VB.NET                                                    Hendra, S.T.




Mengambar objek isian pada Form dengan Brush

Kalau kita mengambar bentuk dengan Pen, maka hasilnya tidak disertai dengan isian, sedangkan
untuk menghasilkan gambar dengan isian kita membutuhkan Brush.




Menggunakan SolidBrush

SolidBrush(warna) dapat digunakan untuk menggambarkan objek isian seperti
FillRectangle(brush, rectangle), FillEllipse(brush, rectangle), FillPie(brush, rectangle, sudutawal,
sudutakhir), dengan warna yang ditentukan pada brush.

Contoh :

Dim MyBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
Dim Rect As New System.Drawing.Rectangle(10,10,200,100)
e.Graphics.FillRectangle(MyBrush,Rect)

Yang kalau dijalankan akan menghasilkan suatu persegi yang diisi dengan warna merah penuh.




INDOPROG                                                                                16
Pemrograman GDI+ pada VB.NET                                            Hendra, S.T.




Menggunakan HatchBrush

HatchBrush(pola, warnagaris, warnalatarbelakang), dapat digunakan untuk menggambar objek
isian dengan pola isian tertentu seperti :

   •   HatchStyle.Horizontal
   •   HatchStyle.Vertical
   •   HatchStyle.ForwardDiagonal
   •   HatchStyle.HatchStyleBackwardDiagonal
   •   HatchStyle.HatchStyleCross
   •   HatchStyle.HatchStyleDiagonalCross




HatchBrush terdefinisi pada namespace System.Drawing.Drawing2D

Contoh :

Dim MyBrush As New _
    System.Drawing.Drawing2D.HatchBrush(_
           System.Drawing.Drawing2D.HatchStyle.Horizontal, _
           System.Drawing.Color.Red, _
           System.Drawing.Color.White)
Dim Rect As New System.Drawing.Rectangle(10,10,200,100)
e.Graphics.FillRectangle(MyBrush,Rect)




INDOPROG                                                                        17
Pemrograman GDI+ pada VB.NET                                            Hendra, S.T.




Menggunakan TextureBrush

TextureBrush(gambar), dapat digunakan untuk mengambarkan objek isian yang diisi dengan

gambar tertentu




                  .

Contoh :

Dim MyImage As New System.Drawing.Bitmap("c:windowsgreenstone.bmp")
Dim MyBrush As New System.Drawing.TextureBrush(MyImage)
Dim Rect As New System.Drawing.Rectangle(10,10,200,100)
e.Graphics.FillRectangle(MyBrush,Rect)




INDOPROG                                                                        18
Pemrograman GDI+ pada VB.NET                                            Hendra, S.T.




Menggunakan GradientBrush

GradientBrush digunakan untuk warna isian yang sifatnya gradual

LinearGradientBrush
LinierGradientBrush(Point1,Point2,warna1,warna2) akan membuat warna gradient mulai dari
Point1 ke Point2 secara gradual dari warna1 ke warna2




LinearGradientBrush terdefinisi pada namespace System.Drawing.Drawing2D

Contoh :

Dim Point1 As New System.Drawing.Point(10,10)
Dim Point2 As New System.Drawing.Point(100,10)
Dim MyBrush As New _
    System.Drawing.Drawing2D.LinearGradientBrush(Point1,Point2, _
    System.Drawing.Color.FromArgb(255,0,0), _
    System.Drawing.Color.FromArgb(0,0,255))
Dim Rect As New System.Drawing.Rectangle(10,10,200,100)
e.Graphics.FillRectangle(MyBrush,Rect)




INDOPROG                                                                        19
Pemrograman GDI+ pada VB.NET                                          Hendra, S.T.




Menggunakan GammaCorrection

Contoh :
Dim Point1 As New System.Drawing.Point(10,10)
Dim Point2 As New System.Drawing.Point(100,10)
Dim MyBrush As New _
    System.Drawing.Drawing2D.LinearGradientBrush(Point1,Point2, _
           System.Drawing.Color.FromArgb(255,0,0), _
           System.Drawing.Color.FromArgb(0,0,255))
Dim Rect As New System.Drawing.Rectangle(10,10,200,100)
MyBrush.GammaCorrection = True
e.Graphics.FillRectangle(MyBrush,Rect)

Bandingkan dengan hasil sebelumnya yang tidak menggunakan gamma correction.




INDOPROG                                                                      20
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.




Mengambar tulisan pada Form dengan DrawString

Untuk menampilkan tulisan kita dapat menggunakan DrawString(tulisan, font, brush, pointF).

Contoh :

Dim Fontname As New System.Drawing.FontFamily("Times New Roman")
Dim MyFont As New System.Drawing.Font(FontName, 24, _
                  System.Drawing.FontStyle.Regular, _
                  System.Drawing.GraphicsUnit.Pixel)
Dim MyBrush As New ystem.Drawing.SolidBrush(System.Drawing.Color.Black)
Dim MyPoint As New System.Drawing.PointF(10.0,10.0)
e.Graphics.DrawString("Hello World !",MyFont,MyBrush,MyPoint)

Catatan :
PointF adalah point dalam type Float




INDOPROG                                                                           21
Pemrograman GDI+ pada VB.NET                                          Hendra, S.T.




Mengambar garis dengan texture

Untuk mengambar garis dengan texture, kita membutuhkan pen yang menggunakan
TextureBrush.

Contoh :

Dim MyImage As New System.Drawing.Bitmap("c:windowsgreenstone.bmp")
Dim MyBrush As New System.Drawing.TextureBrush(MyImage)
Dim MyPen As New System.Drawing.Pen(MyBrush, 10)
e.Graphics.DrawLine(MyPen,10,10,200,100)




INDOPROG                                                                      22
Pemrograman GDI+ pada VB.NET                                            Hendra, S.T.



Menampilkan gambar
Jika pada bagian sebelumnya kita telah membahas pembuatan grafik vector dengan GDI+, maka
pada bagian ini kita akan melihat bagaimana mengolah gambar.


Memuat dan menampilkan
Untuk memuat dan menampilkan gambar dari file ke layer, anda membutuhkan objek Bitmap
dan objek Graphics. Class Bitmap mendukung beberapa format seperti BMP, GIF, JPEG, PNG
dan TIFF.

Contoh :

Dim bitmap As New Bitmap("Grapes.jpg")
e.Graphics.DrawImage(bitmap, 60, 10)




Memuat dan menampilkan dengan ukuran lain

Untuk menampilkan gambar dengan ukuran yang berbeda dengan ukuran sebenarnya, kita harus
menyediakan dua Rectangle, yaitu Rectangle Asal (crop terhadap gambar sebenarnya), dan
Rectangle Tujuan (yang berisi koordinat dan ukuran yang diinginkan),

contoh :

Dim image = New Bitmap("Apple.gif")

' menggambar bitmap di posisi (0, 0).
e.Graphics.DrawImage(image, 0, 0)

' membuat Rectangle tujuan di koordinat (150,20), dan
' tinggi dan lebar diset 130% dari ukuran gambar semula
Dim width As Integer = image.Width
Dim height As Integer = image.Height
Dim destinationRect As New RectangleF( _



INDOPROG                                                                        23
Pemrograman GDI+ pada VB.NET                                             Hendra, S.T.


   150, _
   20, _
   1.3F * width, _
   1.3F * height)

' Membuat rectangle asal gambar dengan menggambil 75% gambar
Dim sourceRect As New RectangleF(0, 0, 0.75F * width, 0.75F * height)
e.Graphics.DrawImage( _
   image, _
   destinationRect, _
   sourceRect, _
   GraphicsUnit.Pixel)




Melakukan rotasi terhadap gambar
Untuk melakukan rotasi terhadap gambar kita membutuhkan tiga koordinat yaitu




     Titik asal       Titik tujuan
Kiri atas (0, 0)    (200, 20)
Kanan atas (100, 0) (110, 100)
Kiri bawah (0, 50) (250, 30)




INDOPROG                                                                         24
Pemrograman GDI+ pada VB.NET                                             Hendra, S.T.


Sehingga dalam program Visual Basic ditulis sebagai :

'Membuat array yang berisi ketiga titik tujuan
Dim destinationPoints As Point() = { _
  New Point(200, 20), _
  New Point(110, 100), _
  New Point(250, 30)}

‘Memuat file Stripes.bmp
Dim image = New Bitmap("Stripes.bmp")

' Tampilkan gambar dikoordinat 0,0
e.Graphics.DrawImage(image, 0, 0)

' Tampilkan gambar sekali lagi berdasarkan titik tujuan
e.Graphics.DrawImage(image, destinationPoints)




Menggunakan interpolation pada saat mengubah ukuran gambar

Pemakaian interpolation akan menentukan kualitas gambar hasil pembesaran ataupun
pengecilan.

Perhatikan kualitas gambar berikut yang masing-masing menggunakan interpolation yang
berbeda.




INDOPROG                                                                           25
Pemrograman GDI+ pada VB.NET                                       Hendra, S.T.




Dengan koding berikut :

Dim image = New Bitmap("GrapeBunch.bmp")
Dim width As Integer = image.Width
Dim height As Integer = image.Height

'Menampilkan gambar apa adanya pada koordinat 0,0
e.Graphics.DrawImage( _
  image, _
  New Rectangle(10, 10, width, height), _
  0, _
  0, _
  width, _
  height, _
  GraphicsUnit.Pixel, _
  Nothing)

' Mengunakan interpolation kualitas rendah
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor

' Menampilkan gambar sebesar 60% ukuran semula
e.Graphics.DrawImage( _
image, _


INDOPROG                                                                   26
Pemrograman GDI+ pada VB.NET                                           Hendra, S.T.


New Rectangle(10, 250, CInt(0.6 * width), CInt(0.6 * height)), _
0, _
0, _
width, _
height, _
GraphicsUnit.Pixel)

' Menggunakan interpolation kualitas menengah
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear

' Menampilkan gambar sebesar 60% ukuran semula
e.Graphics.DrawImage( _
image, _
New Rectangle(150, 250, CInt(0.6 * width), _
CInt(0.6 * height)), _
0, _
0, _
width, _
height, _
GraphicsUnit.Pixel)

' Menggunakan interpolation kualitas tinggi
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic

' Menampilkan gambar sebesar 60% ukuran semula
e.Graphics.DrawImage( _
  image, _
  New Rectangle(290, 250, CInt(0.6 * width), CInt(0.6 * height)), _
  0, _
  0, _
  width, _
  height, _
  GraphicsUnit.Pixel)




INDOPROG                                                                       27
Pemrograman GDI+ pada VB.NET                                           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                                                                       28
Pemrograman GDI+ pada VB.NET                                               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 system 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}




INDOPROG                                                                           29
Pemrograman GDI+ pada VB.NET                                                Hendra, S.T.


           {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



INDOPROG                                                                            30
Pemrograman GDI+ pada VB.NET                                             Hendra, S.T.


    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



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



INDOPROG                                                                         31
Pemrograman GDI+ pada VB.NET                                                     Hendra, S.T.


          case 5 : shapecolor = color.cyan
          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)


INDOPROG                                                                                 32
Pemrograman GDI+ pada VB.NET                                                  Hendra, S.T.




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 :




INDOPROG                                                                              33
Pemrograman GDI+ pada VB.NET                                                  Hendra, S.T.




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)




INDOPROG                                                                              34
Pemrograman GDI+ pada VB.NET                                                  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                                        '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



INDOPROG                                                                              35
Pemrograman GDI+ pada VB.NET                                                 Hendra, S.T.


            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


INDOPROG                                                                                36
Pemrograman GDI+ pada VB.NET                                                Hendra, S.T.


       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.




INDOPROG                                                                            37
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.




Class Tetris
Class ini merupakan class utama permainan Tetris


Variabel yang digunakan
    private   withevents gtimer as new system.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



INDOPROG                                                                           38
Pemrograman GDI+ pada VB.NET                                               Hendra, S.T.


       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



INDOPROG                                                                           39
Pemrograman GDI+ pada VB.NET                                              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                                                                          40
Pemrograman GDI+ pada VB.NET                                              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                                                                          41
Pemrograman GDI+ pada VB.NET                                                Hendra, S.T.


    '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




INDOPROG                                                                            42
Pemrograman GDI+ pada VB.NET                                    Hendra, S.T.



Program Kongkret
option explicit on
imports system
imports system.drawing
imports system.windows.forms
imports microsoft.visualbasic

public class tetris : inherits system.windows.forms.form

    <system.STAThread> _
    public shared sub main()
       randomize()
       application.run(new tetris)
    end sub

    private   withevents gtimer as new system.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



INDOPROG                                                                 43
Pemrograman GDI+ pada VB.NET                                   Hendra, S.T.


   '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


INDOPROG                                                               44
Pemrograman GDI+ pada VB.NET                               Hendra, S.T.


                       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


INDOPROG                                                           45
Pemrograman GDI+ pada VB.NET                                     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            '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


INDOPROG                                                                 46
Pemrograman GDI+ pada VB.NET                                       Hendra, S.T.


       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


INDOPROG                                                                   47
Pemrograman GDI+ pada VB.NET                                 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                                                              48
Pemrograman GDI+ pada VB.NET                                                    Hendra, S.T.


      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:system.dll /r:system.drawing.dll /r:system.windows.forms.dll




INDOPROG                                                                                49

Contenu connexe

Tendances

229334287 laporan-praktikum-dhani
229334287 laporan-praktikum-dhani229334287 laporan-praktikum-dhani
229334287 laporan-praktikum-dhaniDex Dun
 
Pcd 05 - transformasi citra
Pcd   05 - transformasi citraPcd   05 - transformasi citra
Pcd 05 - transformasi citraFebriyani Syafri
 
Kelompok 3 integrasi numerik fix
Kelompok 3 integrasi numerik fixKelompok 3 integrasi numerik fix
Kelompok 3 integrasi numerik fixliabika
 
cara menghitung Minterm dan maxterm aljabar boolean
cara menghitung Minterm dan maxterm aljabar booleancara menghitung Minterm dan maxterm aljabar boolean
cara menghitung Minterm dan maxterm aljabar booleanAwas Andreas
 
Bahasa Query Terapan
Bahasa Query TerapanBahasa Query Terapan
Bahasa Query TerapanSherly Uda
 
interkasi manusia dan komputer
interkasi manusia dan komputerinterkasi manusia dan komputer
interkasi manusia dan komputergapteek
 
4 Menggambar Grafik Fungsi Dengan Matlab
4 Menggambar Grafik Fungsi Dengan Matlab4 Menggambar Grafik Fungsi Dengan Matlab
4 Menggambar Grafik Fungsi Dengan MatlabSimon Patabang
 
Persamaan differensial part 1
Persamaan differensial part 1Persamaan differensial part 1
Persamaan differensial part 1Jamil Sirman
 
Transformasi Laplace (bag.1)
Transformasi Laplace (bag.1)Transformasi Laplace (bag.1)
Transformasi Laplace (bag.1)Heni Widayani
 
Gambar teknik standar kertas dan tata letak
Gambar teknik   standar kertas dan tata letakGambar teknik   standar kertas dan tata letak
Gambar teknik standar kertas dan tata letakMOSES HADUN
 
Pertemuan 2 - Digital Image Processing - Image Enhancement - Citra Digital
Pertemuan 2 - Digital Image Processing - Image Enhancement - Citra DigitalPertemuan 2 - Digital Image Processing - Image Enhancement - Citra Digital
Pertemuan 2 - Digital Image Processing - Image Enhancement - Citra Digitalahmad haidaroh
 

Tendances (20)

6 Frekuensi Sinyal
6  Frekuensi Sinyal6  Frekuensi Sinyal
6 Frekuensi Sinyal
 
229334287 laporan-praktikum-dhani
229334287 laporan-praktikum-dhani229334287 laporan-praktikum-dhani
229334287 laporan-praktikum-dhani
 
Fungsi (function)
Fungsi (function)Fungsi (function)
Fungsi (function)
 
Pcd 05 - transformasi citra
Pcd   05 - transformasi citraPcd   05 - transformasi citra
Pcd 05 - transformasi citra
 
Kelompok 3 integrasi numerik fix
Kelompok 3 integrasi numerik fixKelompok 3 integrasi numerik fix
Kelompok 3 integrasi numerik fix
 
cara menghitung Minterm dan maxterm aljabar boolean
cara menghitung Minterm dan maxterm aljabar booleancara menghitung Minterm dan maxterm aljabar boolean
cara menghitung Minterm dan maxterm aljabar boolean
 
Bahasa Query Terapan
Bahasa Query TerapanBahasa Query Terapan
Bahasa Query Terapan
 
interkasi manusia dan komputer
interkasi manusia dan komputerinterkasi manusia dan komputer
interkasi manusia dan komputer
 
4 Menggambar Grafik Fungsi Dengan Matlab
4 Menggambar Grafik Fungsi Dengan Matlab4 Menggambar Grafik Fungsi Dengan Matlab
4 Menggambar Grafik Fungsi Dengan Matlab
 
Morfologi Citra.pdf
Morfologi Citra.pdfMorfologi Citra.pdf
Morfologi Citra.pdf
 
Laporan tugas struktur data
Laporan tugas struktur dataLaporan tugas struktur data
Laporan tugas struktur data
 
Dasar desain grafis Fungsi dan Unsur Warna CMYK dan RGB
Dasar desain grafis Fungsi dan Unsur Warna CMYK dan RGBDasar desain grafis Fungsi dan Unsur Warna CMYK dan RGB
Dasar desain grafis Fungsi dan Unsur Warna CMYK dan RGB
 
3 pemrograman matlab
3 pemrograman matlab3 pemrograman matlab
3 pemrograman matlab
 
Persamaan differensial part 1
Persamaan differensial part 1Persamaan differensial part 1
Persamaan differensial part 1
 
Transformasi Laplace
Transformasi LaplaceTransformasi Laplace
Transformasi Laplace
 
Transformasi Laplace (bag.1)
Transformasi Laplace (bag.1)Transformasi Laplace (bag.1)
Transformasi Laplace (bag.1)
 
Transformasi Laplace
Transformasi LaplaceTransformasi Laplace
Transformasi Laplace
 
[PBO] Pertemuan 6 - Abstrak
[PBO] Pertemuan 6 - Abstrak[PBO] Pertemuan 6 - Abstrak
[PBO] Pertemuan 6 - Abstrak
 
Gambar teknik standar kertas dan tata letak
Gambar teknik   standar kertas dan tata letakGambar teknik   standar kertas dan tata letak
Gambar teknik standar kertas dan tata letak
 
Pertemuan 2 - Digital Image Processing - Image Enhancement - Citra Digital
Pertemuan 2 - Digital Image Processing - Image Enhancement - Citra DigitalPertemuan 2 - Digital Image Processing - Image Enhancement - Citra Digital
Pertemuan 2 - Digital Image Processing - Image Enhancement - Citra Digital
 

Similaire à untuk pada Dokumen Pemrograman GDI+ pada VB.NET

Modul PSB 6 J2ME LLUI
Modul PSB 6 J2ME LLUIModul PSB 6 J2ME LLUI
Modul PSB 6 J2ME LLUIRido Budiman
 
JENI-J2ME-Bab04-Low Level User Interface.pdf
JENI-J2ME-Bab04-Low Level User Interface.pdfJENI-J2ME-Bab04-Low Level User Interface.pdf
JENI-J2ME-Bab04-Low Level User Interface.pdfJurnal IT
 
Jeni slides j2 me-04 low level user interface-v 0.2
Jeni slides j2 me-04 low level user interface-v 0.2Jeni slides j2 me-04 low level user interface-v 0.2
Jeni slides j2 me-04 low level user interface-v 0.2UNIVERSITY Of LAMPUNG
 
Pengantar grafika1
Pengantar grafika1Pengantar grafika1
Pengantar grafika1Hanz Skyblue
 
dokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.ppt
dokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.pptdokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.ppt
dokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.pptYohanisWeni1
 
Laporan pratikum v mulmet
Laporan pratikum v mulmetLaporan pratikum v mulmet
Laporan pratikum v mulmetrahmi wahyuni
 
Modul psb 7 dan 8 J2ME LLUI
Modul psb 7 dan 8 J2ME LLUIModul psb 7 dan 8 J2ME LLUI
Modul psb 7 dan 8 J2ME LLUIRido Budiman
 
Grafika 130631100018 ainun_najib_modul1
Grafika 130631100018 ainun_najib_modul1Grafika 130631100018 ainun_najib_modul1
Grafika 130631100018 ainun_najib_modul1Ainun Najib
 
Penerapan metode drill dalam kecakapan bahasa asing
Penerapan metode drill dalam kecakapan bahasa asingPenerapan metode drill dalam kecakapan bahasa asing
Penerapan metode drill dalam kecakapan bahasa asingACHMADAINULYAQINAmru1
 
Membuat peta digital dengan quantum gis
Membuat peta digital dengan quantum gisMembuat peta digital dengan quantum gis
Membuat peta digital dengan quantum gisYusmadi Martias
 
Jeni j2 me-bab04-low level user interface
Jeni j2 me-bab04-low level user interfaceJeni j2 me-bab04-low level user interface
Jeni j2 me-bab04-low level user interfaceUNIVERSITY Of LAMPUNG
 
Jeni J2 Me Bab04 Low Level User Interface
Jeni J2 Me Bab04 Low Level User InterfaceJeni J2 Me Bab04 Low Level User Interface
Jeni J2 Me Bab04 Low Level User InterfaceIndividual Consultants
 
Program aplikasi grafis berbasis bitmap
Program aplikasi grafis berbasis bitmapProgram aplikasi grafis berbasis bitmap
Program aplikasi grafis berbasis bitmaprizkyrr
 
Modul Pembelajaran 01
Modul Pembelajaran 01Modul Pembelajaran 01
Modul Pembelajaran 01ssuser23b17c
 

Similaire à untuk pada Dokumen Pemrograman GDI+ pada VB.NET (20)

Modul PSB 6 J2ME LLUI
Modul PSB 6 J2ME LLUIModul PSB 6 J2ME LLUI
Modul PSB 6 J2ME LLUI
 
JENI-J2ME-Bab04-Low Level User Interface.pdf
JENI-J2ME-Bab04-Low Level User Interface.pdfJENI-J2ME-Bab04-Low Level User Interface.pdf
JENI-J2ME-Bab04-Low Level User Interface.pdf
 
Modul-AUTOCAD.pdf
Modul-AUTOCAD.pdfModul-AUTOCAD.pdf
Modul-AUTOCAD.pdf
 
Jeni slides j2 me-04 low level user interface-v 0.2
Jeni slides j2 me-04 low level user interface-v 0.2Jeni slides j2 me-04 low level user interface-v 0.2
Jeni slides j2 me-04 low level user interface-v 0.2
 
Tutorial Java netbeans
Tutorial Java netbeansTutorial Java netbeans
Tutorial Java netbeans
 
Pengantar grafika1
Pengantar grafika1Pengantar grafika1
Pengantar grafika1
 
dokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.ppt
dokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.pptdokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.ppt
dokumen.tips_bab-1-mengenal-corel-draw-sebagai-perangkat-lunak-desain-grafis.ppt
 
Laporan pratikum v mulmet
Laporan pratikum v mulmetLaporan pratikum v mulmet
Laporan pratikum v mulmet
 
Pert0
Pert0Pert0
Pert0
 
Modul psb 7 dan 8 J2ME LLUI
Modul psb 7 dan 8 J2ME LLUIModul psb 7 dan 8 J2ME LLUI
Modul psb 7 dan 8 J2ME LLUI
 
Komputer grafik 1
Komputer grafik 1Komputer grafik 1
Komputer grafik 1
 
Komputer grafik 1
Komputer grafik 1Komputer grafik 1
Komputer grafik 1
 
Grafika 130631100018 ainun_najib_modul1
Grafika 130631100018 ainun_najib_modul1Grafika 130631100018 ainun_najib_modul1
Grafika 130631100018 ainun_najib_modul1
 
Tugas tik ips2
Tugas tik ips2Tugas tik ips2
Tugas tik ips2
 
Penerapan metode drill dalam kecakapan bahasa asing
Penerapan metode drill dalam kecakapan bahasa asingPenerapan metode drill dalam kecakapan bahasa asing
Penerapan metode drill dalam kecakapan bahasa asing
 
Membuat peta digital dengan quantum gis
Membuat peta digital dengan quantum gisMembuat peta digital dengan quantum gis
Membuat peta digital dengan quantum gis
 
Jeni j2 me-bab04-low level user interface
Jeni j2 me-bab04-low level user interfaceJeni j2 me-bab04-low level user interface
Jeni j2 me-bab04-low level user interface
 
Jeni J2 Me Bab04 Low Level User Interface
Jeni J2 Me Bab04 Low Level User InterfaceJeni J2 Me Bab04 Low Level User Interface
Jeni J2 Me Bab04 Low Level User Interface
 
Program aplikasi grafis berbasis bitmap
Program aplikasi grafis berbasis bitmapProgram aplikasi grafis berbasis bitmap
Program aplikasi grafis berbasis bitmap
 
Modul Pembelajaran 01
Modul Pembelajaran 01Modul Pembelajaran 01
Modul Pembelajaran 01
 

Plus de Materi Kuliah Online

Pengenalan Rekayasa Perangkat Lunak
Pengenalan Rekayasa Perangkat LunakPengenalan Rekayasa Perangkat Lunak
Pengenalan Rekayasa Perangkat LunakMateri Kuliah Online
 
Melangkah dengan Microsoft Windows Server 2003
Melangkah dengan Microsoft Windows Server 2003Melangkah dengan Microsoft Windows Server 2003
Melangkah dengan Microsoft Windows Server 2003Materi Kuliah Online
 
Studi Mengenai Aspek Privasi pada Sistem RFID
Studi Mengenai Aspek Privasi pada Sistem RFIDStudi Mengenai Aspek Privasi pada Sistem RFID
Studi Mengenai Aspek Privasi pada Sistem RFIDMateri Kuliah Online
 
Internet dan Layanan Aplikasi Terdistribusi
Internet dan Layanan Aplikasi TerdistribusiInternet dan Layanan Aplikasi Terdistribusi
Internet dan Layanan Aplikasi TerdistribusiMateri Kuliah Online
 
Aspek Security pada Penerapan m-Commerce di Indonesia
Aspek Security pada Penerapan m-Commerce di IndonesiaAspek Security pada Penerapan m-Commerce di Indonesia
Aspek Security pada Penerapan m-Commerce di IndonesiaMateri Kuliah Online
 
A Comparison of Proximity Authentication Approaches
A Comparison of Proximity Authentication ApproachesA Comparison of Proximity Authentication Approaches
A Comparison of Proximity Authentication ApproachesMateri Kuliah Online
 
Kajian Perkembangan Teknologi Smart Card dari Segi Keamanan
Kajian Perkembangan Teknologi Smart Card dari Segi KeamananKajian Perkembangan Teknologi Smart Card dari Segi Keamanan
Kajian Perkembangan Teknologi Smart Card dari Segi KeamananMateri Kuliah Online
 
Catu Daya dan Rangkaian Penyearah Gelombang
Catu Daya dan Rangkaian Penyearah GelombangCatu Daya dan Rangkaian Penyearah Gelombang
Catu Daya dan Rangkaian Penyearah GelombangMateri Kuliah Online
 
Simulasi Anti Integral Windup dengan Clamp Integrator
Simulasi Anti Integral Windup dengan Clamp IntegratorSimulasi Anti Integral Windup dengan Clamp Integrator
Simulasi Anti Integral Windup dengan Clamp IntegratorMateri Kuliah Online
 
Prinsip-prinsip Asas E-Construction, K-Constructions dan Groupware Technology
Prinsip-prinsip Asas E-Construction, K-Constructions dan Groupware TechnologyPrinsip-prinsip Asas E-Construction, K-Constructions dan Groupware Technology
Prinsip-prinsip Asas E-Construction, K-Constructions dan Groupware TechnologyMateri Kuliah Online
 
Penggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan Telepon
Penggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan TeleponPenggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan Telepon
Penggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan TeleponMateri Kuliah Online
 
Penggunaan DT-Basic Untuk Membaca Nomor Identitas Secara Wireless
Penggunaan DT-Basic Untuk Membaca Nomor Identitas Secara WirelessPenggunaan DT-Basic Untuk Membaca Nomor Identitas Secara Wireless
Penggunaan DT-Basic Untuk Membaca Nomor Identitas Secara WirelessMateri Kuliah Online
 

Plus de Materi Kuliah Online (20)

Sekilas tentang HaKI
Sekilas tentang HaKISekilas tentang HaKI
Sekilas tentang HaKI
 
Pengenalan Rekayasa Perangkat Lunak
Pengenalan Rekayasa Perangkat LunakPengenalan Rekayasa Perangkat Lunak
Pengenalan Rekayasa Perangkat Lunak
 
Pemodelan Basis Data Lainnya
Pemodelan Basis Data LainnyaPemodelan Basis Data Lainnya
Pemodelan Basis Data Lainnya
 
Arsitektur Sistem Basis Data
Arsitektur Sistem Basis DataArsitektur Sistem Basis Data
Arsitektur Sistem Basis Data
 
Access control-systems
Access control-systemsAccess control-systems
Access control-systems
 
Melangkah dengan Microsoft Windows Server 2003
Melangkah dengan Microsoft Windows Server 2003Melangkah dengan Microsoft Windows Server 2003
Melangkah dengan Microsoft Windows Server 2003
 
Studi Mengenai Aspek Privasi pada Sistem RFID
Studi Mengenai Aspek Privasi pada Sistem RFIDStudi Mengenai Aspek Privasi pada Sistem RFID
Studi Mengenai Aspek Privasi pada Sistem RFID
 
Remote control alarm sepeda motor
Remote control alarm sepeda motorRemote control alarm sepeda motor
Remote control alarm sepeda motor
 
Internet dan Layanan Aplikasi Terdistribusi
Internet dan Layanan Aplikasi TerdistribusiInternet dan Layanan Aplikasi Terdistribusi
Internet dan Layanan Aplikasi Terdistribusi
 
Aspek Security pada Penerapan m-Commerce di Indonesia
Aspek Security pada Penerapan m-Commerce di IndonesiaAspek Security pada Penerapan m-Commerce di Indonesia
Aspek Security pada Penerapan m-Commerce di Indonesia
 
A Comparison of Proximity Authentication Approaches
A Comparison of Proximity Authentication ApproachesA Comparison of Proximity Authentication Approaches
A Comparison of Proximity Authentication Approaches
 
Kajian Perkembangan Teknologi Smart Card dari Segi Keamanan
Kajian Perkembangan Teknologi Smart Card dari Segi KeamananKajian Perkembangan Teknologi Smart Card dari Segi Keamanan
Kajian Perkembangan Teknologi Smart Card dari Segi Keamanan
 
Catu Daya dan Rangkaian Penyearah Gelombang
Catu Daya dan Rangkaian Penyearah GelombangCatu Daya dan Rangkaian Penyearah Gelombang
Catu Daya dan Rangkaian Penyearah Gelombang
 
Dioda dan Catu Daya
Dioda dan Catu DayaDioda dan Catu Daya
Dioda dan Catu Daya
 
Simulasi Anti Integral Windup dengan Clamp Integrator
Simulasi Anti Integral Windup dengan Clamp IntegratorSimulasi Anti Integral Windup dengan Clamp Integrator
Simulasi Anti Integral Windup dengan Clamp Integrator
 
Radio Frequency Identification
Radio Frequency IdentificationRadio Frequency Identification
Radio Frequency Identification
 
Prinsip-prinsip Asas E-Construction, K-Constructions dan Groupware Technology
Prinsip-prinsip Asas E-Construction, K-Constructions dan Groupware TechnologyPrinsip-prinsip Asas E-Construction, K-Constructions dan Groupware Technology
Prinsip-prinsip Asas E-Construction, K-Constructions dan Groupware Technology
 
Penggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan Telepon
Penggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan TeleponPenggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan Telepon
Penggunaan DT-51 Untuk Komunikasi Mikrokontroler Melalui Jaringan Telepon
 
Penggunaan DT-Basic Untuk Membaca Nomor Identitas Secara Wireless
Penggunaan DT-Basic Untuk Membaca Nomor Identitas Secara WirelessPenggunaan DT-Basic Untuk Membaca Nomor Identitas Secara Wireless
Penggunaan DT-Basic Untuk Membaca Nomor Identitas Secara Wireless
 
Interfacing Number Display
Interfacing Number DisplayInterfacing Number Display
Interfacing Number Display
 

untuk pada Dokumen Pemrograman GDI+ pada VB.NET

  • 1. Pemrograman GDI+ pada VB.NET Hendra, S.T. Pemrograman GDI+ pada VB.Net Oleh : Hendra, ST. Buku ini membahas tentang pengolahan grafik pada VB.NET, dan ditujukan kepada siapa saja yang serius untuk mempelajari pemrogrman grafik dengan GDI+ secara koding (tanpa menggunakan fasilitas designer pada Visual Studio .NET). Bagi anda yang belum mengenal bahasa pemrograman VB.NET sebaiknya memulai proses belajar dengan buku Bahasa Pemrograman VB.NET dan Pemrogram Form pada VB.NET 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. Pada akhir tutorial ini, penulisa memberikan contoh pemrograman GDI+ yang diaplikasikan pada pemrograman games Tetris. INDOPROG 1
  • 2. Pemrograman GDI+ pada VB.NET Hendra, S.T. Pemrograman Grafik pada VB.NET Untuk pemrograman Grafik di VB.NET kita membutuhkan GDI+ (Graphic Device Interface) yang merupakan bagian dari system operasi XP. GDI+ yang memiliki kemampuan untuk mengolah grafik vector dua dimensi (garis), imaging (bitmap) dan typography (font) pada Layar maupun Printer. Dengan GDI, programmer tidak perlu mengetahui detail dari masing-masing peralatan untuk menampilkan grafik diatasnya, tetapi cukup menggunakan fasilitas yang telah disediakan oleh GDI+ class. Catatan : Pada pemrograman tradisional, menggambar garis ke layar akan sangat berbeda dengan menggambar garis ke printer. System Koordinat pada GDI+ GDI+ menggunakan system koordinat dilayar x,y mulai dari 0,0. Dan pada layar computer, koordinat tersebut, merupakan pixel pada layar. Misalnya kita menggambar sebuah garis mulai dari koordinat 4,2 sampai 12, 8, maka tampilan dilayar adalah sebagai berikut : INDOPROG 2
  • 3. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar Garis pada Form Pengambaran Graphics diatas form dapat dilakukan melalui Objek Graphics yang dapat dideklarasikan sebagai berikut : Dim MyGraphics As System.Drawing.Graphics = Me.CreateGraphics Objek Graphics menyediakan berbagai metode untuk menggambar seperti DrawLine, DrawRectangle, dll Dalam pengembaran, kita membutuhkan Objek Pen menyediakan atribut seperti Warna dan Ketebalan garis dalam ukuran pixel. Objek Pen dapat dideklarasikan sebagai berikut : Dim Pen As New System.Drawing.Pen(Warna,Tebal) Dimana Warna adalah warna yang diinginkan, dan Tebal adalah tebal pen dalam ukuran point. Contoh program GDI+ anda yang pertama : Option Explicit On Imports System Imports System.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form <System.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub New() 'Constructor Me.Text = "Mengambar garis pada Form" End Sub Private Sub MyForm_Click(Sender As Object, e As System.EventArgs) _ INDOPROG 3
  • 4. Pemrograman GDI+ pada VB.NET Hendra, S.T. Handles MyBase.Click Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3) Dim MyGraphic As System.Drawing.Graphics = Me.CreateGraphics MyGraphic.DrawLine(MyPen,10,10,200,100) End Sub End Class Kemudian simpan program diatas dengan mana grafik.vb Proses kompilasi Proses kompilasi dengan menggunakan perintah : Vbc grafik.vb /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll Dan ketika anda jalankan, dan klik pada form akan menghasilkan tampilan : Catatan : Mengenai pemrogram form pada VB.NET dapat anda baca di ebook pemrogram form pada VB.NET Salah satu kelemahan dari cara diatas adalah, kalau form mengalami refresh, maka garis yang telah digambarkan tersebut akan hilang (VB.NET tidak menyediakan property AutoRedraw seperti yang terdapat pada VB6) Untuk membuktikannya coba anda minimize dan maximize kembali form diatas, maka garis tersebut akan hilang. INDOPROG 4
  • 5. Pemrograman GDI+ pada VB.NET Hendra, S.T. Melakukan overriding terhadap Metoda OnPaint OnPaint Event Handle adalah event yang akan dibangkitkan setiap kali form mengalami refresh (pada saat minimize, maximize maupun ditimpa oleh form lain), jadi jika kita melakukan overriding terhadap Event ini dan menempatkan perintah pengambaran garis didalamnya ini, maka garis tersebut akan digambar setiap proses refresh. Parameter PaintEventArgs pada Sub OnPaint merupakan objek Graphics, sehingga kita tidak perlu melakukan Me.CreateGraphics. Contoh : Option Explicit On Imports System Imports System.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm Inherits Form <System.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub New() 'Constructor Me.Text = "Membuat garis pada Form dengan OnPaint" End Sub Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3) MyBase.OnPaint(e) e.Graphics.DrawLine(MyPen,10,10,200,100) End Sub End Class Kalau program diatas dijalankan, maka akan menampilkan garis pada form, dan tetap akan ada walaupun form direfresh. Catatan : Pada contoh diatas kita melakukan overriding terhadap metoda OnPaint yang ada pada Base class dengan Metoda baru yang kita buat dimana didalamnya akan mengambarkan garis, sehingga setiap kejadian OnPaint akan menjalankan Event baru tersebut. Kemudian dalam koding kita menulis MyBase.OnPaint(e), yang artinya kita menjalan kembali event OnPaint pada Base class yang telah kita overriding. INDOPROG 5
  • 6. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar grafik vector 2 dimensi Grafik vector merupakan kemampuan menggambar bentuk-bentuk tradisional seperti garis, kurva dan bentuk berdasarkan sekumpulan titik tertentu. Untuk pengambaran grafik vector kita dapat menggunakan objek Pen dan Brush, dimana objek Pen untuk pengambaran bentuk garis, dan Brush untuk objek isian. Mengambar garis dengan Pen Perintah DrawLine(pen, x1,y1, x2,y2) digunakan untuk menggambar garis dari koordinat awal (x1,y1) ke koordinat akhir (x2,y2). Contoh : Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3) e.Graphics.DrawLine(MyPen,10,10,200,100) Akan menghasilkan Mengambar persegi dengan Pen Kita dapat menggunakan metoda DrawRectangle(Pen, x,y,lebar,tinggi) pada objek grafik untuk mengambar persegi pada koordinat x,y dengan lebar dan tinggi tertentu. Contoh : INDOPROG 6
  • 7. Pemrograman GDI+ pada VB.NET Hendra, S.T. e.Graphics.DrawRectangle(MyPen,10,10,200,100) Akan menghasilkan : Mengambar Ellipse pada Form dengan Pen Kita dapat menggunakan metoda DrawEllipse(Pen,x,y,lebar,tinggi) pada objek grafik untuk mengambar ellipse pada koordinat x,y dengan ukuran lebar dan tinggi tertentu : Contoh : e.Graphics.DrawEllipse(MyPen,10,10,200,100) Akan menghasilkan : INDOPROG 7
  • 8. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar Arc pada Form dengan Pen Kita dapat menggunakan metoda DrawArc(Pen,x,y,lebar,tinggi,sudutawal,sudutakhir) untuk mengambar arcus, adapun perbedaan antara Ellipse dengan Arc adalah, kalau ellipse adalah gambar kurva tertutup, sedangkan Arc ditentukan oleh sudut awal dan akhir pengambaran kurva. Contoh : e.Graphics.DrawArc(MyPen,10,10,200,100,0,270) Akan menghasilkan : INDOPROG 8
  • 9. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar Pie pada Form dengan Pen Kalau Arc adalah kurva dengan sudut awal dan akhir, demikian juga pie, bedanya adalah pie merupakan kurva tertutup. Untuk menggambar pie dapat digunakan metoda DrawEllipse(Pen,x,y,lebar,tinggi). Contoh : e.Graphics.DrawPie(MyPen,10,10,200,100,0,90) Akan menghasilkan : Menggunakan structure Point Kita juga dapat menggunakan structure point untuk penentuan koordinat (x,y) awal dan akhir pada perintah DrawLine(pen, point1, point2). Catatan : DrawLine(pen, point1, point2) merupakan metode overloading terhadap DrawLine(pen, x1,y1,x2,y2) Contoh : Dim Point1 As New System.Drawing.Point(10,10) Dim Point2 As New System.Drawing.Point(200,100) e.Graphics.DrawLine(MyPen,Point1,Point2) INDOPROG 9
  • 10. Pemrograman GDI+ pada VB.NET Hendra, S.T. yang kalau dijalankan akan menghasilkan garis yang sama dengan perintah : e.Graphics.DrawLine(MyPen,10,10,200,100) Akan menghasilkan : Menggambar poligon dengan array dari point DrawPolygons(Pen,PointArray) merupakan kurva tertutup yang dibentuk oleh garis-garis, untuk menggambar poligon anda perlu menyediakan array yang berisi koordinat (x,y) dari sudut-sudut polygon. Contoh : Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyArr As System.Drawing.Point() = _ {new System.Drawing.Point(0,0), _ new System.Drawing.Point(250,130), _ new System.Drawing.Point(190,160)} e.Graphics.DrawPolygon(MyPen,MyArr) Akan menghasilkan : INDOPROG 10
  • 11. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggambar cardinal splines dengan array dari point Jika polygon merupakan kurva tertutup yang dihubungan oleh garis lurus pada setiap koordinat (x,y) sudutnya, maka DrawCurve(Pen, PointArray, Tangen) merupakan kurva terbuka yang dibentuk dengan garis lengkung yang memiliki nilai tangent tertentu, berikut ini adalah contoh gambar cardinal splines yang memiliki tiga titik dengan nilai tangent yang berbeda (0, 1, 1.5, dan 2). Contoh : Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyArr As System.Drawing.Point() = _ {new System.Drawing.Point(0,0), _ new System.Drawing.Point(250,130), _ new System.Drawing.Point(190,160)} e.Graphics.DrawCurve(MyPen,MyArr,1.5F) Akan menghasilkan : INDOPROG 11
  • 12. Pemrograman GDI+ pada VB.NET Hendra, S.T. Kemudian kita dapat juga menggunakan DrawClosedCurve(pen, PointArray) untuk menghasilkan kurva tertutup. Contoh : Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyArr As System.Drawing.Point() = _ {new System.Drawing.Point(0,0), _ new System.Drawing.Point(250,130), _ new System.Drawing.Point(190,160)} e.Graphics.DrawClosedCurve(MyPen,MyArr) Akan menghasilkan : INDOPROG 12
  • 13. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggambar Bezier splines dengan array dari point DrawBezier(pen, x1, y1, x2, y2, x3, y3, x4, y4) merupakan kurva dengan dari koordinat (x1,y1) awal ke koordinat (x2,y2), dengan dua koordinat control (x3,y3) dan (x4,y4). Pada gambar diatas p1 awal koordinat awal, p2 adalah koordinat akhir, dan c1, c2 adalah koordinat control Bezier. Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) e.Graphics.DrawBezier(MyPen,0,0,200,200,70,50, 150, 40) INDOPROG 13
  • 14. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggunakan Path Path dibentuk oleh kombinasi dari berbagai bentuk seperti : • Lines • Rectangles • Ellipses • Arcs • Polygons • Cardinal splines • Bézier splines Dengan perintah AddLine, AddRectangle, AddEllipse, AddArc, AddPolygon, AddCurve, dan AddBezier. Contoh : Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyPath As New System.Drawing.Drawing2D.GraphicsPath() MyPath.AddLine(0,0,65,20) MyPath.AddEllipse(30,20,100,50) MyPath.AddLine(130,45,200,50) INDOPROG 14
  • 15. Pemrograman GDI+ pada VB.NET Hendra, S.T. e.Graphics.DrawPath(MyPen,MyPath) Akan menghasilkan : Menggunakan structure rectangle Sebagaimana dengan structure point, kita dapat juga menggunakan struktur rectangle untuk mengambar bentuk yang membutuhkan koordinat x,y dan ukuran lebar, tinggi, misalnya DrawRectangle(pen, rectangle), DrawArc(Pen,x,y,rectangle,sudutakhir), DrawEllipse(Pen,rectangle), DrawEllipse(Pen,rectangle), Contoh : Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.DrawRectangle(MyPen,Rect) yang hasilnya akan sama dengan : e.Graphics.DrawRectangle(MyPen,10,10,200,100) INDOPROG 15
  • 16. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar objek isian pada Form dengan Brush Kalau kita mengambar bentuk dengan Pen, maka hasilnya tidak disertai dengan isian, sedangkan untuk menghasilkan gambar dengan isian kita membutuhkan Brush. Menggunakan SolidBrush SolidBrush(warna) dapat digunakan untuk menggambarkan objek isian seperti FillRectangle(brush, rectangle), FillEllipse(brush, rectangle), FillPie(brush, rectangle, sudutawal, sudutakhir), dengan warna yang ditentukan pada brush. Contoh : Dim MyBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.FillRectangle(MyBrush,Rect) Yang kalau dijalankan akan menghasilkan suatu persegi yang diisi dengan warna merah penuh. INDOPROG 16
  • 17. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggunakan HatchBrush HatchBrush(pola, warnagaris, warnalatarbelakang), dapat digunakan untuk menggambar objek isian dengan pola isian tertentu seperti : • HatchStyle.Horizontal • HatchStyle.Vertical • HatchStyle.ForwardDiagonal • HatchStyle.HatchStyleBackwardDiagonal • HatchStyle.HatchStyleCross • HatchStyle.HatchStyleDiagonalCross HatchBrush terdefinisi pada namespace System.Drawing.Drawing2D Contoh : Dim MyBrush As New _ System.Drawing.Drawing2D.HatchBrush(_ System.Drawing.Drawing2D.HatchStyle.Horizontal, _ System.Drawing.Color.Red, _ System.Drawing.Color.White) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.FillRectangle(MyBrush,Rect) INDOPROG 17
  • 18. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggunakan TextureBrush TextureBrush(gambar), dapat digunakan untuk mengambarkan objek isian yang diisi dengan gambar tertentu . Contoh : Dim MyImage As New System.Drawing.Bitmap("c:windowsgreenstone.bmp") Dim MyBrush As New System.Drawing.TextureBrush(MyImage) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.FillRectangle(MyBrush,Rect) INDOPROG 18
  • 19. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggunakan GradientBrush GradientBrush digunakan untuk warna isian yang sifatnya gradual LinearGradientBrush LinierGradientBrush(Point1,Point2,warna1,warna2) akan membuat warna gradient mulai dari Point1 ke Point2 secara gradual dari warna1 ke warna2 LinearGradientBrush terdefinisi pada namespace System.Drawing.Drawing2D Contoh : Dim Point1 As New System.Drawing.Point(10,10) Dim Point2 As New System.Drawing.Point(100,10) Dim MyBrush As New _ System.Drawing.Drawing2D.LinearGradientBrush(Point1,Point2, _ System.Drawing.Color.FromArgb(255,0,0), _ System.Drawing.Color.FromArgb(0,0,255)) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.FillRectangle(MyBrush,Rect) INDOPROG 19
  • 20. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menggunakan GammaCorrection Contoh : Dim Point1 As New System.Drawing.Point(10,10) Dim Point2 As New System.Drawing.Point(100,10) Dim MyBrush As New _ System.Drawing.Drawing2D.LinearGradientBrush(Point1,Point2, _ System.Drawing.Color.FromArgb(255,0,0), _ System.Drawing.Color.FromArgb(0,0,255)) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) MyBrush.GammaCorrection = True e.Graphics.FillRectangle(MyBrush,Rect) Bandingkan dengan hasil sebelumnya yang tidak menggunakan gamma correction. INDOPROG 20
  • 21. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar tulisan pada Form dengan DrawString Untuk menampilkan tulisan kita dapat menggunakan DrawString(tulisan, font, brush, pointF). Contoh : Dim Fontname As New System.Drawing.FontFamily("Times New Roman") Dim MyFont As New System.Drawing.Font(FontName, 24, _ System.Drawing.FontStyle.Regular, _ System.Drawing.GraphicsUnit.Pixel) Dim MyBrush As New ystem.Drawing.SolidBrush(System.Drawing.Color.Black) Dim MyPoint As New System.Drawing.PointF(10.0,10.0) e.Graphics.DrawString("Hello World !",MyFont,MyBrush,MyPoint) Catatan : PointF adalah point dalam type Float INDOPROG 21
  • 22. Pemrograman GDI+ pada VB.NET Hendra, S.T. Mengambar garis dengan texture Untuk mengambar garis dengan texture, kita membutuhkan pen yang menggunakan TextureBrush. Contoh : Dim MyImage As New System.Drawing.Bitmap("c:windowsgreenstone.bmp") Dim MyBrush As New System.Drawing.TextureBrush(MyImage) Dim MyPen As New System.Drawing.Pen(MyBrush, 10) e.Graphics.DrawLine(MyPen,10,10,200,100) INDOPROG 22
  • 23. Pemrograman GDI+ pada VB.NET Hendra, S.T. Menampilkan gambar Jika pada bagian sebelumnya kita telah membahas pembuatan grafik vector dengan GDI+, maka pada bagian ini kita akan melihat bagaimana mengolah gambar. Memuat dan menampilkan Untuk memuat dan menampilkan gambar dari file ke layer, anda membutuhkan objek Bitmap dan objek Graphics. Class Bitmap mendukung beberapa format seperti BMP, GIF, JPEG, PNG dan TIFF. Contoh : Dim bitmap As New Bitmap("Grapes.jpg") e.Graphics.DrawImage(bitmap, 60, 10) Memuat dan menampilkan dengan ukuran lain Untuk menampilkan gambar dengan ukuran yang berbeda dengan ukuran sebenarnya, kita harus menyediakan dua Rectangle, yaitu Rectangle Asal (crop terhadap gambar sebenarnya), dan Rectangle Tujuan (yang berisi koordinat dan ukuran yang diinginkan), contoh : Dim image = New Bitmap("Apple.gif") ' menggambar bitmap di posisi (0, 0). e.Graphics.DrawImage(image, 0, 0) ' membuat Rectangle tujuan di koordinat (150,20), dan ' tinggi dan lebar diset 130% dari ukuran gambar semula Dim width As Integer = image.Width Dim height As Integer = image.Height Dim destinationRect As New RectangleF( _ INDOPROG 23
  • 24. Pemrograman GDI+ pada VB.NET Hendra, S.T. 150, _ 20, _ 1.3F * width, _ 1.3F * height) ' Membuat rectangle asal gambar dengan menggambil 75% gambar Dim sourceRect As New RectangleF(0, 0, 0.75F * width, 0.75F * height) e.Graphics.DrawImage( _ image, _ destinationRect, _ sourceRect, _ GraphicsUnit.Pixel) Melakukan rotasi terhadap gambar Untuk melakukan rotasi terhadap gambar kita membutuhkan tiga koordinat yaitu Titik asal Titik tujuan Kiri atas (0, 0) (200, 20) Kanan atas (100, 0) (110, 100) Kiri bawah (0, 50) (250, 30) INDOPROG 24
  • 25. Pemrograman GDI+ pada VB.NET Hendra, S.T. Sehingga dalam program Visual Basic ditulis sebagai : 'Membuat array yang berisi ketiga titik tujuan Dim destinationPoints As Point() = { _ New Point(200, 20), _ New Point(110, 100), _ New Point(250, 30)} ‘Memuat file Stripes.bmp Dim image = New Bitmap("Stripes.bmp") ' Tampilkan gambar dikoordinat 0,0 e.Graphics.DrawImage(image, 0, 0) ' Tampilkan gambar sekali lagi berdasarkan titik tujuan e.Graphics.DrawImage(image, destinationPoints) Menggunakan interpolation pada saat mengubah ukuran gambar Pemakaian interpolation akan menentukan kualitas gambar hasil pembesaran ataupun pengecilan. Perhatikan kualitas gambar berikut yang masing-masing menggunakan interpolation yang berbeda. INDOPROG 25
  • 26. Pemrograman GDI+ pada VB.NET Hendra, S.T. Dengan koding berikut : Dim image = New Bitmap("GrapeBunch.bmp") Dim width As Integer = image.Width Dim height As Integer = image.Height 'Menampilkan gambar apa adanya pada koordinat 0,0 e.Graphics.DrawImage( _ image, _ New Rectangle(10, 10, width, height), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel, _ Nothing) ' Mengunakan interpolation kualitas rendah e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor ' Menampilkan gambar sebesar 60% ukuran semula e.Graphics.DrawImage( _ image, _ INDOPROG 26
  • 27. Pemrograman GDI+ pada VB.NET Hendra, S.T. New Rectangle(10, 250, CInt(0.6 * width), CInt(0.6 * height)), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel) ' Menggunakan interpolation kualitas menengah e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear ' Menampilkan gambar sebesar 60% ukuran semula e.Graphics.DrawImage( _ image, _ New Rectangle(150, 250, CInt(0.6 * width), _ CInt(0.6 * height)), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel) ' Menggunakan interpolation kualitas tinggi e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic ' Menampilkan gambar sebesar 60% ukuran semula e.Graphics.DrawImage( _ image, _ New Rectangle(290, 250, CInt(0.6 * width), CInt(0.6 * height)), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel) INDOPROG 27
  • 28. Pemrograman GDI+ pada VB.NET 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 28
  • 29. Pemrograman GDI+ pada VB.NET 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 system 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} INDOPROG 29
  • 30. Pemrograman GDI+ pada VB.NET Hendra, S.T. {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 INDOPROG 30
  • 31. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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 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 INDOPROG 31
  • 32. Pemrograman GDI+ pada VB.NET Hendra, S.T. case 5 : shapecolor = color.cyan 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) INDOPROG 32
  • 33. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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 : INDOPROG 33
  • 34. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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) INDOPROG 34
  • 35. Pemrograman GDI+ pada VB.NET 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 '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 INDOPROG 35
  • 36. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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 INDOPROG 36
  • 37. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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. INDOPROG 37
  • 38. Pemrograman GDI+ pada VB.NET Hendra, S.T. Class Tetris Class ini merupakan class utama permainan Tetris Variabel yang digunakan private withevents gtimer as new system.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 INDOPROG 38
  • 39. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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 INDOPROG 39
  • 40. Pemrograman GDI+ pada VB.NET 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 40
  • 41. Pemrograman GDI+ pada VB.NET 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 41
  • 42. Pemrograman GDI+ pada VB.NET Hendra, S.T. '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 INDOPROG 42
  • 43. Pemrograman GDI+ pada VB.NET Hendra, S.T. Program Kongkret option explicit on imports system imports system.drawing imports system.windows.forms imports microsoft.visualbasic public class tetris : inherits system.windows.forms.form <system.STAThread> _ public shared sub main() randomize() application.run(new tetris) end sub private withevents gtimer as new system.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 INDOPROG 43
  • 44. Pemrograman GDI+ pada VB.NET Hendra, S.T. '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 INDOPROG 44
  • 45. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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 INDOPROG 45
  • 46. Pemrograman GDI+ pada VB.NET 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 '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 INDOPROG 46
  • 47. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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 INDOPROG 47
  • 48. Pemrograman GDI+ pada VB.NET 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 48
  • 49. Pemrograman GDI+ pada VB.NET Hendra, S.T. 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:system.dll /r:system.drawing.dll /r:system.windows.forms.dll INDOPROG 49