Page 1 of 1

Creating A Sliding Tile Puzzle Involve Cropping Bitmap, FileDialogs, Buttons And Code Rate Topic: ***** 3 Votes

#1 AdamSpeight2008  Icon User is offline

  • MrCupOfT
  • member icon


Reputation: 2253
  • View blog
  • Posts: 9,443
  • Joined: 29-May 08

Post icon  Posted 12 August 2009 - 10:11 PM

Creating A Sliding Tile Puzzle

To create the puzzle I have decided to split the task into two (2) parts;-
  • The Slider Code
  • The User Interface (U.I)
So let create a new Windows Form Application.

Part 1 The Slider Code

In Solution Explorer, add an a New Item -> Class -> Name it SlidePuzzle.vb
Add in all the variable the class will use.
#Region "Protected Variables"
 Protected m_Tile() As Bitmap ' An array containing the individual Puzzle Tiles
 Protected m_TileIndex() As Integer ' An array containing an Index to the corrisponding Tile
 Protected m_OriginalBitmap As Bitmap ' This is the image will be using.
 Protected m_PuzzleBMP As Bitmap ' This will be the image made up of the tiles. 
 Protected m_TileWidth As Single ' This is the Width of a tile.
 Protected m_TileHeight As Single 'This the Height of a tile.
 Protected m_TilesHigh As Integer ' How many tiles wide is the puzzle.
 Protected m_TilesWide As Integer ' How many tiles high is the puzzle.
 Protected m_Top As Integer ' = (TileHigh * TileWide) -1
 Protected m_BlankTilePosition As Integer ' This is to current location of the blank Tile (The Gap)
 Protected m_AllowUp As Boolean ' Can the tile move up
 Protected m_AllowDown As Boolean ' Can the tile move down
 Protected m_AllowLeft As Boolean ' Can the tile move left
 Protected m_AllowRight As Boolean ' Can the tile move right.
 Protected m_NotShuffling As Boolean = False ' Used during shuffle to prevent the image being redrawn.
 Protected m_PuzzleCompleted As Boolean = False ' Is the puzzle completed.
#End Region


Add in all the Properties.
#Region "Properties"
 Public ReadOnly Property PuzzleBMP() As Bitmap
  Get
   Return m_PuzzleBMP
  End Get
 End Property
 Public ReadOnly Property Completed() As Boolean
  Get
   Return m_PuzzleCompleted
  End Get
 End Property
 Public ReadOnly Property AllowLeft() As Boolean
  Get
   Return m_AllowLeft
  End Get
 End Property

 Public ReadOnly Property AllowRight() As Boolean
  Get
   Return m_AllowRight
  End Get
 End Property

 Public ReadOnly Property AllowUp() As Boolean
  Get
   Return m_AllowUp
  End Get
 End Property

 Public ReadOnly Property AllowDown() As Boolean
  Get
   Return m_AllowDown
  End Get
 End Property
 Public ReadOnly Property OriginalBMP() As Bitmap
  Get
   Return m_OriginalBitmap
  End Get
 End Property
#End Region



The events

#Region "Public Events"
 Public Event BeenCompleted()
#End Region



In the follow code section will indicate errors in the Error List, do not worry they go once the all class code is in place.

Now the Initialisation Code, which is used in the creation of a new instance of the SlidePuzzle Class.
#Region "Initialisation"
 Public Sub New(ByVal ImageBitmap As Bitmap, ByVal i_TilesWide As Integer, ByVal i_TilesHigh As Integer)
  ' Start of Sanity Checks
  If ImageBitmap Is Nothing Then Throw New ArgumentException("ImageBitmap is nothing")
  If i_TilesWide < 2 Then Throw New ArgumentException("Width must be a least 2")
  If i_TilesHigh < 2 Then Throw New ArgumentException("Height must be a least 2")
  ' End Of Sanity Checks
  m_TilesHigh = i_TilesHigh
  m_TilesWide = i_TilesWide
  m_OriginalBitmap = ImageBitmap
  Init()
 End Sub
 Public Sub New(ByVal ImageFilePath As String, ByVal i_TilesWide As Integer, ByVal i_TilesHigh As Integer)
  ' Start of Sanity Checks
  If FileIO.FileSystem.FileExists(ImageFilePath) = False Then
   Throw New ArgumentException("File Not Found")
  End If
  If i_TilesWide < 2 Then Throw New ArgumentException("Width must be a least 2")
  If i_TilesHigh < 2 Then Throw New ArgumentException("Height must be a least 2")
  ' End Of Sanity Checks
  m_TilesHigh = i_TilesHigh
  m_TilesWide = i_TilesWide
  m_OriginalBitmap = Bitmap.FromFile(ImageFilePath)
  Init()
 End Sub
