Движение курсором.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Движение курсором.

Сообщение Don Leno » 02.04.2015 (Чт) 11:35

Я реализовал небольшой проект, в котором осуществляется движение "кораблика" за курсором. Все расчеты делались вручную и код работает вполне нормально. Возможно ли как то оптимизировать код или кто нить знает другой способ подобной реализации?
Вложения
mod_polet.rar
(119.73 Кб) Скачиваний: 129

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 02.04.2015 (Чт) 15:02

Тут надо всё по-другому делать, начиная с Option Explicit.
Don Leno писал(а):кто нить знает другой способ подобной реализации?

Немного другое, с заданием движения клавиаторой, а направления мышкой:
http://www.gamedev.ru/community/bycircl ... ?id=142139

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 02.04.2015 (Чт) 15:04

Неподходит, мне нужно управление именно мышью!

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Движение курсором.

Сообщение The trick » 02.04.2015 (Чт) 20:11

Посмотри для определения направления угол необязательно вычислять.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 03.04.2015 (Пт) 23:16

Трик, спс, за такой интересный исходник! Как я понял ты пользуешься косинусом и синусом, чтобы задать направление "вектора". Но суть в том что "кораблик" поворачивается за курсором мыши одновременно, и градус я вычисляю чтобы повернуть "кораблик". Но дело в том что я немного неправильно написал функцию CursorMove, если у тебя есть возможность, то посмотри ее. Потому что мне кажется что там можно все написать гораздо проще. Но я не знаю как(((
Сама функция работает но в ней есть неточность.
Как я понимаю мне просто нужно реализовать на какой шаг должен сдвинуться по X и Y, если он находится под определенным градусом. Заметь - градус уже известен! Но так чтобы скорость можно было регулировать))
Последний раз редактировалось Don Leno 03.04.2015 (Пт) 23:37, всего редактировалось 2 раз(а).

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 03.04.2015 (Пт) 23:17

А кстати ты не мог бы геометрически зарисовать, как определяется вектор и его направление в мат. формулах?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Движение курсором.

Сообщение The trick » 04.04.2015 (Сб) 8:42

Почитай ту тему целиком там все разжевано, нужно знать скалярное произведение и нормировку. Убери условие и "корабль" будет поворачивать с учётом инерции.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 04.04.2015 (Сб) 17:24

ок, спс за совет, просмотрю)))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 06.04.2015 (Пн) 15:13

Трик, посмотрел код. Вопрос как мне узнать угол поворота от 0 до 360 градусов? Вернее как значение угла в переменной Ang перевести в градусы? Мне необходимо это для поворота изображения.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 06.04.2015 (Пн) 16:26

Лучше всего - раз и навсегда забыть про градусы, это искусственная величина. Актуальны радианы или обороты.
А привычка к градусам так же вредна, как привычка американцев к футам и милям.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 06.04.2015 (Пн) 18:42

И как же мне повернуть изображение если моя АПИ воспринимает только градусы?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Движение курсором.

Сообщение The trick » 06.04.2015 (Пн) 19:41

Don Leno писал(а):И как же мне повернуть изображение если моя АПИ воспринимает только градусы?

Используй PlgBlt для поворота, или трансформацию мира.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 06.04.2015 (Пн) 20:29

нашел исходник по PlgBlt, но проблема в том что она вращает изображение не относительно его центра((
Поэтому я взял другой метод.
Вложения
526_Bar.rar
(2.59 Кб) Скачиваний: 111

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Движение курсором.

Сообщение The trick » 06.04.2015 (Пн) 21:31

Еще можно через GDI+ с помощью мировых трансформаций (аналогично как и в GDI).
Вложения
PlgBltRotate.rar
(21.16 Кб) Скачиваний: 111
WorldTransform.rar
(53.08 Кб) Скачиваний: 124
Последний раз редактировалось The trick 07.04.2015 (Вт) 6:44, всего редактировалось 1 раз.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 06.04.2015 (Пн) 22:13

Трик, впервые вижу такую функцию!))) Я даж не знал что в gdi+ такие возможности))

Кстати по проекту движения. В переменной Ang храниться угол в радианах?
Не понимаю как регулировать скорость движения?
Вложения
mod_Mover_trick.rar
(1.9 Кб) Скачиваний: 120

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Движение курсором.

Сообщение The trick » 07.04.2015 (Вт) 20:16

Это не GDI+, я имел в виду что еще можно сделать с помощью GDI+.
Don Leno писал(а):Не понимаю как регулировать скорость движения?

IncDist
Don Leno писал(а):Кстати по проекту движения. В переменной Ang храниться угол в радианах?

Ang - косинус угла (исходя из скалярного произведения векторов)
Для задания матрицы тебе еще нужен будет синус, используй тождество sin(a)^2 + cos(a)^2 = 1
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 09.04.2015 (Чт) 14:49

Да, точно не GDI+, просто не смотрел код, там по вызову апи сразу видно. Еще один вопрос. У меня есть проект, движение "кораблика" к определенной точке при клике. Но вычисления я производил через проценты. Может кто нить подскажет или подредактирует мой, чтобы он был более точен. А то получается что он чуть-чуть не долетает, либо улетает чуть дальше намеченой точки =)) А хочется чтоб остановился прям в точку!))) Ниже прожект...
Вложения
Clickprocent.rar
(779.12 Кб) Скачиваний: 111

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 09.04.2015 (Чт) 16:36

Мерцает жутко твоя программа, скорость движения разная, зависит от расстояния.
Вот пример с постоянной скоростью и точным прибытием, тоже немного мерцает, потому что рендерить надо не так, но принцип расчёта координат по таймеру показывает.
Вложения
ShipMove.zip
(770.95 Кб) Скачиваний: 128

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Движение курсором.

