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
Znajdujemy w przyborniku PictureBox i dodajemy do formy. Ja ustawiłem PictureBox1 Location: 20;20 Size: 540;320 BackColor: Gray.
Mamy 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.
Przyszedł 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.
Przecią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):
Te 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.
Tworzymy 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:
W 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