#End Region



Why the two Sub New?
The first lets us create a Slide Puzzle based on a bitmap.
The second let us create a Slide Puzzle based on a bitmap file.


Add all the private subs.
#Region "Private Subs"
 Private Sub Init()
  m_Top = m_TilesWide * m_TilesHigh - 1
  m_TileWidth = m_OriginalBitmap.Width / m_TilesWide
  m_TileHeight = m_OriginalBitmap.Height / m_TilesHigh
  ' Resize the TileIndex Array
  ReDim m_TileIndex(m_Top)
  CreateImageTiles()
  ' Default the Blank Tile position to the last tile.
  m_BlankTilePosition = m_Top
  UpdateValidMoves()
  Shuffle()
  UpdateValidMoves()
 End Sub

 Private Sub CreateImageTiles()
  'Resize the Tile Array
  ReDim m_Tile(m_Top)
  ' Set the index to minus one (-1)
  Dim i As Integer = -1
  ' For each row in the puzzle
  For RowIndex As Integer = 0 To m_TilesHigh - 1
   ' For each column in the puzzle
   For ColumnIndex As Integer = 0 To m_TileWide - 1
	i += 1
	' Create a bitmap of a cropped section of the origonal bitmap
	' TopLeft Coordinates are
	' left = ColumnIndex * TileWidth
	' right = RowIndex * TileHeight
	m_Tile(i) = CropBitmap(m_OriginalBitmap, ColumnIndex * m_TileWidth, RowIndex * m_TileHeight, m_TileWidth, m_TileHeight)
	m_TileIndex(i) = i
   Next
  Next
  ' Create the blank tile (Space)
  ' Clone the first tile.
  Dim TheBlankTile = m_Tile(0).Clone
  Dim ci As Graphics = Graphics.FromImage(TheBlankTile)
  ' Make it completely Black
  ci.Clear(Color.Black)
  ' Replace the last tile with the blank tile.
  m_Tile(m_Tile.Count - 1) = TheBlankTile
 End Sub

 Private Sub Shuffle()
  Dim MoveCounter As Integer = m_TileWide * m_TilesHigh * 8
  Dim rn As New Random(Now.Millisecond Xor Environment.TickCount)
  ' Keep attepmpting to move a tile, until Move Counter is Zero
  While MoveCounter >= 0
   ' Pick a random direction.
   Select Case rn.Next(0, 4)
	Case 0 : If MoveLeft() Then MoveCounter -= 1
	Case 1 : If MoveUp() Then MoveCounter -= 1
	Case 2 : If MoveDown() Then MoveCounter -= 1
	Case 3 : If MoveRight() Then MoveCounter -= 1
   End Select
   My.Application.DoEvents()
  End While
  ' Indicate we're do longer shuffing.
  m_NotShuffling = True
  UpdatePuzzleBitmap()
 End Sub

 Private Sub UpdateValidMoves()
  m_AllowLeft = (m_BlankTilePosition Mod m_TileWide) <> 0
  m_AllowRight = (m_BlankTilePosition Mod m_TileWide) <> (m_TileWide - 1)
  m_AllowUp = (m_BlankTilePosition >= m_TileWide)
  m_AllowDown = (m_BlankTilePosition < ((m_TileWide * m_TilesHigh) - m_TileWide))
  If m_NotShuffling And IsFinished() Then
   m_PuzzleCompleted = True
   RaiseEvent BeenCompleted()
  End If
 End Sub

 Protected Sub UpdatePuzzleBitmap()
  m_PuzzleBMP = OriginalBMP.Clone()
  Dim ci As Graphics = Graphics.FromImage(m_PuzzleBMP)
  Dim i As Integer = -1
  For y As Integer = 0 To m_TilesHigh - 1
   For x As Integer = 0 To m_TileWide - 1
	i += 1
	ci.DrawImage(m_Tile(m_TileIndex(i)), x * m_TileWidth, y * m_TileHeight)
   Next
  Next
  ci.Flush()

 End Sub

 Private Sub SwapTiles(ByVal ToTile As Integer, ByVal FromTile As Integer)
  Dim tmp As Integer = m_TileIndex(ToTile)
  m_TileIndex(ToTile) = m_TileIndex(FromTile)
  m_TileIndex(FromTile) = tmp
 End Sub