Сообщение Don Leno » 09.04.2015 (Чт) 20:45

))) Mikle, как все просто!!! Спасибо майкл за прожект. За мерцание - ссори, просто тестировал на это внимания не обращал.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Движение курсором.

Сообщение Хакер » 09.04.2015 (Чт) 21:22

Феерическая дрянь. Особенно вот это:
Код: Выделить всё
'Delay
For s = 0 To 100
ship.Left = ship.Left
ship.Top = ship.Top
Next s


Mikle, разве это не неприемлемо, когда кораблик стартует и останавливается скачкообразно? И меняет направление мгновенно?

Мой пример.
Вложения
ship_movement.zip
(3.7 Кб) Скачиваний: 136
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 09.04.2015 (Чт) 21:33

Хакер писал(а):разве это не неприемлемо, когда кораблик стартует и останавливается скачкообразно? И меняет направление мгновенно?

Конечно, я предпочитаю с инерцией, а тут, как обычно, дал то, что просили.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 09.04.2015 (Чт) 22:46

Хакер писал(а):Феерическая дрянь. Особенно вот это:
Код: Выделить всё
'Delay
For s = 0 To 100
ship.Left = ship.Left
ship.Top = ship.Top
Next s


Да уж, шедевр :))) Я только увидел, что нет форматирования и Option Explicit, и не стал смотреть дальше.
Хакер писал(а):Мой пример.

Умеешь ты удлинять. И вроде лишнего нет, но ДЛИННО!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Движение курсором.

Сообщение Хакер » 09.04.2015 (Чт) 22:47

Mikle писал(а):И вроде лишнего нет, но ДЛИННО!

Это называется правильное красивое программирование.
И вообще, там не хватает правильных абстракций, изоляций и тому подобного. Но куда автору до этого?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 10.04.2015 (Пт) 11:59

Ну, что ж, вот мой вариант с "физичным" поведением корабля.

Я тут перепутал кое-какие комментарии, перезалил.
Вложения
ShipMoveEx.zip
(2.74 Кб) Скачиваний: 135

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 11.04.2015 (Сб) 10:09

А если в моём предыдущем примере из процедуры Timer1_Timer выкинуть лишнее, то останется это:
Код: Выделить всё
Private Sub Timer1_Timer()
  Dim v1 As Vector

  v1 = vSubt(TPos, ShPos)
  ShSpd = vAdd(ShSpd, vScale(vNorm(vSubt(vScale(v1, Sqr(2 * PwA / vLen(v1))), ShSpd)), PwA))
  ShPos = vAdd(ShPos, ShSpd)

  DrawShip
End Sub

Это без потери функциональности!
Будь это конкретная игра, я бы так и сделал, оставив комментарий, описывающий откуда это взято.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Движение курсором.

Сообщение ger_kar » 11.04.2015 (Сб) 10:21

Пару раз у меня в этой функции возникала ошибка деления на ноль

Код: Выделить всё
Public Function vNorm(v As Vector) As Vector
  Dim s As Single

  s = 1 / vLen(v)
  vNorm.x = v.x * s
  vNorm.y = v.y * s
End Function
Бороться и искать, найти и перепрятать

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 11.04.2015 (Сб) 11:03

Верно, если корабль достигает цели, то начинает незаметно для глаза колебаться около неё, постепенно приближаясь. В какой-то момент может произойти попытка нормализации нулевого вектора, это и в старом варианте возможно, но вероятность ниже. По идее, когда цель достигнута в некотором незаметном для глаза приближении, нужно прекращать расчёты.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Движение курсором.

Сообщение Хакер » 11.04.2015 (Сб) 12:45

Mikle писал(а):Верно, если корабль достигает цели, то начинает незаметно для глаза колебаться около неё, постепенно приближаясь. В какой-то момент может произойти попытка нормализации нулевого вектора, это и в старом варианте возможно, но вероятность ниже. По идее, когда цель достигнута в некотором незаметном для глаза приближении, нужно прекращать расчёты.


И при этом ты удивляешься, почему же я удлинняю код?

Наверное потому, что, в числе прочего, у меня это предусмотрено?
Код: Выделить всё
            If dist <= tolerance_radius And V2Length(V2Scale(.Speed, dt)) <= tolerance_radius Then
                .Speed.X = 0: .Speed.Y = 0
                .MovementPhase = Idling
            Else
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Движение курсором.

Сообщение Mikle » 11.04.2015 (Сб) 12:57

Хакер писал(а):И при этом ты удивляешься, почему же я удлинняю код?

Не поверишь, я это предвидел ещё в первом варианте, но не фиксировал потому, что там я показал именно математику, а с точки зрения математики будет бесконечное приближение к нулю, там нет ограничения точности. Впрочем возможны варианты точного совпадения координат, когда для достижения цели нужно целое число тиков времени. Но, опять же с точки зрения математики, вероятность такого совпадения стремится к равна! нулю.
Это не был пример правильного программирования, это был пример, объясняющий физику процесса.
А у тебя есть явно лишнее, например - четыре фазы полёта. Их достаточно двух - "летим" и "прилетели".

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Движение курсором.

Сообщение Хакер » 11.04.2015 (Сб) 12:59

Mikle писал(а):А у тебя есть явно лишнее, например - четыре фазы полёта. Их достаточно двух - "летим" и "прилетели".

Почему же? С чего бы?

Поле с фазой используется, чтобы впоследствии определить, что вообще делать: разгоняться или тормозить.

У меня отделена логика принятия решения (некий контроллер принимает решение, что делать, анализируя ситуацию) от логики физических расчётов (добавление a·dt к v). И это правильно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 64

    TopList  
cron