Reflection Laser Gun

Как пользоваться

Первичный огонь — стреляет лазером,
Вторичный огонь — Запускает энергетическую гранату или создает энергетическую ауру,
Перезагрузить — Изменяет режим огня.


Режим 1 — Разветвляющий лазер. Луч разделяется еще на 3 при попадании, и они тоже ветвятся (рекурсивно). Берет два патрона из обоймы,
Режим 2 — Одиночный отражающий лазер. Луч несколько раз отскакивает от поверхности. Берет один патрон из обоймы.


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

Через некоторое время боеприпасы восстанавливаются автоматически.

Пассивно-агрессивный FAQ (традиция моих описаний аддонов)

— ЭТО КОПИЯ NOMAD БЕЗ ПОДПИСКИ!
— Он похож на Nomad, он похож на Nomad, а также на любое другое лазерное оружие, регенерирующее боеприпасы. Думаю, моя идея довольно интересна. Конечно, он вдохновлен Nomad, но никоим образом не копируется.

— Я вижу, вам очень нравится ParticleEmitter, и вы не удосужились менять частицы в разных эффектах.
— Да, в своих эффектах я использовал очень похожие настройки частиц и материалы. Сначала я тоже подумал, что это немного повторяется, но через некоторое время я увидел, что он сохраняет все в той же теме, и мне это нравится.

— В чем смысл еще одного энергетического оружия в мастерской? У меня в подписках уже 10.
— Тогда, я думаю, вам стоит отказаться от подписки на одну из них и подписаться на мою.

— Могу я использовать ваш код?
— И «да», и «нет». Если вы собираетесь скопировать мой код и пометить его как свой, то, конечно, нет! Но если вы собираетесь редактировать оружие, добавлять интересные эффекты, возможно, улучшать его или просто использовать в учебных целях, тогда да, конечно. Не стоит верить мне, если действительно не хочешь, но было бы хорошо с твоей стороны :)

— Как вы реализовали рекурсию?
— Если вы спрашиваете о рекурсии, я предполагаю, что вы не совсем новичок в кодировании. Возможно, вы слышали, что рекурсия опасна, потому что может вызвать переполнение стека, поэтому я использовал не «чистую» рекурсию, а нечто иное. С тех пор, как я использовал такой метод быстрой сортировки, я влюбился в него. Это просто, это не вызывает переполнения стека, потому что «псевдостек» полностью управляется кодером и работает с обычной оперативной памятью, а не с аппаратным стеком.

— Какая формула отражения вектора?
— Вот как я это делаю в этом аддоне:

local dir = (lastTrace.HitPos — lastOrigin): GetNormalized () endp = lastTrace.HitPos + (dir — 2 * dir: Dot (lastTrace.HitNormal) * lastTrace.HitNormal) * 65535

Итак, формула

refVector = incomingVec — 2 * dotProduct (incomingVec, surfNormal) * surfNormal

incomingVec нужно нормализовать и результат — refVector — нормализованный отраженный вектор.
Вы можете рассчитать incomingVec путем вычитания начального вектора луча из вектора положения попадания этого луча и последующей нормализации результата:

incomingVec = нормализовать (beamHitPos — beamStart)

В Lua вы нормализуете вектор, вызывая Вектор: GetNormalized () в теме.

— Хорошо, а как насчет этого метода рекурсии?
— Во-первых, вы не делаете рекурсию. Вместо того, чтобы выполнять рекурсивную функцию, вы создаете таблицу или Куча объект называется, скажем куча. Затем вы помещаете первую запись в этот стек:

stack = createStack () // в реальном Lua вы используете util.Stack (), но это псевдокод (что-то для вас, Bartek) stack.push ({someParameter = something, someParameter2 = something, recIndex = 1})

recIndex важно — с этим мы можем ограничить нашу рекурсию и не допустить, чтобы она приводила к сбою gmod, продолжаясь бесконечно.
После этого мы можем войти в цикл. Лучшим типом петли для этой цели является пока петля.

while (stack.size ()> 0) {var top = stack.pop () // снимаем последний элемент из стека if (top.recIndex

Как видите, это действительно просто. Вместо вызова рекурсивной функции вы передаете эти параметры в стек, а затем используете его в другой итерации, вставляя его. maxRecursion — это переменная, контролирующая рекурсию для предотвращения бесконечного цикла и использования всей доступной памяти.
Если вы знакомы с рекурсией, хорошо сначала разработать алгоритм «чистой рекурсии», а затем преобразовать его в стиль, основанный на стеке.

Рейтинг
( Пока оценок нет )
Funtik/ автор статьи
Понравилась статья? Поделиться с друзьями:
Добавить комментарий