#End Region



Add the Private Functions
#Region "Private Functions"

 Private Function IsFinished() As Boolean
  Dim a = From i In m_TileIndex Select i Order By i Ascending
  If m_TileIndex.SequenceEqual(a) Then
   Return True
  Else
   Return False
  End If
 End Function

 Private Function CropBitmap(ByRef bmp As Bitmap, ByVal cropX As Single, ByVal cropY As Single, ByVal cropWidth As Single, ByVal cropHeight As Single) As Bitmap
  ' This function creates a cropped instance of the input bitmap, at coordiates and of the size specified.
  Dim rect As New RectangleF(cropX, cropY, cropWidth, cropHeight)
  Dim cropped As Bitmap = bmp.Clone(rect, bmp.PixelFormat)
  Return cropped
 End Function

#End Region



Add the Public Functions
#Region "Public Functions"
 Public Function MoveLeft() As Boolean
  If m_AllowLeft Then
   m_BlankTilePosition -= 1
   SwapTiles(m_BlankTilePosition, m_BlankTilePosition + 1)
   If m_NotShuffling Then UpdatePuzzleBitmap()
   UpdateValidMoves()
   Return True
  Else
   Return False
  End If
 End Function

 Public Function MoveRight() As Boolean
  If m_AllowRight Then
   m_BlankTilePosition += 1
   SwapTiles(m_BlankTilePosition, m_BlankTilePosition - 1)
   If m_NotShuffling Then UpdatePuzzleBitmap()
   UpdateValidMoves()
   Return True
  Else
   Return False
  End If
 End Function

 Public Function MoveUp() As Boolean
  If m_AllowUp Then
   m_BlankTilePosition -= m_TileWide
   SwapTiles(m_BlankTilePosition, m_BlankTilePosition + m_TileWide)
   If m_NotShuffling Then UpdatePuzzleBitmap()
   UpdateValidMoves()
   Return True
  Else
   Return False
  End If
 End Function

 Public Function MoveDown() As Boolean
  If m_AllowDown Then
   m_BlankTilePosition += m_TileWide
   SwapTiles(m_BlankTilePosition, m_BlankTilePosition - m_TileWide)
   If m_NotShuffling Then UpdatePuzzleBitmap()
   UpdateValidMoves()
   Return True
  Else
   Return False
  End If
 End Function
#End Region



Adding Disposable support

This allow our Slide Puzzle Class the dispose of any object its no longer using.

Add the Begining of the Slide Puzzle Class insert the following line of code.
Public Class SlidePuzzle
 Implements IDisposable


This will add two new methods to the Slider Puzzle Class;-
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
Public Sub Dispose() Implements IDisposable.Dispose

Modify the first to look this.
#Region "IDispose"
 Private disposedValue As Boolean = False  ' To detect redundant calls

 ' IDisposable
 Protected Overridable Sub Dispose(ByVal disposing As Boolean)
  If Not Me.disposedValue Then
   If disposing Then
	' TODO: free other state (managed objects).
	For i As Integer = 0 To m_Tile.Count - 1
	 m_Tile(i).Dispose()
	Next
	m_OriginalBitmap.Dispose()

   End If

   ' TODO: free your own state (unmanaged objects).
   ' TODO: set large fields to null.
  End If
  Me.disposedValue = True
 End Sub

#Region " IDisposable Support "
 ' This code added by Visual Basic to correctly implement the disposable pattern.
 Public Sub Dispose() Implements IDisposable.Dispose
  ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
  Dispose(True)
  GC.SuppressFinalize(Me)
 End Sub
#End Region
#End Region



Finally add <DebuggerNonUserCode()> _ to the start of Slide Puzzle Class.
So it looks like
<DebuggerNonUserCode()> _
Public Class SlidePuzzle
 Implements IDisposable


This will only show any errors at the point where the class method was called, rather than the point in the class where the error was thrown.

