Я борюсь с тем, как реализовать оружие ближнего боя, которое может качаться при нажатии клавиши.
Я представляю две разные атаки (удар и удар)
Я попытался создать два приспособления (персонаж + оружие), два разных тела, два разных тела + вращающееся соединение, но я не могу закодировать его так, чтобы он вел себя так, как я себе представляю.
STAB:
Таким образом, при нажатии кнопки тело / прибор (датчик) выходил бы на ~ 1 секунду и затем исчезал (в качестве альтернативы, тело / прибор всегда мог находиться на герое и просто поворачиваться на 90 градусов вокруг вершин при нажатии, и потом вернись в нормальное состояние)
SWING:
То же самое, но теперь оружие будет начинаться сверху и качаться вниз. Оружие также будет сенсором.
Что я пробовал:
Я создал два динамических тела.
Оружие должно следовать за героем, поэтому я использовал вращающийся сустав, чтобы удержать их вместе. Когда клавиша нажата, я устанавливаю угловую скорость оружия на число. Однако оружие продолжит вращаться после того, как я отпущу ключ. Я попытался реализовать проверку if (если угол больше ___, установить угловую скорость на ноль). Однако это просто означает, что оружие перестанет вращаться, когда я нажму клавишу во второй раз.
Ответы:
Кстати, я сделал именно то, что вы пытаетесь сделать. Единственная загвоздка в том, что я использовал Jbox2d, поэтому код написан на Java, но вы все равно сможете понять это, если используете C ++.
В основном вам нужно использовать суставы / моторы и все эти забавные вещи, если вы хотите заниматься качанием. Вот фрагмент того, как мой код выглядит на основе ввода ключа:
А затем, что касается создания оружия и тому подобного, фрагмент выглядит следующим образом.
Я понимаю, что здесь много чего происходит, но, вероятно, будет проще, если вы просто спросите меня, что вам нужно, и я объясню это. Если вы никогда не использовали ничего из этого, вам, вероятно, придется немного почитать.
EDIT >>
Поймите, Box2d имеет все обнаружение столкновений и физику, встроенную в свои библиотеки. Примите это к сведению, когда я говорю, что легче понять их систему, чем пытаться делать все с нуля. Если вы хотите столкновения, вы используете приборы bodydefs, если вы хотите, чтобы они вращались или двигались, вы используете суставы. Поначалу это может показаться немного сложнее, но, в конце концов, это экономит вам бесконечно больше времени на использование их методов.
На самом деле, я бы предположил, что вы, вероятно, никогда не закончите, если будете пытаться делать что-то с нуля, предполагая, что вы создаете физическую игру. Потому что вычисление таких вещей, как трение, плавучесть и не говоря уже о / эффективном / обнаружении столкновений, займет у вас всю жизнь.
источник
Я нашел какой-то обходной путь, но я не уверен, что это хороший способ кодирования.
Когда клавиша нажата, я устанавливаю угловую скорость на 10, а затем при каждом обновлении прошу ее проверить
источник
if(weapon.getAngle() <= 0)
вы также должны вручную поставить его под конкретный угол, который вы хотите, иначе он не будет точным, и вам нужноif-else
утверждение вместоif-if
. Все сводится к базовому Java-кодированию, которое не очень связано с конкретной игровой проблемой.Из того, что вы говорите, кажется, что вам также может понадобиться просто переместить код, который сбрасывает угловую скорость после достижения определенного угла. Я подозреваю, что этот код используется только при нажатии кнопки, поскольку вы говорите, что повторное нажатие кнопки останавливает движение (и, таким образом, заставляет работать код тестирования).
Если это так, вы можете переместить его в оператор «else» после кода, который проверяет, нажата ли клавиша.
источник
Одна вещь, которую вы могли бы сделать, - это команда, запустив метод, который создаст тело относительно позиции основного тела, используя body.getPosition.set (); установите биты фильтра, чтобы они не сталкивались, затем установите линейную скорость или приложите силу, независимо от того, что вы хотите, чтобы переместить его вперед после запуска таймера, чтобы уничтожить после x количества игровых циклов.
Или вы могли бы сделать то же самое, но вместо этого создать дистанционное соединение, объединенное с призматическим соединением только вдоль оси x, чтобы сделать внезапное движение выталкивания с соединенным столкновением ложным, чтобы он не сталкивался с основным корпусом, эта опция вероятно, работать лучше,
для атаки свингом создайте похожее тело, повернутое на половину числа пи с помощью только кончика меча, соединенного с основным корпусом, со столкновением, равным ложному, конечно, тогда вы можете приложить двигательную силу к суставу угловым импульсом к телу меча уничтожение его после достижения заданного вращения тела или наступления определенного времени,
если требуется дополнительная помощь, просто прокомментируйте ниже
источник