Tworzymy menu do naszej pierwszej gry.

Skorzystamy z projektu który wykonaliśmy wcześniej w tym tutorialu : https://visualmonsters.cba.pl/index.php/sterowanie-obiektem-proste-gry/

Nasze menu można zrobić na trzy sposoby, każdy może wybrać sposób który najbardziej mu odpowiada.

1. sposób to będzie na żywca:

Najpierw wypełniamy nasz PictureBox w formie. Rozwijamy menu małym trójkącikiem w kwadraciku w prawym górnym rogu.

menugry1

 

Następnie na nasz panel przenosimy TableLayoutPanel

menugry2

 

Wypełnienie naszego TableLayoutPanel można zrobić według własnej woli. Następnie będziemy musieli edytować kolumny i wypełnić formę naszym TableLayoutPanel. Robimy to tak samo jak przy użyciu Panelu, małym trójkątem w prawym górnym rogu naszego obiektu.

menugry3

 

Tworzymy trzy kolumny i trzy wiersze takie jak na obrazku poniżej.

menugry4

 

Ustawiamy opcje Dock na Fill we właściwościach TableLayoutPanel.

menugry5Dzięki takim zabiegom środkowa komórka naszego obiektu zawsze będzie miała jednakowy wymiar i zawsze będzie po środku. Do środkowej komórki z Przybornika przenosimy Panel.

menugry6

 

We właściwościach naszego nowego Panelu ustawiamy wartość Dock na fill i BackColor na jakiś wybrany przez nas, ja wybrałem zielony.

menugry7

 

Teraz można na nasz ładny zielony Panel przenieść Button i zmienić mu text na „Start”

menugry8

 

Tworzymy sobie uchwyt do naszego przycisku i przenosimy tam wszystkie elementy z Form_Load i dodajemy komendę: TableLayoutPanel1.Dispose()

    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
        TableLayoutPanel1.Hide()
        Me.Focus()
        PictureBox1.Controls.Add(statek)
        statek.Width = 30 'szerokość naszego statku
        statek.Height = 30 'wysokość n
        statek.BackColor = Color.YellowGreen 'kolor statku
        statek.Top = (PictureBox1.Height / 2) - 15 'położenie startowe -< z góry
        statek.Left = (PictureBox1.Width / 2) - 15 'położenie startowe -< z lewej
        Timer1.Start() 'uruchamia timer
    End Sub

Wadą takiego rozwiązania jest na pewno to, że zasłania nam całą plansze. Dodanie do przycisków kodu:

 Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        e.Handled = True
        Select Case e.KeyValue
            Case Keys.Right
                prawo = True
            Case Keys.Left
                lewo = True
            Case Keys.Up
                gora = True
            Case Keys.Down
                dol = True
            Case Keys.Escape
                TableLayoutPanel1.Show()
        End Select
    End Sub

Po wciśnięciu „ESC” nasze menu znowu się pokaże.

2. Kolejny sposobem tworzenia menu będzie utworzenie „UserControl”. Wybieramy Projekt>Doadj formularz systemu Windows:

menugry9

Dodajemy Kontrole użytkownika:

menugry10

 

Jeśli kontrola użytkownika nie została automatycznie uruchomiona musimy ją otworzyć z eksploratora:

menugry11

 

Następnie powtarzamy kroki z punktu pierwszego i tworzymy TableLayoutPanel1. Po wykonaniu wszystkich punktów nasza kontrolka powinna wyglądać tak:

menugry12

 

Aby była funkcjonalna należy w jej kodzie dodać:

Public Class UserControl1
    Private _lastParent As Control
    Private Sub plan_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
        resizeToParentWidth()
    End Sub
    Private Sub resizeToParentWidth()
        If Parent IsNot Nothing Then
            Me.Left = 0
            Me.Width = Parent.ClientSize.Width
            Me.Height = Parent.ClientSize.Height
        End If
    End Sub
    Private Sub plan_ParentChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ParentChanged
        If _lastParent IsNot Nothing Then
            RemoveHandler _lastParent.Resize, AddressOf plan_Resize
        End If
        _lastParent = Parent
        If Parent IsNot Nothing Then
            AddHandler Parent.Resize, AddressOf plan_Resize
            resizeToParentWidth()
        End If
    End Sub
End Class

