Creating your Own Hidden Object Game with VB.NET - Part 3 - Adding Advanced Features
Introduction
Welcome back! This is the last installment of this series. In this installment we will learn how to add a Hint Facility, how to change screen resolution, and how to make the game much more finalized. That means that we will make an introduction screen, and an ending screen, as well as a next stage. We have lots of work to do, so let us get started. We'll do it form by form.
frmJJM
The very first thing we need to do concerning the design, is to add the Hint resources and Hint Picturebox onto frmJJM. You are welcome to make use of my Hint pictures or to create your own. We will need two. One showing when a Hint hasn't been clicked, and one showing when a Hint was clicked upon. On frmJJM add a new Picturebox, and give it the following properties:
| Property | Setting |
|---|---|
| Name | picJJMHint |
| BackColor | Black |
| Dock | Left |
| Location | 0, 0 |
Add a timer control onto frmJJM and give it the following properties
| Property | Setting |
|---|---|
| Name | tmrJJMHint |
| Interval | 1000 |
Add the following code behind the tmrJJMHint_Tick event :
Private Sub tmrJJMHint_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrJJMHint.Tick
Static i As Integer ' Keep live counter
If i >= 5 Then 'After 5 seconds
picItems(RandIndex).Image = picSources(RandIndex) 'Get Picture
picJJMHint.Image = New Bitmap(My.Resources.hint1) 'Show Hint Busy Picture
i = 0 'Reset Counter
tmrJJMHint.Stop()
End If
i += 1 'Increment Counter
End Sub
This simply shows another Hint picture once it is clicked on. It waits five seconds then reverts back to the previous picture, cueing the user that the Hint feature is ready to be used again. To make the Hint feature work properly we will need to add the following variable :
Private intHintsUsed As Integer 'Keeps track of how many hints were used
Add the picJJMHint_Click event procedure:
Private Sub picJJMHint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles picJJMHint.Click
If intRemain > 0 Then 'If there are items to be found
picJJMHint.Image = New Bitmap(My.Resources.hint) 'Change Hint picture
GenHint() 'Generate a random number, ie. random picture to be shown as a hint
intScore -= 40 'Penalize player for using a Hint
intHintsUsed += 1 'Start Hints Counter
If intScore <= 0 Then intScore = 0 'Make sure Score isn't less than 0
picJJMInfo.Invalidate()
End If
End Sub
I make mention of GenHint inside the above sub. This sub we will add next :
Private Sub GenHint()
RandGen = New Random(Now.Millisecond) 'Generate random number
RandIndex = RandGen.Next(0, 19) 'Limit number between 0 and 19
VisHint(picItems(RandIndex)) 'Give visible clue of an item to player
tmrJJMHint.Start() 'Start Hint timer
End Sub
This sub generates a random number between 0 and 19 and then, based on that, makes use of the VisHint sub to give a hint to the player. This hint will be in the form of a dimmed copy screen of the picture in question. This makes the item quite identifiable. Let us add the VisHint sub now :
Private Sub VisHint(ByVal SelPic As PictureBox)
SelPic.CreateGraphics() 'Enable Drawing Capabilities
SelPic.CreateGraphics().Clear(SelPic.BackColor) 'Clear Existing Drawings
Dim SelGradWidth As Integer = 50 'Border is 50
'Set Colours for gradients
Dim SelGradCol1 As Color = Color.Transparent
Dim SelGradCol2 As Color = Color.Fuchsia
Dim JJMPen As New Pen(Brushes.Black, 7) 'New Pen
'Image size
Dim SelPicHeight As Integer = SelPic.Image.Height
Dim SelPicWidth As Integer = SelPic.Image.Width
'Draw Rectangle Points
Dim SelPicPoint1 = New Point(0, 0)
Dim SelPicPoint2 = New Point(0, SelPicHeight + (SelGradWidth * 2))
Dim SelPicPoint3 = New Point(SelPicWidth + (SelGradWidth * 2), (SelGradWidth * 2) + SelPicHeight)
Dim SelPicPoint4 = New Point(SelPicWidth + (SelGradWidth * 2), 0)
'Calculate Area
Dim SelPicArea As New Rectangle(0, 0, (SelGradWidth * 2) + SelPicWidth, (SelGradWidth * 2) + SelPicHeight)
Dim JJMBrush As New PathGradientBrush( _
New Point() {SelPicPoint1, SelPicPoint2, SelPicPoint3, SelPicPoint4}) 'Normal Brush
JJMBrush.CenterPoint = New PointF( _
((SelGradWidth * 2) + SelPicWidth) / 2, _
((SelGradWidth * 2) + SelPicHeight) / 2) 'Centered Brush
JJMBrush.CenterColor = SelGradCol2 'Set Center Colour
JJMBrush.SurroundColors = New Color() {SelGradCol1} 'Set Surrounding Colours
SelPic.CreateGraphics().FillRectangle(JJMBrush, SelPicArea) 'Fill
SelPic.CreateGraphics().DrawRectangle(JJMPen, SelPicArea) 'Draw
' Draw Copied Image
SelPic.CreateGraphics().DrawImage(SelPic.Image, New PointF(SelGradWidth, SelGradWidth))
End Sub
It looks more complicated than it is. The trick is to get the image in question's dimensions and copy that onto a new image. With a twist... I created a gradient brush and made use of its CenterColor and SurroundColors properties to layer a gradient skin onto the copied image. This gives a nice effect. The next two pictures show how the Hint button changes when it is clicked, as well as a how the hint looks, in this case how it looks on the violin item.
![]()
Figure 1 - Shows Hint is busy processing
![]()
Figure 2 - The Hint effect.

Figure 3 - Hints used on frmSummary





Comments
There are no comments yet. Be the first to comment!