Your SlideShare is downloading. ×
Pemrogaman Visual Basic.NET (Modul 3)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Pemrogaman Visual Basic.NET (Modul 3)

1,300
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,300
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
235
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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.NETUntuk 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 untukmenampilkan grafik diatasnya, tetapi cukup menggunakan fasilitas yang telah disediakan olehGDI+ class.Catatan :Pada pemrograman tradisional, menggambar garis ke layar akan sangat berbeda denganmenggambar 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 tampilandilayar adalah sebagai berikut :INDOPROG 2
  • 3. Pemrograman GDI+ pada VB.NET Hendra, S.T.Mengambar Garis pada FormPengambaran Graphics diatas form dapat dilakukan melalui Objek Graphics yang dapatdideklarasikan sebagai berikut :Dim MyGraphics As System.Drawing.Graphics = Me.CreateGraphicsObjek Graphics menyediakan berbagai metode untuk menggambar seperti DrawLine,DrawRectangle, dllDalam pengembaran, kita membutuhkan Objek Pen menyediakan atribut seperti Warna danKetebalan 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 OnImports SystemImports System.Windows.FormsImports Microsoft.VisualBasicPublic 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 SubEnd ClassKemudian simpan program diatas dengan mana grafik.vbProses kompilasiProses kompilasi dengan menggunakan perintah :Vbc grafik.vb /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dllDan ketika anda jalankan, dan klik pada form akan menghasilkan tampilan :Catatan :Mengenai pemrogram form pada VB.NET dapat anda baca di ebook pemrogram formpada VB.NETSalah satu kelemahan dari cara diatas adalah, kalau form mengalami refresh, maka garisyang telah digambarkan tersebut akan hilang (VB.NET tidak menyediakan propertyAutoRedraw seperti yang terdapat pada VB6)Untuk membuktikannya coba anda minimize dan maximize kembali form diatas, makagaris tersebut akan hilang.INDOPROG 4
  • 5. Pemrograman GDI+ pada VB.NET Hendra, S.T.Melakukan overriding terhadap Metoda OnPaintOnPaint Event Handle adalah event yang akan dibangkitkan setiap kali form mengalami refresh(pada saat minimize, maximize maupun ditimpa oleh form lain), jadi jika kita melakukanoverriding 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 tidakperlu melakukan Me.CreateGraphics.Contoh :Option Explicit OnImports SystemImports System.Windows.FormsImports Microsoft.VisualBasicPublic 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 SubEnd ClassKalau program diatas dijalankan, maka akan menampilkan garis pada form, dan tetap akan adawalaupun form direfresh.Catatan :Pada contoh diatas kita melakukan overriding terhadap metoda OnPaint yang ada padaBase class dengan Metoda baru yang kita buat dimana didalamnya akan mengambarkangaris, sehingga setiap kejadian OnPaint akan menjalankan Event baru tersebut.Kemudian dalam koding kita menulis MyBase.OnPaint(e), yang artinya kita menjalankembali event OnPaint pada Base class yang telah kita overriding.INDOPROG 5
  • 6. Pemrograman GDI+ pada VB.NET Hendra, S.T.Mengambar grafik vector 2 dimensiGrafik 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 objekPen untuk pengambaran bentuk garis, dan Brush untuk objek isian.Mengambar garis dengan PenPerintah 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 menghasilkanMengambar persegi dengan PenKita dapat menggunakan metoda DrawRectangle(Pen, x,y,lebar,tinggi) pada objek grafik untukmengambar 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 PenKita dapat menggunakan metoda DrawEllipse(Pen,x,y,lebar,tinggi) pada objek grafik untukmengambar 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 PenKita dapat menggunakan metoda DrawArc(Pen,x,y,lebar,tinggi,sudutawal,sudutakhir) untukmengambar arcus, adapun perbedaan antara Ellipse dengan Arc adalah, kalau ellipse adalahgambar 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 PenKalau Arc adalah kurva dengan sudut awal dan akhir, demikian juga pie, bedanya adalah piemerupakan kurva tertutup. Untuk menggambar pie dapat digunakan metodaDrawEllipse(Pen,x,y,lebar,tinggi).Contoh :e.Graphics.DrawPie(MyPen,10,10,200,100,0,90)Akan menghasilkan :Menggunakan structure PointKita juga dapat menggunakan structure point untuk penentuan koordinat (x,y) awal dan akhirpada 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 pointDrawPolygons(Pen,PointArray) merupakan kurva tertutup yang dibentuk oleh garis-garis, untukmenggambar poligon anda perlu menyediakan array yang berisi koordinat (x,y) dari sudut-sudutpolygon.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 pointJika polygon merupakan kurva tertutup yang dihubungan oleh garis lurus pada setiap koordinat(x,y) sudutnya, maka DrawCurve(Pen, PointArray, Tangen) merupakan kurva terbuka yangdibentuk dengan garis lengkung yang memiliki nilai tangent tertentu, berikut ini adalah contohgambar cardinal splines yang memiliki tiga titik dengan nilai tangent yang berbeda (0, 1, 1.5, dan2).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) untukmenghasilkan 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 pointDrawBezier(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 adalahkoordinat 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 PathPath dibentuk oleh kombinasi dari berbagai bentuk seperti : • Lines • Rectangles • Ellipses • Arcs • Polygons • Cardinal splines • Bézier splinesDengan perintah AddLine, AddRectangle, AddEllipse, AddArc, AddPolygon, AddCurve, danAddBezier.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 rectangleSebagaimana dengan structure point, kita dapat juga menggunakan struktur rectangle untukmengambar bentuk yang membutuhkan koordinat x,y dan ukuran lebar, tinggi, misalnyaDrawRectangle(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 BrushKalau kita mengambar bentuk dengan Pen, maka hasilnya tidak disertai dengan isian, sedangkanuntuk menghasilkan gambar dengan isian kita membutuhkan Brush.Menggunakan SolidBrushSolidBrush(warna) dapat digunakan untuk menggambarkan objek isian sepertiFillRectangle(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 HatchBrushHatchBrush(pola, warnagaris, warnalatarbelakang), dapat digunakan untuk menggambar objekisian dengan pola isian tertentu seperti : • HatchStyle.Horizontal • HatchStyle.Vertical • HatchStyle.ForwardDiagonal • HatchStyle.HatchStyleBackwardDiagonal • HatchStyle.HatchStyleCross • HatchStyle.HatchStyleDiagonalCrossHatchBrush terdefinisi pada namespace System.Drawing.Drawing2DContoh :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 TextureBrushTextureBrush(gambar), dapat digunakan untuk mengambarkan objek isian yang diisi dengangambar 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 GradientBrushGradientBrush digunakan untuk warna isian yang sifatnya gradualLinearGradientBrushLinierGradientBrush(Point1,Point2,warna1,warna2) akan membuat warna gradient mulai dariPoint1 ke Point2 secara gradual dari warna1 ke warna2LinearGradientBrush terdefinisi pada namespace System.Drawing.Drawing2DContoh :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 GammaCorrectionContoh :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 = Truee.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 DrawStringUntuk 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 FloatINDOPROG 21
  • 22. Pemrograman GDI+ pada VB.NET Hendra, S.T.Mengambar garis dengan textureUntuk mengambar garis dengan texture, kita membutuhkan pen yang menggunakanTextureBrush.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 gambarJika pada bagian sebelumnya kita telah membahas pembuatan grafik vector dengan GDI+, makapada bagian ini kita akan melihat bagaimana mengolah gambar.Memuat dan menampilkanUntuk memuat dan menampilkan gambar dari file ke layer, anda membutuhkan objek Bitmapdan objek Graphics. Class Bitmap mendukung beberapa format seperti BMP, GIF, JPEG, PNGdan TIFF.Contoh :Dim bitmap As New Bitmap("Grapes.jpg")e.Graphics.DrawImage(bitmap, 60, 10)Memuat dan menampilkan dengan ukuran lainUntuk menampilkan gambar dengan ukuran yang berbeda dengan ukuran sebenarnya, kita harusmenyediakan dua Rectangle, yaitu Rectangle Asal (crop terhadap gambar sebenarnya), danRectangle 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 semulaDim width As Integer = image.WidthDim height As Integer = image.HeightDim 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% gambarDim sourceRect As New RectangleF(0, 0, 0.75F * width, 0.75F * height)e.Graphics.DrawImage( _ image, _ destinationRect, _ sourceRect, _ GraphicsUnit.Pixel)Melakukan rotasi terhadap gambarUntuk melakukan rotasi terhadap gambar kita membutuhkan tiga koordinat yaitu Titik asal Titik tujuanKiri 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 tujuanDim destinationPoints As Point() = { _ New Point(200, 20), _ New Point(110, 100), _ New Point(250, 30)}‘Memuat file Stripes.bmpDim image = New Bitmap("Stripes.bmp") Tampilkan gambar dikoordinat 0,0e.Graphics.DrawImage(image, 0, 0) Tampilkan gambar sekali lagi berdasarkan titik tujuane.Graphics.DrawImage(image, destinationPoints)Menggunakan interpolation pada saat mengubah ukuran gambarPemakaian interpolation akan menentukan kualitas gambar hasil pembesaran ataupunpengecilan.Perhatikan kualitas gambar berikut yang masing-masing menggunakan interpolation yangberbeda.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.WidthDim height As Integer = image.HeightMenampilkan gambar apa adanya pada koordinat 0,0e.Graphics.DrawImage( _ image, _ New Rectangle(10, 10, width, height), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel, _ Nothing) Mengunakan interpolation kualitas rendahe.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor Menampilkan gambar sebesar 60% ukuran semulae.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 menengahe.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear Menampilkan gambar sebesar 60% ukuran semulae.Graphics.DrawImage( _image, _New Rectangle(150, 250, CInt(0.6 * width), _CInt(0.6 * height)), _0, _0, _width, _height, _GraphicsUnit.Pixel) Menggunakan interpolation kualitas tinggie.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic Menampilkan gambar sebesar 60% ukuran semulae.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 TetrisOleh : Hendra SoewarnoContoh aplikasi pemrograman GDI+ untuk pembuatan games tetris dengan pendekatanberorientasi objek.Untuk memahami program ini anda perlu mengerti pemrograman form, event handling, danarray, serta GDI+INDOPROG 28
  • 29. Pemrograman GDI+ pada VB.NET Hendra, S.T.Rancangan programProgram ini menggunakan pendekatan berorientasi objek dengan membuat dua class untuk objekShape dan objek GridClass TShapeClass 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 shapeINDOPROG 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 shapeKonstruktor TShapeKonstuktor TShape merupakan metoda yang otomatis dijalankan begitu instance dari TShapeterbentuk.Misalnya : private gtshape as new tshape instance class tshapeberfungsi menghasilkan bentuk Shape berikutnya yang akan dimunculkan setelah bentuksekarang dengan memanggil metoda generateshape. konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end subMetoda GenerateNextShapeMetoda ini berfungsi memindahkan nextshape menjadi currentshape, serta membuat nextshapeyang 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 subSub GenerateShapeBerfungsi 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.pinkINDOPROG 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 subCatatan :Parameter pada sub ini dilewatkan secara by refrence, sehingga nilai dapat dikembalikan kevariable shape dan shapecolor.Metoda RotateMetode ini berfungsi menset nilai currentstate ke nilai rotasi berikutnya (0 ke 1, 1 ke 2, 2 ke 3, 3ke 0). Rotasi ke bentuk berikutnya public sub rotate() currentstate = currentstate + 1 Rotasi berikutnya if currentstate = 4 then currentstate = 0 Kembali ke bentuk awal end subMetoda DeRotateMetode 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 subMetoda CurrentShapeSelProperti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan padaarray 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 functionNilai 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 1CurrentShapeSel(0,1) akan menghasilkan 0Property NextShapeSelProperti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan padaarray 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 functionNilai sel yang dikembalikan sangat tergantung pada nilai variable nextshape (bentuk shape), dancurrentstate defaultnya 0, karena nextshape belum mengalami rotasi.Class TGridClass ini berfungsi menyediakan mekanisme Grid pada permainan Tetris, dimana pada memoricomputer 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 gridMerupakan 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 TGridBegitu 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 subMetoda TestShapeMetoda 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 3INDOPROG 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 subMisalnya putshape yang ke 4, keposisi 6,21 pada grid, yang akan mengisi nilai ke parrMetoda TestShapeMetoda 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 ifINDOPROG 36
  • 37. Pemrograman GDI+ pada VB.NET Hendra, S.T. next i return true end functionMetoda CheckGridMetoda ini berfungsi memeriksa apakah ada baris dalam array parr yang berisi nilai 1 dari kolom3 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 functionend classMisalnya array parr pada baris 22 berisi nilai 1 mulai baris 3 s/d 12, maka setelah metodaChekGrid dijalankan akan menghapus baris 22 dan mengeser baris diatasnya ke bawah, danmengembalikan nilai berapa baris yang berhasil diselesaikan.INDOPROG 37
  • 38. Pemrograman GDI+ pada VB.NET Hendra, S.T.Class TetrisClass ini merupakan class utama permainan TetrisVariabel 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 permainanKonstruktor TetrisBerfungsi mempersiapkan tampilan form, seperti title form, ukuran form, menempatkan labeluntuk keterangan score dan gameover, membuat objek Graphics yang akan digunakan untukmenyediakan 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 subMetoda NextShapeMetoda 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 millidetikINDOPROG 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 subMetoda MoveShapeMetoda ini berfungsi menggambarkan animasi pergerakan Shape pada posisi x,y sesuai denganarah 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 subMetoda MoveShapeMetoda ini berfungsi memperbaharui nilai score di layar metoda untuk mencetak score dilayar private sub printscore() labelscore.text = "Score : " & score.tostring() end subMetoda MoveShapeMetoda ini berfungsi mengubah tulisan di labelgameover menjadi “Game Over” metoda untuk mencetak gameover private sub printgameover() labelgameover.text = "Game Over" end subEvent TickEvent ini secara otomatis akan dibangkitkan oleh Timer secara berkala untuk mengerakan Shapeke bawah, dengan senantiasa apakah Shape telah mencapai batas gerakan, jika ya, maka akanmemanggil 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) thenINDOPROG 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 subEvent KeyDownEvent ini secara otomatis akan dibangkitkan apabila adanya penekanan tombol oleh pemakai,Jika panah atas akan merotasi shapejika panah kiri akan mengerakan shape ke kirijika panah kanan akan mengerakan shape ke kananjika 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 subINDOPROG 40
  • 41. Pemrograman GDI+ pada VB.NET Hendra, S.T.Metoda DrawSelMetoda ini berfungsi menggambar sel Shape ke layar untuk animasi, metoda ini akan dipanggiloleh 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 subMetoda DrawShapeMetoda ini berfungsi menggambar Shape ke layar dengan memanggil metoda DrawSel untukmasing-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 subMetoda DrawShapeMetoda ini berfungsi menghapus Shape di layar dengan memanggil metoda DrawSel untukmasing-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 subMetoda ReDrawNextShapeMetoda ini berfungsi menggambar NextShape di layar setiap adanya perubahan nextshapeINDOPROG 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 subMetoda ReDrawGridMetoda 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 subMetoda OnPaintMetoda OnPaint akan secara otomatis diaktifkan oleh windows setiap kali layar form Tetrisdigambar 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 subINDOPROG 42
  • 43. Pemrograman GDI+ pada VB.NET Hendra, S.T.Program Kongkretoption explicit onimports systemimports system.drawingimports system.windows.formsimports microsoft.visualbasicpublic 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 subINDOPROG 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 dipercepatINDOPROG 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 gridINDOPROG 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 subend classpublic class tgrid public parr(15,25) as integer Array menyimpan isi sel padagrid public carr(15,25) as color Array menyimpan warna sel padagrid 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 integerINDOPROG 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 functionend classpublic 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 shapeINDOPROG 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.magentaINDOPROG 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 functionend classKompilasi ProgramVbc tetris.vb /r:system.dll /r:system.drawing.dll /r:system.windows.forms.dllINDOPROG 49