Pemrogaman Visual Basic.NET (Modul 3)

of 49/49
Pemrograman GDI+ pada VB.NET Hendra, S.T. INDOPROG 1 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.
  • date post

    15-May-2015
  • Category

    Documents

  • view

    1.417
  • download

    5

Embed Size (px)

Transcript of Pemrogaman Visual Basic.NET (Modul 3)

  • 1. Pemrograman GDI+ pada VB.NET Hendra, S.T. Pemrograman GDI+ pada VB.NetOleh : Hendra, ST. Buku ini membahas tentang pengolahan grafik pada VB.NET, dan ditujukan kepada siapa sajayang serius untuk mempelajari pemrogrman grafik dengan GDI+ secara koding (tanpamenggunakan fasilitas designer pada Visual Studio .NET). Bagi anda yang belum mengenalbahasa pemrograman VB.NET sebaiknya memulai proses belajar dengan buku Bahasa Pemrograman VB.NET dan Pemrogram Form pada VB.NETUntuk 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 _ 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.NETHendra, 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.NETHendra, 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 _ 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.NETHendra, 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 :INDOPROG7 8. Pemrograman GDI+ pada VB.NETHendra, 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 :INDOPROG8 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.NETHendra, 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 :INDOPROG10 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.NETHendra, 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 :INDOPROG12 13. Pemrograman GDI+ pada VB.NETHendra, 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)INDOPROG13 14. Pemrograman GDI+ pada VB.NETHendra, S.T.Menggunakan PathPath dibentuk oleh kombinasi dari berbagai bentuk seperti : Lines Rectangles Ellipses Arcs Polygons Cardinal splines Bzier 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)INDOPROG14 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.NETHendra, 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.INDOPROG16 17. Pemrograman GDI+ pada VB.NETHendra, 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)INDOPROG17 18. Pemrograman GDI+ pada VB.NETHendra, 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)INDOPROG18 19. Pemrograman GDI+ pada VB.NETHendra, 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)INDOPROG19 20. Pemrograman GDI+ pada VB.NETHendra, 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.INDOPROG20 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.NETHendra, 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)INDOPROG22 23. Pemrograman GDI+ pada VB.NETHendra, 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( _INDOPROG23 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.NETHendra, 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 bentukserta bentuk rotasinyaprivate 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 TShapeprivate currentshape as integermenyimpan nomor current shapeINDOPROG30 31. Pemrograman GDI+ pada VB.NET Hendra, S.T.private nextshape as integer menyimpan nomor next shapepubliccurrentcolor as colormenyimpan warna current shapepublicnextcolor as color menyimpan warna next shapeprivate currentstate as integernomor rotasi shapeKonstruktor TShapeKonstuktor TShape merupakan metoda yang otomatis dijalankan begitu instance dari TShapeterbentuk.Misalnya :private gtshape as new tshapeinstance 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 = nextshapecurrentcolor = nextcolorcurrentstate = 0 rotasi ke 0generateshape(nextshape, nextcolor)buat nextshape baruend 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 integershape = int(rnd*6)random untuk shapec = int(rnd*8)random untuk shape colorselect 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.cyancase 6 : shapecolor = color.graycase elseshapecolor = 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.NETHendra, 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 :INDOPROG33 34. Pemrograman GDI+ pada VB.NETHendra, S.T.Variabel yang digunakan public parr(15,25) as integerArray menyimpan isi sel pada grid public carr(15,25) as colorArray 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)INDOPROG34 35. Pemrograman GDI+ pada VB.NETHendra, S.T. konstruktur class tgrid public sub new()dim i, j as integerfor i = 0 to 15 for j = 0 to 25 parr(i,j) = 1isi bingkai next jnext ifor i = 3 to 12 for j = 0 to 22 parr(i,j) = 0isi arena next jnext 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 integerfor i = 0 to 3INDOPROG35 36. Pemrograman GDI+ pada VB.NET Hendra, S.T.parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = 1carr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = s.currentcolor next iend 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 0Mengembalikan nilai yang menunjukan apakahshape dapat ditempatkan pada grid diposisi x,ypublic 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 thenreturn false end ifINDOPROG36 37. Pemrograman GDI+ pada VB.NETHendra, S.T. next i return trueend 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 pemainpublic 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 > 3j = 3do while parr(j,i) 0 and j < 13j=j+1loopif j = 13 thenbeepsound beepcomplete = complete + 1for 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 knext belsei = i - 1end if loop return completeend 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.INDOPROG37 38. Pemrograman GDI+ pada VB.NET Hendra, S.T.Class TetrisClass ini merupakan class utama permainan TetrisVariabel yang digunakanprivate withevents gtimer as new system.windows.forms.timerprivate labelscore as new labelprivate labelgameover as new labelprivate gtgrid as new tgrid instance class tgridprivate gtshape as new tshape instance class tshapeprivate g as graphicsprivate x,y as integerposisi x,y shape pada gridprivate score as integerscore 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 berikutnyaend 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 berikutnyaprivate 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 = 0end 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 = 0memindahkan shape keposisi x,yprivate sub movexy(dx,dy) clearshape()hapus gambar sebelumnya x = x + dxubah posisi x,y y = y + dy drawshape() gambar diposisi baruend subMetoda MoveShapeMetoda ini berfungsi memperbaharui nilai score di layarmetoda untuk mencetak score dilayarprivate sub printscore() labelscore.text = "Score : " & score.tostring()end subMetoda MoveShapeMetoda ini berfungsi mengubah tulisan di labelgameover menjadi Game Overmetoda untuk mencetak gameoverprivate 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 Overmengerakan shape ke bawah dengan interval waktu tertentuprivate 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.NETHendra, S.T.movexy(0,1) jika ya pindah shape 1 baris ke bawah elsegtgrid.putshape(x,y,gtshape) tempatkan shape kegridscore = score + gtgrid.checkgrid() periksa baris yang lengkapredrawgrid() cetak ulang gridprintscore() cetak scorejika shape tertahan di baris 3, artinya game overif y < 3 thengtimer.enabled = false matikan timer karena gameoverprintgameover()tampil pesan gameoverelsenextshape()persiapkan gambar berikutnyaend if end ifend 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 shapedeteksi penekanan tombol dengan event keydown pada formprivate sub tetris_keydown(sender as object, e as keyeventargs) _handles mybase.keydown select case e.keyvaluecase 38, 104, 12,101 : Panah atas, 8, 5gtshape.rotate()rotasiapakah hasil rotasi dapat ditempatkan diposisi x,yif gtgrid.testshape(x,y,gtshape) then kalau ya, rotasi balik kembali gtshape.derotate() clearshape() hapus animasi shape gtshape.rotate() rotasi drawshape()gambar shape ke layarelse gtshape.derotate()end ifcase 37, 100 : Panah kiri, 4jika shape dapat ditempatkan kekiriif gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) pindah ke kiriend ifcase 39, 102 : Panah kanan, 6if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0)end ifcase 40, 98 : Panah bawah, 2 interval dipercepatgtimer.interval = 10 end selectend subINDOPROG40 41. Pemrograman GDI+ pada VB.NETHendra, S.T.Metoda DrawSelMetoda ini berfungsi menggambar sel Shape ke layar untuk animasi, metoda ini akan dipanggiloleh metoda drawshape dan OnPaintmenggambar sel dari suatu shapeprivate 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 ifend subMetoda DrawShapeMetoda ini berfungsi menggambar Shape ke layar dengan memanggil metoda DrawSel untukmasing-masing selmengambar shape secara sementaraprivate 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 3drawsel(pen,brush, _x+gtshape.currentshapesel(i,0), _y+gtshape.currentshapesel(i,1), _20,20) next iend subMetoda DrawShapeMetoda ini berfungsi menghapus Shape di layar dengan memanggil metoda DrawSel untukmasing-masing sel (warna hitam)menghapus shape sementaraprivate 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 3drawsel(pen,brush, _x+gtshape.currentshapesel(i,0), _y+gtshape.currentshapesel(i,1),20,20) next iend subMetoda ReDrawNextShapeMetoda ini berfungsi menggambar NextShape di layar setiap adanya perubahan nextshapeINDOPROG41 42. Pemrograman GDI+ pada VB.NETHendra, S.T.mengambar ulang nextshapeprivate 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 3drawsel(pen,brush, _16+gtshape.nextshapesel(i,0), _4+gtshape.nextshapesel(i,1), _20,20) next iend subMetoda ReDrawGridMetoda ini berfungsi menggambar ulang Grid dilayarmengambar ulang gridprivate 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 12for j = 3 to 22if 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 ifnext 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 classuntuk menggambar isi grid setiap proses refresh pada formprotected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape()end subINDOPROG42 43. Pemrograman GDI+ pada VB.NETHendra, S.T.Program Kongkretoption explicit onimports systemimports system.drawingimports system.windows.formsimports microsoft.visualbasicpublic class tetris : inherits system.windows.forms.form _public shared sub main() randomize() application.run(new tetris)end subprivate withevents gtimer as new system.windows.forms.timerprivate labelscore as new labelprivate labelgameover as new labelprivate gtgrid as new tgrid instance class tgridprivate gtshape as new tshape instance class tshapeprivate g as graphicsprivate x,y as integerposisi x,y shape pada gridprivate score as integerscore permainanpublic 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 berikutnyaend submetoda mempersiapkan shape berikutnyaprivate sub nextshape() gtimer.interval = 200set interval 200 millidetik gtimer.enabled = truemengaktifkan timer gtshape.generatenextshape() redrawnextshape()cetak shape berikutnya x = 7koordinat awal di 7,0 y = 0end submemindahkan shape keposisi x,yprivate sub movexy(dx,dy) clearshape() hapus gambar sebelumnya x = x + dx ubah posisi x,y y = y + dy drawshape()gambar diposisi baruend 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.tickapakah shape bisa turun kebawahif gtgrid.testshape(x,y+1,gtshape) then movexy(0,1) pindah shape 1 baris ke bawahelse 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 ifend if end sub deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydownselect 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) thenkalau ya, rotasi balik kembaligtshape.derotate()clearshape() hapus animasi shapegtshape.rotate() rotasidrawshape()gambar shape ke layar elsegtshape.derotate() end if case 37, 100 : Panah kiri, 4 jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) thenmovexy(-1,0) pindah ke kiri end if case 39, 102 : Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) thenmovexy(1,0) end if case 40, 98 : Panah bawah, 2 interval dipercepatINDOPROG 44 45. Pemrograman GDI+ pada VB.NET Hendra, S.T. gtimer.interval = 10end 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 theng.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 integerdim 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 integerdim 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 redrawnextshapedim i as integerdim pen as new pen(color.black,1)dim brush as new solidbrush(color.black)g.fillrectangle(brush,300,60,120,120)pen.color = color.whitebrush.color = gtshape.nextcolorfor 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 12for j = 3 to 22if 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 ifnext j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1)end submelakukan overide terhadap sub onpaint pada base classuntuk menggambar isi grid setiap proses refresh pada formprotected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape()end subend classpublic class tgrid public parr(15,25) as integerArray menyimpan isi sel padagrid public carr(15,25) as colorArray menyimpan warna sel padagridkonstruktur class tgridpublic sub new() dim i, j as integer for i = 0 to 15for j = 0 to 25parr(i,j) = 1 isi bingkainext j next i for i = 3 to 12for j = 0 to 22parr(i,j) = 0 isi arenanext j next iend subMengembalikan nilai yang menunjukan apakahshape dapat ditempatkan pada grid diposisi x,ypublic 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 thenreturn false end if next i return trueend functionMenempatkan shape pada posisi x,y di gridpublic sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = 1carr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = s.currentcolor next iend subperiksa apakah ada baris yang berhasil diselesaikan pemainpublic 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 > 3j = 3do while parr(j,i) 0 and j < 13j=j+1loopif j = 13 thenbeepsound beepcomplete = complete + 1for 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 knext belsei = i - 1end if loop return completeend functionend classpublic class tshapeprivate currentshape as integer menyimpan nomor current shapeprivate nextshape as integermenyimpan nomor next shapepublic currentcoloras color menyimpan warna current shapepublic nextcolor ascolormenyimpan warna next shapeprivate 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 tshapepublic sub new() generateshape(nextshape, nextcolor)end subMembuat next shape berikutnya, dan menset current shapepublic sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0rotasi ke 0 generateshape(nextshape, nextcolor) buat nextshape baru end subMembuat bentuk dan mengembalikan melalui parameter shape dan shapecolorprivate 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 ccase 0 : shapecolor = color.redcase 1 : shapecolor = color.greencase 2 : shapecolor = color.bluecase 3 : shapecolor = color.orangecase 4 : shapecolor = color.pinkcase 5 : shapecolor = color.cyancase 6 : shapecolor = color.graycase elseshapecolor = color.magentaINDOPROG48 49. Pemrograman GDI+ pada VB.NETHendra, S.T.end selectend subRotasi ke bentuk berikutnyapublic sub rotate()currentstate = currentstate + 1 Rotasi berikutnyaif currentstate = 4 then currentstate = 0 Kembali ke bentuk awalend subRotasi ke bentuk sebelumnyapublic sub derotate()currentstate = currentstate - 1 Rotasi sebelumnyaif currentstate = -1 then currentstate = 3end subMengembalikan sel i,j dari current shapepublic function currentshapesel(i as integer, j as integer)return sarr(currentshape,currentstate,i,j)end functionMengembalikan sel i,j dari next shapepublic function nextshapesel(i as integer, j as integer)return sarr(nextshape,0,i,j)Bentuk awalend functionend classKompilasi ProgramVbc tetris.vb /r:system.dll /r:system.drawing.dll /r:system.windows.forms.dllINDOPROG49