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:
1 2 3 4 5 6 7 8 9 10 11 12 |
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.
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 4 5 6 7 8 9 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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