Первые наработки

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

Из зданий реализованы два - Генератор и Призматическая башня. Модели использованы те, которые вы видели в соответственном ресурсе, правда, материалы для них все еще не подобраны, поэтому они такого синевато-зеленовато-светло-непонятного цвета. Лучи - стандартная опция интерфейса, и пока используются только в тестовых целях. Камера в игре на подобие стратегической. В общем, демонстрация.
Как вы видите, призматическая башня корректно направляет луч, будь он направлен Генератором или другой башней. Вращение осуществляется по нажатию правой кнопки мыши. Выделение - левой.
Не обращайте внимания на интерфейс, он был взят с того же шутера (мне лень пока делать новый, а исходники старого утеряны), позже я его перерисую.

Технические подробности
Теперь я попробую разбить возникшие у меня проблемы на категории, чтобы текст не выглядел сплошной стеной, и его было легче читать. Например, поделю его на решенные и нерешенные проблемы.

Решенные проблемы

Ну, таковых было много.
  • При наличии генератора и двух башен, например, А и Б, возникал один баг. Припустим, луч генератора направлен на А, и луч с А направлен, соответственно, на Б, с которого луч был направлен в пустое пространство. И если генератор повернуть так, чтобы его луч не трогал башню А, то ее луч, ясное дело, исчезал. Но не исчезал луч башни Б. Проблема оказалась элементарной. Дело было в том, что луч может перестать "питать" башню в двух случаях - когда "хозяин" луча менял угол, и когда луч просто исчезал. Ну, и оказывается, я просто не принял в расчет вторую ситуацию, и башня А понимала, что луч на нее больше не светит, а башня Б - нет.
  • Проблема, похожая на предыдущую, но обернутая. Есть функция, рассчитывающая, должен ли выходить из башни луч. Она проверяет, занята ли переменная, отвечающая за входной луч. Если нет, то луч уничтожается, и запускает действия, необходимые для фикса вышеуказанной проблемы. А если есть, то она проверяет, существует ли выходной луч, и если нет, то создает его. Сама проблема была в том, что, если убрать от башни луч, при повторном наведении луча на него она не работала. Причина оказалась банальной - когда мы убираем луч от башни, мы уничтожаем выходной луч. Но дело в том, что удаление луча не обнуляет переменную, к которой он присвоен. В итоге, башня всегда считала, что луч у нее уже есть. Вылечилось обнулением переменной в соответственных ситуациях.
  • При наведении луча башни А на башню Б, и, соответственно, башни Б на башню А, игра тупо крашилась. Проблема была в том, что наведение луча на башню присваивало ей этот луч в качестве входного, не смотря на то, что у нее уже был входной луч, и, в итоге, одна башня заставляла перерассчитывать свой выходной луч, который становился входным лучом для второй башни, который заставлял ее перерассчитывать свой выходной луч, и т.д., в итоге, игра просто зацикливалась, на что движок сразу реагирует крашем. Теперь башня просто игнорирует входной луч, если у нее уже есть один.
  • При получении приказа о повороте к определенной позиции, башня определяет, в какую сторону ей крутиться ближе. Иногда бывал глюк, когда башня начинала крутиться, не останавливаясь. Дело в том, что в качестве условия, правильно ли повернута башня, использовалась разница между текущим и необходимым углами поворота. А в меру того, что поворачивается башня с определенным шагом (если поворачивать по 1, то это очень медленно), и того, что необходимый угол может быть любым (в том числе, не кратным шагу поворота), условие это никогда не осуществлялось. Решилось, когда разница между необходимым и текущим углами стала не сравниваться с нулем, а проверяться на то, меньше ли она шага поворота. Второй глюк был в том, что в меру особенностей углов в UE3, разница эта увеличивалась, а не уменьшалась. Решилось перерасчетом соответственного угла, чтобы он оставался в определенных рамках.
Может быть, были еще глюки, но я уже не помню точно.

Нерешенные проблемы

  • Похожая проблема с описанной в первой новости предыдущего концепта. При передвижении камеры сравнивается положение курсора с границами окна, а поскольку курсор спавнится на (0;0), при старте игры, камера движется вверх и влево.
  • Системы частиц типа луча полностью игнорируют мои попытки управлять ими. Пытаюсь найти необходимый код.
  • Вращение башни останавливается, если разница между текущим и необходимым углами меньше шага вращения. Ну и фишка в том, что башня повернута не на тот угол, который нужен, а на ближайший кратный к шагу вращения.

