Fail story: Пифагоров велосипед.
Приветствую тебя, читатель. Сегодня я начну небольшой цикл заметок о разработке своей очень простенькой, по факту, игры. Делал я её не то что бы очень долго, ибо c# и unity я знаю более менее. Сегодня чуток о мат. части, но для начала немного предыстории. Я не очень часто сталкивался с подобными задачами, чаще занимаясь проектированием всякого: мои отношения с математикой обычно начинались и заканчивались на олимпиадном программировании, которое я подзабросил пару лет назад. Но при этом мне всегда было интересно поведение алгоритмов, созданных мною. Ну да чуть ближе к сути.
Для игры мне потребовалось решить простую задачу: требуется написать функцию, которая выдает следующую ближайшую к цели точку так, чтобы траектория движения персонажа проходила по прямой. Однако задачу я себе решил слегка усложнить, оставив в качестве входных переменных только позицию игрока и точку назначения. Повторюсь, что ожидаемый результат - движение по прямой, насколько это возможно. Подумав, не подумав, что задача плёвая, я наскоро закодил первый пришедший в голову алгоритм, в котором вычислялись расстояния до точки назначения от (x+1;y) и (x;y+1), где (x;y) - координаты персонажа(для упрощения опустим подробности, что точка назначения может быть не только в первой четверти относительно игрока), после чего брала точку с минимальным расстоянием. Казалось бы: почему это может не работать. А вот, собственно, почему:
Затем я решил завязать движение на углах, вычисляемых через арктангенс, между теми же ближайшими точками и желаемой траекторией, брав меньший из них.
Задавшись тем же вопросом: а почему это может не работать, я закодил и это поведение и получил вот это:
На этом этапе я перестал верить в жизнь и ушёл в запой (какао - тоже алкоголь). Однако вернувшись я прошёлся итеративно по алгоритму с понял, что в никуда потратил день жизни, и без задания координат точки отправления задача не разрешима. Затем все стало куда проще - поведение стало таким, каким я себе его представлял изначально:
По сути это та же предыдущая реализация со сравнением углов, только не от текущей точки, а от точки отправления.
Мораль сей басни такова: solid, kiss, scrum, agile и прочие заморские термины безусловно полезны для любой разработки, но все-таки на codeforces для разминки периодически все же надо заходить, что я всем и советую делать. Впрочем, если кто знает способ решения задачи, не вводя дополнительные параметры - прошу в комментарии.
P.S. Сама игра на поздней альфе, если кому интересно - дам ссылку в следующих заметках.
P.P.S. Первопост, прошу кидаться исключительно мягкими камнями.




Лига Разработчиков Видеоигр
10.3K пост23.4K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"