It this point it is a good idea to save the project (DICTutorial_vbnet_SlidePuzzle)

Part 2 The User Interface

Rename Form1 to MainForm
Set the following properties, to corresponding values.
DoubleBuffered = True
FormBorderStyle=FixedSingle
MaximizeBox=False
MinimizeBox=False
ShowIcon=False
ShowInTaskBar=False
Text="Slide Puzzle"

Add a Picturebox to the Form. Name it PBox_Puzzle. Set the following properties.
BorderStyle => FixedSingle
Size => 400,400
SizeMode => StretchImage

Add another to the Form called PBox_Original. Set the same properties.

Add the following image the project's Images resources.
Attached Image

Add the following string into the project's Strings resources
StrSet_End = "Puzzle Solved Well Done"
StrSet_PlayAgain="Play Again?"


Add 4 Buttons named: But_Up, But_Right, But_Down, But_Left

Now the code for UI
 Private WithEvents s As SlidePuzzle
 Protected Const Def_TilesWide As Integer = 3
 Protected Const Def_TilesHigh As Integer = 3

 Protected m_TilesWide As Integer = Def_TilesWide
 Protected m_TilesHigh As Integer = Def_TilesHigh
 Protected m_PuzzleFile As String = ""

 Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  NewPuzzle()
 End Sub

 Private Sub UpdatePuzzleState()
  Me.PBox_Puzzle.Image = s.PuzzleBMP
  Me.PBox_Original.Image = s.OriginalBMP
  UpdateGameButtons()

 End Sub

 Private Sub UpdateGameButtons()
  If Not (s.Completed) Then
   Me.But_Up.Enabled = s.AllowUp
   Me.But_Right.Enabled = s.AllowRight
   Me.But_Down.Enabled = s.AllowDown
   Me.But_Left.Enabled = s.AllowLeft
  End If
  EnableSettings_CheckedChanged(Nothing, New System.EventArgs())
 End Sub

 Private Sub NewPuzzle()
  If s IsNot Nothing Then
   s.Dispose()
  End If
  Me.Lbl_ImageURL.Text = m_PuzzleFile
  If m_PuzzleFile = "" Then
   s = New SlidePuzzle(My.Resources.Puzzle, m_TilesWide, m_TilesHigh)
  Else

   s = New SlidePuzzle(m_PuzzleFile, m_TilesWide, m_TilesHigh)
  End If
  UpdatePuzzleState()
 End Sub

 Private Sub EnableSettings_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Chk_EnableSettings.CheckedChanged
  Me.Lbl_ImageURL.Enabled = Me.Chk_EnableSettings.Checked
  Me.Lbl_ImageURLLabel.Enabled = Me.Chk_EnableSettings.Checked
  Me.Lbl_TilesHigh.Enabled = Me.Chk_EnableSettings.Checked
  Me.Lbl_TileWide.Enabled = Me.Chk_EnableSettings.Checked
  Me.NUD_TilesWide.Enabled = Me.Chk_EnableSettings.Checked
  Me.NUD_TilesHigh.Enabled = Me.Chk_EnableSettings.Checked
  Me.But_NewImage.Enabled = Me.Chk_EnableSettings.Checked
  Me.But_UseDefaults.Enabled = Me.Chk_EnableSettings.Checked
  ' Change Game Buttons
  Me.But_Down.Enabled = Not (Me.Chk_EnableSettings.Checked)
  Me.But_Left.Enabled = Not (Me.Chk_EnableSettings.Checked)
  Me.But_Right.Enabled = Not (Me.Chk_EnableSettings.Checked)
  Me.But_Up.Enabled = Not (Me.Chk_EnableSettings.Checked)
 End Sub


 Private Sub But_Up_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Up.Click
  s.MoveUp()
  UpdatePuzzleState()
 End Sub
 Private Sub But_Right_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Right.Click
  s.MoveRight()
  UpdatePuzzleState()
 End Sub
 Private Sub But_Down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Down.Click
  s.MoveDown()
  UpdatePuzzleState()
 End Sub
 Private Sub But_Left_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Left.Click
  s.MoveLeft()
  UpdatePuzzleState()
 End Sub
 Private Sub Fini() Handles s.BeenCompleted
  Me.PBox_Puzzle.Image = s.OriginalBMP
  Me.But_Up.Enabled = False
  Me.But_Right.Enabled = False
  Me.But_Down.Enabled = False
  Me.But_Left.Enabled = False
  Dim reply As Windows.Forms.DialogResult = _
   MessageBox.Show(My.Resources.StrSet_End & Environment.NewLine & My.Resources.StrSet_PlayAgain, _
				   "Slide Puzzle", _
				   MessageBoxButtons.YesNo, _
				   MessageBoxIcon.Question, _
				   MessageBoxDefaultButton.Button1)
  Select Case reply
   Case Windows.Forms.DialogResult.Yes
	NewPuzzle()
  End Select
 End Sub