Wracamy do naszej Formy1. Dodajemy zmienną lokalną jako obiekt i dwa publiczne Suby. Do jednego z nich wklejamy to co było w Form_Load:

    Dim menu_sta As New UserControl1 'przechowuje obiekt menu

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        menu_start()
    End Sub

    Public Sub start()
        menu_sta.Hide()
        Me.Focus()
        PictureBox1.Controls.Add(statek)
        statek.Width = 30 'szerokość naszego statku
        statek.Height = 30 'wysokość n
        statek.BackColor = Color.YellowGreen 'kolor statku
        statek.Top = (PictureBox1.Height / 2) - 15 'położenie startowe -< z góry
        statek.Left = (PictureBox1.Width / 2) - 15 'położenie startowe -< z lewej
        Timer1.Start() 'uruchamia timer
    End Sub

    Public Sub menu_start()
        PictureBox1.Controls.Add(menu_sta) ' Wyświetla menu
    End Sub

Wracamy do naszego UserControl i tworzymy uchwyt do przycisku. Wpisujemy w nim:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Form1.start()
    End Sub

Dla przycisku „Esc” wystarczy teraz dodać kod:

    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        e.Handled = True
        Select Case e.KeyValue
            Case Keys.Right
                prawo = True
            Case Keys.Left
                lewo = True
            Case Keys.Up
                gora = True
            Case Keys.Down
                dol = True
            Case Keys.Escape
                menu_sta.Show()
        End Select
    End Sub

Projekt do pobrania tutaj:Sterowanie_obiektem_UserControl_Menu

3. Ostatnią możliwością jest napisanie takiego menu. Oto kod który posłużył mi do stworzenia takiego menu:

 Dim menu_sta As New TableLayoutPanel
    Dim Start_button As New Button
    Dim panel_start As New Panel
    Dim adres As New LinkLabel

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        menu_start()
    End Sub

    Public Sub start()
        menu_sta.Hide()
        Me.Focus()
        PictureBox1.Controls.Add(statek)
        statek.Width = 30 'szerokość naszego statku
        statek.Height = 30 'wysokość n
        statek.BackColor = Color.YellowGreen 'kolor statku
        statek.Top = (PictureBox1.Height / 2) - 15 'położenie startowe -< z góry
        statek.Left = (PictureBox1.Width / 2) - 15 'położenie startowe -< z lewej
        Timer1.Start() 'uruchamia timer
    End Sub
  
    Public Sub menu_start()
        PictureBox1.Controls.Add(menu_sta)
        panel_start.BackColor = Color.White
        panel_start.Dock = DockStyle.Fill

        menu_sta.Dock = DockStyle.Fill

        menu_sta.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50%))
        menu_sta.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 200))
        menu_sta.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50%))
        menu_sta.RowStyles.Add(New RowStyle(SizeType.Percent, 50%))
        menu_sta.RowStyles.Add(New RowStyle(SizeType.Absolute, 200))
        menu_sta.RowStyles.Add(New RowStyle(SizeType.Percent, 50%))
        menu_sta.Controls.Add(panel_start, 1, 1)

        menu_sta.Controls.Add(adres, 2, 2)

        Start_button.Location = New Point(panel_start.Width / 2 - Start_button.Width / 2, panel_start.Height / 2 - Start_button.Height / 2)
        Start_button.Text = "Start"
        panel_start.Controls.Add(Start_button)
        AddHandler Start_button.Click, AddressOf start
        adres.Text = "www.visualmonsters.cba.pl"
        AddHandler adres.Click, AddressOf VisualMonsters
        ' Wyświetla menu
    End Sub
    Public Sub VisualMonsters()
        Process.Start("www.visualmnsters.cba.pl")
    End Sub
    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        e.Handled = True
        Select Case e.KeyValue
            Case Keys.Right
                prawo = True
            Case Keys.Left
                lewo = True
            Case Keys.Up
                gora = True
            Case Keys.Down
                dol = True
            Case Keys.Escape
                menu_sta.Show()
        End Select
    End Sub

Nie jest to jakiś wyszukany kod. Każdy jego element można dopracować. Zachęcam was do dopracowania tego ostatniego menu. Wygląda to tak:

menugry13

 

Projekt do pobrania tutaj: Sterowanie_obiektem_Menu_dynamiczne

Permalink do tego artykułu: https://visualmonsters.cba.pl/tworzymy-menu-do-naszej-pierwszej-gry/

Dodaj komentarz

Twój adres email nie będzie publikowany.