Программирование
Веб программирование

Создаем игру Pine Ball в vb.net, часть II

 
 

В этом шаге мы окончательно доделаем игру, т.е. сделаем мячик, и сделаем чтобы он отталкивался от стенок, от бит, и т.д. На форму между битами, в середину добавь PictureBox(SizeMode>AutoSize = True, Name = "Ball"), и загрузи туда эту картинку:

Для этого нажми по картинке правой кнопке, и в меню выбери 'Сохранить как'. Потом у PictureBox в свойстве Image выбери картинку, которую ты сохранил. Вот код(не пугайся его размеров, на самом деле он не такой уж сложный, хотя типо такого же Pine Ball`a в моем первом учебнике 'Программируем на Visual Basic`e' делали практически в самом конце, а в 5ой части делали детский Pine Ball(т.е. с таймерами, да и вобще глюканый), так что в этом учебнике надо посильней мозги напрягать, хотя и написанно намного лучше):

Dim Left_Bita_1 As Boolean = False ' Эта переменная отвечает за передвижение биты 1, если Left_Bita_1 = False то бита не двигается влево(или вправо, или стоит), если True то движется влево 
Dim Right_Bita_1 As Boolean = False ' Здесь все аналогично

Dim Left_Bita_2 As Boolean = False
Dim Right_Bita_2 As Boolean = False
' Эти переменные отвечают за движение мяча вверх или вниз, если Ball_Up = True то мячик движется вверх, если Ball_Down = True то вниз
Dim Ball_Up As Boolean = False
Dim Ball_Down As Boolean = False
' Эти переменные отвечают за движение мяча, влево или вправо
Dim Ball_Left As Boolean = False
Dim Ball_Right As Boolean = False

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown ' При нажатии на любую клавишу:
If e.KeyCode = Keys.F1 Then
' Если нажата F1, то:
Ball_Up = True' Запускаем мячик вверх
Dvijok() ' Запускаем игру:
End If


If e.KeyCode = Keys.A Then ' Если нажата клавиша A, то биту 1 двигаем влево(см. описание функции Dvijok)
Left_Bita_1 = True
Right_Bita_1 = False
End If

' Здесь все аналогично
If e.KeyCode = Keys.D Then
Right_Bita_1 = True
Left_Bita_1 = False
End If

If e.KeyCode = Keys.Left Then
Left_Bita_2 = True
Right_Bita_2 = False
End If

If e.KeyCode = Keys.Right Then
Right_Bita_2 = True
Left_Bita_2 = False
End If
End Sub

Function Dvijok()
Do ' Запускаем вечный цикл
Application.DoEvents() ' Это чтобы цикл не зацикливался
Granica() ' Запускаем функцию Granica, которая проверяет не заехала ли бита за края формы, если заехала то останавливает ее(т.е. значения переменных отвечающих за движение бит = False)
If Left_Bita_2 = True Then Bita2.Left = Bita2.Left - 1 ' Здесь я думаю все понятно(если не очень, то смотри описание переменной Left_Bita_1)
If Right_Bita_2 = True Then Bita2.Left = Bita2.Left + 1

If Left_Bita_1 = True Then Bita1.Left = Bita1.Left - 1
If Right_Bita_1 = True Then Bita1.Left = Bita1.Left + 1

Ball_Dvijenie()' Функция двигает мяч(см. описание функции)
Loop
End Function

Function Granica()
If Bita1.Left <= 0 Then Left_Bita_1 = False ' Если бита 1 заехала за левый край формы то останавливаем её
If Bita1.Left >= Me.Width - Bita1.Width Then Right_Bita_1 = False ' Если бита 1 заехала за правый край формы то останавливаем ее(Я написал Me.Width - Bita1.Width потому что если написать просто Me.Width то бита будет полностью заходить за край формы, а если от ширины формы отнять ширину биты, то бита заходить за край формы не будет)
' Здесь все аналогично
If Bita2.Left <= 0 Then Left_Bita_2 = False
If Bita2.Left >= Me.Width - Bita1.Width Then Right_Bita_2 = False
End Function 

Function Ball_Dvijenie() ' Функции Otskok_Bita_1 и Otskok_Bita_2 при сталкновении мяча с битой, направляют его в различные стороны
Otskok_Bita_1()
Otskok_Bita_2()

' Здесь мяч двигается, взависимости от того, куда его направили функции Otskok_Bita_1 и Otskok_Bita_2
If Ball_Up = True Then Ball.Top = Ball.Top - 1
If Ball_Down = True Then Ball.Top = Ball.Top + 1

If Ball_Left = True Then Ball.Left = Ball.Left - 2
If Ball_Right = True Then Ball.Left = Ball.Left + 2
Otskok_Granica() ' Эта функция отвечает за отскок мяча от границ
End Function 

Function Otskok_Bita_2() ' Функция отвечает за задание направления мяча, при сталкновении с битой 2
If Ball.Top <= Bita2.Top + Bita2.Height + 7 Then ' Если мяч находится на одной высоте с битой 2( + Bita2.Height - прибовляем высоту биты, т.к. если этого не написать, то мяч будет ударяться об нижний край биты(а + 7 чтобы выглядело более реально))
If Ball.Left >= Bita2.Left - 25 And Ball.Left <= Bita2.Left + 25 Then ' Ball.Left >= Bita2.Left - 25 - если координаты мяча находятся там же где координаты(-25 - это ширина мяча) биты или дальше И координаты мяча меньше координат биты + 25(Ball.Left <= Bita2.Left + 25 (вся бита в ширину = 100)), то(чтобы было более понятно, посмотри на рисунок, расположенный после кода). Вобщем это отскок от левого края биты: 
' Направляем мяч влево
Ball_Left = True
Ball_Right = False
' Направляем мяч вниз
Ball_Up = False
Ball_Down = True
End If

If Ball.Left <= Bita2.Left + 100 And Ball.Left >= Bita2.Left + 75 Then ' Здесь аналогично, только отскок от правой части биты
Ball_Left = False
Ball_Right = True

Ball_Up = False
Ball_Down = True
End If

If Ball.Left > Bita2.Left + 25 And Ball.Left < Bita2.Left + 75 Then ' Отскок от центра
Ball_Up = False
Ball_Down = True
End If
End If
End Function

Function Otskok_Bita_1() ' Здесь пояснять не буду, т.к. эта функция аналогична функции Otskok_Bita_1, только отсткок от другой биты

If Ball.Top >= Bita1.Top - Bita1.Height - 7 Then

If Ball.Left >= Bita1.Left - 25 And Ball.Left <= Bita1.Left + 25 Then
Ball_Left = True
Ball_Right = False

Ball_Up = True
Ball_Down = False
End If

If Ball.Left <= Bita1.Left + 100 And Ball.Left >= Bita1.Left + 75 Then
Ball_Left = False
Ball_Right = True

Ball_Up = True
Ball_Down = False
End If

If Ball.Left > Bita1.Left + 25 And Ball.Left < Bita1.Left + 75 Then
Ball_Up = True
Ball_Down = False

Ball_Left = False
Ball_Right = False
End If
End If
End Function

Function Otskok_Granica() ' При помощи этой функции мячик отскакивает от стенок
If Ball.Left <= 0 Then ' Если мячик столкнулся с левой стенкой, то меняем его направление
Ball_Left = False
Ball_Right = True
End If

If Ball.Left >= Me.Width Then ' Если мячик столкнулся с правой стенкой, то меняем его направление
Ball_Left = True
Ball_Right = False
End If

If Ball.Top <= Bita2.Top Or Ball.Top >= Bita1.Top Then ' Если мячик улетает за биту, то ставим его в центр
Ball.Left = 176
Ball.Top = 172
Ball_Left = False
Ball_Right = False
End If
End Function

Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp ' Если какая - нибудь клавиша отжата:
If e.KeyCode = Keys.Left Then Left_Bita_2 = False ' Если отжата клавиша Left, то если Bita 2 двигалась влево, то она останавливается
If e.KeyCode = Keys.Right Then Right_Bita_2 = False ' Здесь все аналогично

If e.KeyCode = Keys.A Then Left_Bita_1 = False
If e.KeyCode = Keys.D Then Right_Bita_1 = False
End Sub

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed ' При выходе из программы(т.е. при нажатии на крестик в заголовоке формы)
End ' Выходим из программы(все дело в том, что если запущен вечный(или долгий) цикл, то программа полностью не закрывается)
End Sub 



Ну вроде бы все, теперь скачай Исходник, запусти программу(желательно не из VB.Net, а из откомпилированного exe файла), нажми F1, и играй!
P.S. Теперь задание: Разберись в коде игры, и сделай такой же Pine Ball, но не смотря в исходник(т.к. ты должен сам разобраться как эта игра устроена, т.к. когда мы будем делать другие игры, если ты сейчас не разберешься, то тебе тугова - то придется). Еще ты можешь усовершенствовать Pine Ball, добавив туда счет, и сделав более чувствительную биту.


Есть вопросы? Спроси на нашем форуме!!
Неизвестный [30.04.2011 22:05]

А не проще:
Imports system.drawing.drawning2D
Dim gp As New GraphicsPath
Dim qw= PictureBox1.ClientRectangle
qw.Inflate(-10, -10)
gp.AddEllipse(qw)
PictureBox1.Region = New Region(gp)
Это для шарика...
А потом задать ему цвет!!!

Riga [31.05.2011 18:30]

Хахаха. Молодец!
утер!

Riga [31.05.2011 18:31]

на самом деле на этом сайте дают очень большие коды а так сайт хорош!

Ваня [05.12.2012 21:52]

Public Class Form1
Dim x As Integer
Dim y As Integer
Dim o As Integer

Private Sub Timer1Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
d.Top = d.Top + 10
End Sub
Private Sub Form1
KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.D Then
PictureBox1.Left = PictureBox2.Left + 10
PictureBox2.Left = PictureBox2.Left + 10
End If
If e.KeyCode = Keys.A Then
PictureBox1.Left = PictureBox2.Left - 10
PictureBox2.Left = PictureBox2.Left - 10
End If

End Sub
Private Sub Timer2Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
d.Top = d.Top - 10
End Sub
Private Sub Timer3
Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
y = d.Location.X
x = PictureBox2.Location.X - d.Size.Width
o = PictureBox2.Location.X + 180
If (y > x Xor y > o) And (d.Location.Y >= 354) Then
Timer1.Stop()
Timer2.Start()
End If
If (y > x Xor y > o) And (d.Location.Y <= 31) Then
Timer2.Stop()
Timer1.Start()
End If
End Sub
Private Sub Timer4Tick(sender As Object, e As EventArgs) Handles Timer4.Tick
d.Left = d.Left + 10
If d.Left >= Form1.ActiveForm.Width - d.Size.Width Then
Timer4.Stop()
Timer5.Start()
End If
End Sub
Private Sub Timer5
Tick(sender As Object, e As EventArgs) Handles Timer5.Tick
d.Left = d.Left - 10
If d.Left <= 0 Then
Timer5.Stop()
Timer4.Start()
End If
End Sub

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

End Sub
End Class

vlad2000 [13.04.2013 12:47]

шар висит

ar41 [14.04.2013 17:06]

Подскажите где первая часть игры))) плиз.



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.