That's all the coding needed to get the slide puzzle to work.

But what about using a different picture, one the user can load.
Or change the number of Tiles.

Adding Settings

So add 4 labels;-
Lbl_TilesWide with Text="Tiles Wide:"
Lbl_TilesHigh with Text="Tiles High:"
Lbl_ImageURLLbl with Text="Image URL:"
Lbl_ImageURI with Text=""
Add a CheckBox;-
Chk_EnableSetting with
Text ="Enable Settings"
CheckAlign = MiddleRight

Add Two NumericUPDown Control (NUD_TilesWide & NUD_TilesHigh)
Make sure that they have the following setting
Maximum = 10
Minimum =2
Value = 3

2 Buttons (But_UseDefaults & But_LoadImage)
With Texts of "Use Defaults" and "Load Image"

Finally the last control OpenFileDialog Control. (OFD_Image)
Filter= BMP|*.bmp|JPEG|*.jpg
ReadOnlyChecked =True

My Layout of MainForm
Attached Image

A the last section of code
Private Sub NUD_TilesWide_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NUD_TilesWide.ValueChanged, NUD_TilesWide.ValueChanged
  If Me.NUD_TilesWide.IsHandleCreated And Me.NUD_TilesHigh.IsHandleCreated Then
   m_TilesHigh = Me.NUD_TilesHigh.Value
   m_TilesWide = Me.NUD_TilesWide.Value
   NewPuzzle()
  End If

 End Sub

 Private Sub But_NewImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_LoadImage.Click
  Me.But_LoadImage.Enabled = False

  OFD_Image.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyPictures
  Dim reply As Windows.Forms.DialogResult = OFD_Image.ShowDialog()
  Select Case reply
   Case Windows.Forms.DialogResult.Cancel
   Case Windows.Forms.DialogResult.OK
	' ok
	m_PuzzleFile = OFD_Image.FileName
	NewPuzzle()
  End Select
  Me.But_LoadImage.Enabled = True

 End Sub


 Private Sub OFD_Image_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OFD_Image.FileOk
  Using d = New Bitmap(OFD_Image.FileName)
   Select Case d.PixelFormat
	Case Imaging.PixelFormat.Indexed, Imaging.PixelFormat.Format1bppIndexed, Imaging.PixelFormat.Format4bppIndexed, Imaging.PixelFormat.Format8bppIndexed
	 MessageBox.Show("Pixel Format Unsupported")
	 e.Cancel = True
	Case Else
	 e.Cancel = False
   End Select
  End Using
 End Sub

 Private Sub But_UseDefaults_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_UseDefaults.Click
  m_TilesWide = Def_TilesWide
  m_TilesHigh = Def_TilesHigh
  m_PuzzleFile = ""
  NewPuzzle()

 End Sub



Well done in getting this far and building a puzzle game in vb.net. :pirate:

Exercise for the brave
Modify the program to allow the user to change the actions of the direction buttons. From moving the blank tile to moving the tile adjacent to the blank tile.

Exercises for the Adventurous
Make the tiles slide into position.

Is This A Good Question/Topic? 0
  • +

Replies To: Creating A Sliding Tile Puzzle

#2 AdamSpeight2008  Icon User is offline

  • MrCupOfT
  • member icon


Reputation: 2253
  • View blog
  • Posts: 9,443
  • Joined: 29-May 08

Posted 13 August 2009 - 12:01 AM

