Страница: 1 |
Страница: 1 |
Вопрос: Движение контрола
Добавлено: 24.05.05 18:25
Автор вопроса: Genetik | ICQ: 3212009
Люди, будьте так добры. Подскажите как сделать что бы при нажатии мыши по форме в любом месте, контрл двигался к месту нажатия по прямой. Я уже себе голову сломал.
И кто знает скажите как узнать координаты мыши в момент клика по форме относительно этой формы а не всего монитора. (желательно в Твипах).
Заранее спасибо.
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Black Dragon
ICQ: 321186096
Вопросов: 30
Ответов: 347
Web-сайт:
Профиль | | #1
Добавлено: 24.05.05 21:14
Ну, это легко! Есть процедура:
End Sub
Номер ответа: 2
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #2
Добавлено: 24.05.05 21:19
Да код был, я давно такую штуку делал, короче берёшь разницу по осям Икс и Игрик (это типа катеты будут) а потом используй их как коэф-ты шага для смещения по вертикали и горизонтали.
Номер ответа: 3
Автор ответа:
Genetik
ICQ: 3212009
Вопросов: 5
Ответов: 33
Профиль | | #3
Добавлено: 25.05.05 00:07
По моему использовать одновременно и икс и игрик для смешения ет глупавато.(хотя я так пробовал - не совсем мне ето понравилось). Мне больше понравилась идея с алгебраической функцией y=k*x. Мол икс у тя в цикле меняется с шагом и вычисляет высоту (игрик). Потом ето вся штифня приравнивается к контролу. Но ето у меня че-то не получается. (Не могу вычислить k, хотя в учебнике написано что ето тангенс y/x).
А насчет МоусДаун сенкс. Я чё то про него совсем забыл.
Номер ответа: 4
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #4
Добавлено: 25.05.05 01:30
2Genetik
Ты совершенно прав про тангенс и про к*х.
А как ты будешь по вертикали двигать? тангенс то там не определёёён разве что указать явно, что если мол X(0)=X(1) то двигаем по вертикали.
Номер ответа: 5
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #5
Добавлено: 25.05.05 16:47
Нужно просто сделать линейную интерполяцию:
x = x1 + (x2 - x1) * k
y = y1 + (y2 - y1) * k
Номер ответа: 6
Автор ответа:
Genetik
ICQ: 3212009
Вопросов: 5
Ответов: 33
Профиль | | #6
Добавлено: 26.05.05 23:23
А как ты определял координату Y еще в школе? Правильно, подставлял определенную Х. Так и здесь. Т.е. в цикле или таймером ты вычисляеш значение Y подстанавливая Х в формулу(например Х с шагом 10).
Номер ответа: 7
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #7
Добавлено: 26.05.05 23:31
это ж функция,а сколько значений Y соотв-т каждому X если это функция? => можешь по вертикали двигать?
Номер ответа: 8
Автор ответа:
Genetik
ICQ: 3212009
Вопросов: 5
Ответов: 33
Профиль | | #8
Добавлено: 27.05.05 10:07
Каждому Х соответствует единственное значение У. Например если формула У=2Х То при Х=2 У=4. И больше ничему, только 4.
Номер ответа: 9
Автор ответа:
Genetik
ICQ: 3212009
Вопросов: 5
Ответов: 33
Профиль | | #9
Добавлено: 28.05.05 22:01
Все, проблема решена.
'На форме (form1) одна кнопка (Command1) и таймер (timer1)
Option Explicit
Dim x_, xt As Long
Dim y_, yt As Long
Dim tekx As Integer
Dim teky As Integer
Private Sub Form_Load()
Form1.AutoRedraw = True
Form1.Width = 7000
Form1.Height = 6000
Command1.Left = 0
Command1.Top = 0
Timer1.Enabled = False
Timer1.Interval = 1
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim speed As Integer
speed = 500
tekx = Command1.Left
teky = Command1.Top
x_ = X
y_ = Y
xt = Abs(tekx - X)
yt = Abs(teky - Y)
xt = (xt / speed)
yt = (yt / speed)
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
If tekx < x_ Then
tekx = (tekx + xt)
ElseIf tekx > x_ Then
tekx = (tekx - xt)
End If
If teky < y_ Then
teky = (teky + yt)
ElseIf teky > y_ Then
teky = (teky - yt)
End If
Command1.Left = tekx
Command1.Top = teky
If Abs(teky - y_) <= yt Then
If Abs(tekx - x_) <= xt Then
Timer1.Enabled = False
End If
End If
End Sub
Код любезно представлен JohnCR, за что ему огромное спасибо!!!
ЗЫ: Morpheus извини, ты был прав! Линейная функция бред.