Sterowanie obiektem (proste gry)

Ogólnie nie zajmuje się grami, raczej tworzę programu biurowe, systemy ERP itp, ale co nieco robiłem w tym temacie i tą wiedzą i doświadczeniem chętnie się podzielę. Będziemy w tym dziale tworzyć proste gry i omawiać sobie ich mechanikę, na pewno ktoś początkujący w tym temacie znajdzie tutaj coś dla siebie. Kiedy mówimy o grze zazwyczaj scenariusz jest podobny, wcielamy się w jakąś postać i poprzez sterowanie nią rozwiązujemy zagadki, strzelamy itp. Dzisiaj pokażę wam najlepszy według mnie sposób sterowania obiektem. Zrobimy sobie kwadrat który będzie poruszał się po wyznaczonym obszarze. Każdy obiekt/kształt wygenerowany na ekranie ma swoją własną długość i szerokość wyrażoną zazwyczaj w pikselach. Kiedy umieścimy mniejszy obiekt w większym będziemy mogli określić jego położenie względem większego i ograniczyć jego zasięg. Zaczniemy standardowo od stworzenia nowego projektu ustawiamy jego wielkość na 600;400

sterowanie obiektemZnajdujemy w przyborniku PictureBox i dodajemy do formy. Ja ustawiłem PictureBox1 Location: 20;20 Size: 540;320 BackColor: Gray.

sterowanie obiektem1Mamy nasz obszar po którym będziemy się poruszać. Najpierw stworzymy sobie nasz obiekt. Będzie to mniejszy PictureBox którym będziemy sterować za pomocą strzałek. Aby stworzyć taki obiekt w Form_Load wpisujemy:

Public Class Form1

    Dim statek As New PictureBox

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        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
    End Sub

Teraz po uruchomieniu nasz mniejszy PictureBox powinien pojawić się w środku większego PictureBoxa.

sterowanie obiektem2Przyszedł czas aby go ożywić. Aby tego dokonać należy wyodrębnić zdarzenia klikania strzałek na klawiaturze. Najpierw dodamy sobie do naszej formy obiekt o nazwie Timer. Po wystartowaniu Timer będzie odmierzał czas a ruch naszego statku będzie płynny.

sterowanie obiektem4Przeciągamy go na Formę i gotowe. Teraz wystarczy zmodyfikować lekko Form_Load i Timer będzie uruchomiony.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        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

Zaznaczamy teraz naszą formę i znajdujemy dwa zdarzenia KeyUp i KeyDown i tworzymy do nich uchwyty(klikamy dwukrotnie na puste pole po prawej):

sterowanie obiektem3Te zdarzenia będą reagować na wciskanie naszych strzałek. Pod formą Dodajemy cztery zmienne:

Public Class Form1

    Dim prawo As Boolean = False
    Dim lewo As Boolean = False
    Dim gora As Boolean = False
    Dim dol As Boolean = False

    Dim statek As New PictureBox
(...)

Następnie przechodzimy do uchwytów KeyUp i KeyDown. Wypełniamy je kodem.

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

    Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
        Select Case e.KeyValue
            Case Keys.Right
                prawo = False
            Case Keys.Left
                lewo = False
            Case Keys.Up
                gora = False
            Case Keys.Down
                dol = False
        End Select
    End Sub

Jego zasada jest dosyć prosta, jeśli przycisk jest trzymany zmienna typu boolean jest zmieniana na true po puszczeniu klawisza zmienna wraca w stan false. Wracamy do projektu i klikamy na nasz Timer1ma on tylko jedno zdarzenie które wykorzystamy, jest to zdarzenie Tick.

sterowanie obiektem5Tworzymy sobie uchwyt i wypełniamy go kodem:

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If prawo = True  Then
            statek.Left += 4
        End If
        If lewo = True Then
            statek.Left -= 4
        End If
        If gora = True Then
            statek.Top -= 4
        End If
        If dol = True Then
            statek.Top += 4
        End If
    End Sub

To jak szybko będzie się poruszał statek zależy od dwóch czynników. Pierwszym jest Interval Timera im mniejszy tym statek będzie poruszał się szybciej. Dodam jeszcze, że 1 sekunda odpowiada Intervalowi równemu 1000 czyli 1000 milisekund. Każda jednostka Intervala określa po jakim czasie nasza funkcja ma być wykonana, tak więc jeśli Interval= 1000 nasze zdarzenie Timer1_tick będzie co sekundę wykonywało operacje w nim zawartą. Z tego co wiem dolne ograniczenie Intervala w vb.net to 55milisecund czyli każda liczba Intervalu mniejsza niż 55 będzie wykonywana z szybkością 55 milisekund. Drugim sposobem jest zwiększenie zmiany położenia obiektu, jeśli w przykładzie mamy „-=4” zmiana na „-=10” przyśpieszy nasz statek ale będzie poruszał się on nienaturalnie.

Teraz należy ograniczyć poruszanie się naszego Statku. Nie może on przecież wychodzić poza obszar PictureBox1. Wiemy, że położenie naszego statku jest określane względem głównego obiektu. Czyli jeśli przesuwamy statek w prawo jego położenie +jego szerokość nie może być większe niż szerokość obiektu głównego. Wygląda to tak:

sterowanie obiektem6W praktyce modyfikujemy nasz Timer:

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If prawo = True And statek.Left + statek.Width < PictureBox1.Width Then
            statek.Left += 4
        End If
        If lewo = True And statek.Left > 0 Then
            statek.Left -= 4
        End If
        If gora = True And statek.Top > 0 Then
            statek.Top -= 4
        End If
        If dol = True And statek.Top + statek.Height < PictureBox1.Height Then
            statek.Top += 4
        End If
    End Sub

To na tyle. w następnej lekcji dodamy mu może jakąś animacje :).

Projekt do pobrania tutaj:Sterowanie_obiektem_1

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/sterowanie-obiektem-proste-gry/

Dodaj komentarz

Twój adres email nie będzie publikowany.