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

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

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

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

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

Разгон и торможение - это одно и то же, они коренным образом отличаются только в 1D, если вектор скорости корабля изначально не направлен на цель, то вектор ускорения весь полёт не будет сонаправлен с вектором скорости, будет плавная коррекция вектора скорости, а понятия "разгон" и "торможение" применимы только к модулю вектора скорости, сам момент, когда рост модуля сменится его уменьшением нам совершенно не интересен.

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

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

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

Mikle писал(а):Разгон и торможение - это одно и то же, они коренным образом отличаются только в 1D

Во-первых, как ты можешь наблюдать, у меня реализована возможность использовать разные ускорения для разгона и торможения. Это может быть необходимым для достижения большей аркадности там, где не нужна излишняя физичность. В этом случае корабль будет медленно разгоняться, но тормозить будет гораздо быстрее. Для этого, очевидно, нужна просто особоая InitShipClassEx.

Mikle писал(а):если вектор скорости корабля изначально не направлен на цель, то вектор ускорения весь полёт не будет сонаправлен с вектором скорости,

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

Как только AI корабля обнаруживает, что боковая вредная скорость не равна нуля, начинается подавление этой скорости. Эта скорость давится до нуля с максимально возможным ускорением, на последнем (последнем — в плане гашения, а не в рамках полёта) же шаге dv специально выбирается так, чтобы за этот последний тик погасить это скорость в ноль.

Код: Выделить всё
                If Abs(side_speed * dt) > tolerance_radius Then
                    d_side_speed = V2Scale(ortoDir, -1 * ShipClassesTable(.iClassIndex).NormalAcceleration * dt * Sgn(side_speed))
                Else
                    d_side_speed = V2Scale(ortoDir, -side_speed)
                End If

После того, как сработает else-ветка, вектор скорости корабля на всём протяжении полёта остаётся сонаправлен вектору, смотрящему на цель.

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

Mikle писал(а):когда рост модуля сменится его уменьшением нам совершенно не интересен.

Рост модуля сменяется на неизменность модуля. Неизменность сменяется на уменьшение.

Момент смены значения поля «фаза движения» может и не важен на текущей стадии, но само поле безусловно важно: оно определяет, как вообще корректировать модуль скорости (варианты: увеличивать с ускорением TangentialAcceleration, не изменять, уменьшать с ускорением TangentialDeceleration). Оно бы могло стать локальной переменной в пределах той процедуры, где оно устанавливается, но дальновидным решением было сделать фазу — полем структуры SHIP_UNIT, потому что в этом случае в пределах игрового мира становится возможным определить, какое решение принял AI корабля, то есть, грубо говоря, жмёт он на газ или на тормоз, и в зависимости от этого, проигрывать звук ускорения или звук торможения.
—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 (Сб) 16:11

Хакер писал(а):Это может быть необходимым для достижения большей аркадности там, где не нужна излишняя физичность.

Получается что мы решали разные задачи. Но даже с точки зрения аркадности мне кажутся плавные траектории более красивыми.
Хакер писал(а):какое решение принял AI корабля, то есть, грубо говоря, жмёт он на газ или на тормоз, и в зависимости от этого, проигрывать звук ускорения или звук торможения.

Ещё стоп-крана не хватает :)
Спор ни о чём, я не говорю, что ты не прав, но мы о разных вещах ведём речь.
Задача топикстартера давно решена, а мы занялись баловством. В принципе, я не против, я азартный :), но желательно сначала поставить конкретную задачу. Я ставил себе задачу по возможности быстро долететь до цели и остановиться, имея двигатель фиксированной мощности и возможность направить тягу в любую сторону. Если бы стояла задача сделать движение гладким, но вовсе не обязательно физичным, я бы ещё проще сделал.

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

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

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

Mikle писал(а):Получается что мы решали разные задачи

У меня была задача: показать математику и хоть чуть-чуть правильную организацию кода. Ну и, естественно, надо было сделать так, чтобы корабль не менял свою скорость мгновенно. Остальное — следствия.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.04.2015 (Вс) 13:44

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

У меня почему-то возникает ощущение, что такая траектория неоптимальна. Я не прав?

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

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

Сообщение Хакер » 12.04.2015 (Вс) 14:37

Всякий разговор об оптимальности должен начинаться с изложения критериев оптимальности.

В целом, мой способ управления заставляет двигаться корабль примерно так, как движется человек на плоскости без препятствий: движется к цели по прямой, а если на ходу меняется точка назначения --- разворачивается по дуге и следует по прямой уже к новой точке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.04.2015 (Пн) 11:46

Хакер писал(а):Всякий разговор об оптимальности должен начинаться с изложения критериев оптимальности.

Я думал, критерий очевиден - скорейшее прибытие к цели.

Хакер писал(а):движется к цели по прямой, а если на ходу меняется точка назначения --- разворачивается по дуге и следует по прямой уже к новой точке.

Что-то я запутался в этой фразе.
Как я понял предыдущее описание: делатся как можно более быстрый выход на прямолинейную траекторию, ведущую к цели.
Что мне кажется оптимальным: наиболее плавное перемещение к цели, такое что компенсация вредного вектора растягивается на всё время движения. Т. е. если траектория не была прямолинейной изначально, она никогда не станет прямолинейной до момента прибытия.

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

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

Сообщение ger_kar » 13.04.2015 (Пн) 18:00

А разве может быть что-то оптимальнее, чем движение по прямой. :shock: Это вроде настолько очевидно.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.04.2015 (Пн) 18:15

ger_kar писал(а):А разве может быть что-то оптимальнее, чем движение по прямой. :shock: Это вроде настолько очевидно.

Но движение в любом случае не по прямой.
Интуитивно возникает ощущение, что если мы стараемся как можно скорее выйти на прямую, то мы стараемся направить ускорение в перпендикулярном к цели направлении, снижая таким образом ускорение в направлении цели. Соответственно, скорость полёта в направлении цели снижается. Так что, возникает желание распределить поворот на всю длину пути. Но математически мне это просчитывать как-то не хочется. Да и не уверен я, что достаточно формул помню...
Кстати, крайний вариант метода - сначала повернуться к цели, а топом уже лететь - оптимальным вообще не кажется, но у Хакера и не он. Вот и возникает подозрение, что что-то тут не то.
Хотелось бы, чтобы прокомментировал Хакер или Майкл - они явно в таких вещах лучше меня разбираются :)

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

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

Сообщение Хакер » 13.04.2015 (Пн) 18:17

Qwertiy писал(а):Соответственно, скорость полёта в направлении цели снижается.

Кардинально неверное умозаключение.
—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 » 13.04.2015 (Пн) 23:29

ger_kar писал(а):А разве может быть что-то оптимальнее, чем движение по прямой

Когда корабль изначально движется, и движение не направлено прямо на цель, по прямой двигаться не выйдет.
Qwertiy писал(а):Интуитивно возникает ощущение, что если мы стараемся как можно скорее выйти на прямую, то мы стараемся направить ускорение в перпендикулярном к цели направлении, снижая таким образом ускорение в направлении цели.

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

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

Я как-то сразу представил задачу именно максимально быстро достичь цели, имея фиксированную мощность двигателя.

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

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

Сообщение Хакер » 14.04.2015 (Вт) 1:41

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 » 14.04.2015 (Вт) 9:29

Согласен в общем. Но при движении в пределах одного экрана это вряд ли актуально.

Пред.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList