K
Karder
Пожалуйста помогите!
Есть программа на Visul Basic.
На форме добавлен Таймер (Name: Timer1), круг (Name: Round), 2 кнопки (Name: Command1, Command2), 2 текстовых поля (Name: Text1, Text2)
и Shape1 (Shape: 4-Rounded Restangle).
Круг движется по синусоиде и когда ударяется о края формы, то идёт в обратном направлении. Я задаю в текстовых полях координаты Shape1 и мне надо, чтобы круг, наталкиваясь на
Shape1, шел в обратном направлении, но у же по косинусоиде, и чтобы ударялся не только с левой стороны как у меня, но и справа. Вот исходный код:
Есть программа на Visul Basic.
На форме добавлен Таймер (Name: Timer1), круг (Name: Round), 2 кнопки (Name: Command1, Command2), 2 текстовых поля (Name: Text1, Text2)
и Shape1 (Shape: 4-Rounded Restangle).
Круг движется по синусоиде и когда ударяется о края формы, то идёт в обратном направлении. Я задаю в текстовых полях координаты Shape1 и мне надо, чтобы круг, наталкиваясь на
Shape1, шел в обратном направлении, но у же по косинусоиде, и чтобы ударялся не только с левой стороны как у меня, но и справа. Вот исходный код:
Код:
Option Explicit ' Объявление переменных
Dim diam As Integer ' Диаметр круга
Dim rad As Integer ' Радиус круга
Dim Y0 As Integer ' Постоянная величина Y, которая прибавляется, чтобы круг двигался по центру на форме
Dim dx As Integer ' Вычисление точки относительно оси х
Dim dy As Integer ' Вычисление точки относительно оси y
Dim X As Double ' Передвижение круга по оси x
Dim Y As Double ' Передвижение круга по оси y
Dim XM As Boolean ' Переход за пределы поля по оси X
Dim YM As Boolean ' Переход за пределы поля по оси Y
Dim delta As Double
Dim dv As Boolean ' Движение вперед или назад
Private Sub Command1_Click()
Timer1.Enabled = Not Timer1.Enabled ' Запуск/остановка движения круга
Form1.PSet (Me.Round.Left, Me.Round.Top), vbGreen
End Sub
Private Sub Command2_Click()
Me.Shape1.Move (Me.ScaleWidth - Me.Shape1.Width) * Me.Text1.Text / 100, (Me.ScaleHeight - Me.Shape1.Height) * Me.Text2.Text / 100 '
End Sub
Private Sub Form_Load()
dv = True 'Движение вперед
delta = 0.09 'Интервал изменения Х
diam = Round.Height 'Диаметр круга
rad = diam / 2 'Радиус
Round.Top = Form1.Height / 2 - diam 'Размещение круга по центру формы
Round.Left = 0 'Начало движения от левого края
Y0 = Round.Top 'Постоянная величина Y, которая прибавляется, чтобы круг двигался по центру на форме
Y = 0 'Начальная координата Y на графике
X = 0 'Начальная координата X на графике
dx = 500 'Коодината X на форме =dx*x
dy = 1000 'Коодината Y на форме =dy*y
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button Then ' ручная установка препятствия
Shape1.Move X, Y
End If
End Sub
Private Sub Timer1_Timer()
If dv Then 'Если движение вперед
X = X + delta 'Прибавляем к Х интервал
Else 'Если назад
X = X - delta 'отнимаем от Х
End If
Y = Sin(X) 'Функция, по которой движется круг до удара с препятствием
Round.Top = Y0 - Int(Y * dy) 'Изменение координат круга по верхней границе круга
Round.Left = Int((X) * dx) 'Изменение координат круга по левой границе круга
If Round.Left > Shape1.Left - diam And dv Then 'Если происходит столкновение круга, при движении вправо, с препятствием тогда
Round.Left = Shape1.Left - diam
dv = False 'круг движется в обратном направлении
End If
'If Round.Left < Shape1.Left + Shape1.Width And Not dv Then
' Round.Left = Shape1.Left + Shape1.Width
' dv = True
' End If
If Round.Left > Form1.Width - diam Then 'Если круг ушёл за правую границу формы тогда
Round.Left = Form1.Width - diam 'после столкновения
dv = False 'движение будет в обратном направлении
End If
If Round.Left < 0 Then 'Если круг ушёл за левую границу формы тогда
Round.Left = 0 'после столкновения
dv = True 'движение направо
End If
Form1.Line -(Me.Round.Left, Me.Round.Top), vbRed 'След, который оставляет круг при движении на форме
End Sub