Вот, в общем-то, и все. Думаю, я приступлю к моделлингу, а после, к скриптингу делящей башни. Вы узнаете, когда будут результаты.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
11 лет назад
0
При наличии генератора и двух башен, например, А и Б, возникал один баг. Припустим, луч генератора направлен на А, и луч с А направлен, соответственно, на Б, с которого луч был направлен в пустое пространство. И если генератор повернуть так, чтобы его луч не трогал башню А, то ее луч, ясное дело, исчезал. Но не исчезал луч башни Б. Проблема оказалась элементарной. Дело было в том, что луч может перестать "питать" башню в двух случаях - когда "хозяин" луча менял угол, и когда луч просто исчезал. Ну, и оказывается, я просто не принял в расчет вторую ситуацию, и башня А понимала, что луч на нее больше не светит, а башня Б - нет.
Ты просто не правильно подошел к понятию луча и рассматривал его как 2 совершенно разных луча. А надо было рассматривать его как одно целое. Как я делал в HLL
struct TLaserRay
        TVector2D pos
        TVector2D direction
        TLaserRay back = 0
        TLaserRay next = 0
        method Destroy takes nothing returns nothing
                if .next != 0 then
                        call .next.Destroy()
                endif
                call .destroy()
        endmethod
endstruct
То есть луч - это связанный список. При удалении какого либо элемента, удаляются все последующие. И при этом мы имеем доступ к каждому лучу и можем получить доступ к любому с помощью .next и .back.
0
29
11 лет назад
0
башня определяет, в какую сторону ей крутиться ближе.
Стандартная функция UE или сам как-то?
0
26
11 лет назад
Отредактирован lentinant
0
Doc, сам. В UE фишка в том, что угол не в градусах, а просто интовое число (не 0-360, а 0-65536, плюс, минусовая часть). Если разница между необходимым и текущим углом больше нуля, то угловая скорость положительная, если меньше нуля - отрицательная. После этого еще один расчет - если модуль угла, на который нужно повернуть башню, больше 32768, то угловая скорость меняет знак, а необходимый угол меняется на противоположный (в зависимости от знака добавляется или вычитается 65536). И только после этого башня начинает поворачиваться.
alexprey, вряд ли тут подойдут джассовые методы решения проблемы. В общем, проблема решена, и пересматривать метод решения я не буду, если только не возникнут связанные с ним проблемы.
0
29
11 лет назад
0
lentinant, я просто тебе пример показал на коде, который у меня был ща под рукой. Короче учи матчасть
0
26
11 лет назад
Отредактирован lentinant
0
alexprey, со связными списками я работал еще на Паскале. А мой код, по сути, и работает по этому принципу (просто я не сразу это понял). В здании есть переменные входящего и исходящего луча, у каждого исходящего луча есть переменная в виде целевой башни, а у целевой башни этот луч находится в качестве входящего, и т.д.. Функция перерасчета луча при определенных условия вызывает функцию перерасчета луча у следующей башни и т.д.. Просто в Unreal Script это не так уж и тривиально реализовать. Особенно с учетом того, что у меня каждый луч - отдельный объект.
0
29
11 лет назад
0
lentinant, ну в принципе да, у меня так и есть. Просто из твоего описания ошибки, я понял, что ты делал это как то странно.
lentinant:
Особенно с учетом того, что у меня каждый луч - отдельный объект.
ну так я про это и говорил и у меня так сделано. Один объект ссылается на следующий и предыдущий. У меня танцы с бубном начинаются только в момент просчета препятствий для луча. В варе, это сделать не так то и просто, если еще и взять особенности "2д движка" проекта, поэтому там приходится вручную смотреть кучу шагов на определение коллизий и прочего
0
27
11 лет назад
0
хорошая наработочка, модельки круто смотрятся, да
но не достает SHOOP DA WOOP
0
29
11 лет назад
0
А может быть сделать лазер потолще?
0
26
11 лет назад
0
alexprey,
Лучи - стандартная опция интерфейса, и пока используются только в тестовых целях.
...
Системы частиц типа луча полностью игнорируют мои попытки управлять ими. Пытаюсь найти необходимый код.
0
29
11 лет назад
0
Похожая проблема с описанной в первой новости предыдущего концепта. При передвижении камеры сравнивается положение курсора с границами окна, а поскольку курсор спавнится на (0;0), при старте игры, камера движется вверх и влево.
Запрещай управление при старте игры на долю секунды и перемещай курсор в центр
0
26
11 лет назад
Отредактирован lentinant
0
alexprey, в том-то и дело, что я пытался. Но с этим возникают определенные нюансы.
0
29
11 лет назад
0
lentinant, плохо значит пытался, пробуй еще
0
26
11 лет назад
0
alexprey, сейчас как раз пробую одну фишку, в новом интерфейсе.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.