Update: BugFixes
  • Change to EnableSettings_CheckedChanged
    Fixes: Incorrect Button State are unchecking with change a setting.
     ' Change Game Buttons
      If Me.Chk_EnableSettings.Checked Then
       Me.But_Down.Enabled = Not (Me.Chk_EnableSettings.Checked)
       Me.But_Left.Enabled = Not (Me.Chk_EnableSettings.Checked)
       Me.But_Right.Enabled = Not (Me.Chk_EnableSettings.Checked)
       Me.But_Up.Enabled = Not (Me.Chk_EnableSettings.Checked)
      Else
       UpdateGameButtons()
      End If
    
    

    Plus a change to UpdateGameButtons
     Private Sub UpdateGameButtons()
      If Me.Chk_EnableSettings.Checked Then
       EnableSettings_CheckedChanged(Nothing, New System.EventArgs())
      Else
       If Not (s.Completed) Then
    	Me.But_Up.Enabled = s.AllowUp
    	Me.But_Right.Enabled = s.AllowRight
    	Me.But_Down.Enabled = s.AllowDown
    	Me.But_Left.Enabled = s.AllowLeft
       End If
    
      End If
     End Sub
    
    


  • Change to handler on NUD_TilesWide_ValueChanged
    Fixes: Puzzle doesn't update on change of value on TilesHigh
     Private Sub NUD_TilesWide_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NUD_TilesWide.ValueChanged, NUD_TilesHigh.ValueChanged
    
    


  • Additions to But_UseDefaults_Click
    Fixes: Clicking "Use Defaults" button doesn't default the value of TilesWide & TilesHigh back to 3
      m_TilesHigh = Def_TilesHigh
      Me.NUD_TilesHigh.Value = m_TilesHigh
      Me.NUD_TilesWide.Value = m_TilesWide
    
    
    

Was This Post Helpful? 2
  • +
  • -

#3 Guest_saeed hg*


Reputation:

Posted 17 June 2010 - 09:24 AM

Hi. first: tanks for nice project.
if its possible please more explain about this project.
in some lines exist error and i cant run program. example:

#Region "Private Functions"

Private Function IsFinished() As Boolean
Dim a = From i In m_TileIndex Select i Order By i Ascending
If m_TileIndex.SequenceEqual(a) Then
Was This Post Helpful? 0

#4 jalle007  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 2
  • Joined: 03-March 11

Posted 03 March 2011 - 05:39 AM

Hello

Its good tutorial, but is there project file to download?
I need it badly and dont have time to go through the code and copy/paste it 1 by 1

Cheers
Jalle

This post has been edited by jalle007: 03 March 2011 - 05:48 AM

Was This Post Helpful? 0
  • +
  • -

#5 AdamSpeight2008  Icon User is offline

  • MrCupOfT
  • member icon


Reputation: 2253
  • View blog
  • Posts: 9,443
  • Joined: 29-May 08

Posted 03 March 2011 - 11:59 AM

Unlikely. It doesn't take "that" long.

Programming is like cooking, you don't learn how to make cake by eating it.
Was This Post Helpful? 0
  • +
  • -

#6 avicenna  Icon User is offline

  • New D.I.C Head

Reputation: -1
  • View blog
  • Posts: 1
  • Joined: 03-March 11

Posted 03 March 2011 - 05:11 PM

emmm....please give us file to be downloaded..
Was This Post Helpful? -1
  • +
  • -

#7 Lolzmao  Icon User is offline

  • New D.I.C Head

Reputation: 5
  • View blog
  • Posts: 33
  • Joined: 02-August 11

Posted 02 August 2011 - 07:45 AM

Very nice tutorial. You made a few mistypes within your code at some points, but other than that, easy to follow, and it works nicely. I am having a few movement bugs on the right hand side of the picture though. Probably just a mistype somewhere on my part. I'll root out the problem. Thank you!
Was This Post Helpful? 0
  • +
  • -

#8 michaelsichico  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 1
  • Joined: 04-May 13

Posted 04 May 2013 - 04:20 AM

Public ReadOnly Property PuzzleBMP() As Bitmap
Get
Return m_PuzzleBMP
End Get
End Property

What do you mean by this property?
Was This Post Helpful? 0
  • +
  • -

#9 AdamSpeight2008  Icon User is offline

  • MrCupOfT
  • member icon


Reputation: 2253
  • View blog
  • Posts: 9,443
  • Joined: 29-May 08

Posted 04 May 2013 - 09:00 AM

What do you think it means?
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1