Погроммистское. Или конец жизни 2х годового проекта разработки
Переключение и выбор колесом мыши, кнопками на клаве. Написал свою UI библиотеку на WPF для программы, отказался от OpenCV (как-раз таки библиотеки для компьютерного зрения) и написал свой алгоритм распознавание, сугубо для игры. Под все разрешения экрана. Добавил автопропуск диалогов. И теперь это всё не нужно больше.
Вот всё это в Aurora Dialog Enhancer.
Делаем. Интерфейс?
Это не был мой первый проект, но на нём я учился новым штукам, так как эксперементировать на основной работе с кодом очень стрёмно.
Выбор пал на C# и NetFramework 4.8 потому что он вшит в Windows, и ничего ставить дополнительно не нужно. Так вес программы стал всего 3мб.
Нужно было нарисовать интерфейс. Ну тут только WPF позволял сделать красивости. Я хотел слизать его с Google Material, но мне нужно было... Ээээ. Смешивать полупрозрачные цвета
И для C# я ничего не нашел такого, потому посмотрел как оно работает на "Всемирном консорциуме веб-технологий 3"
И запрограммировал это. Что вообще ЭТО такое? Это - например как в фотошопе слои накладываются друг на друга с разными цветами и полупрозрачностями.
В общем, когда уже я всё написал, подмал что это будет муторно и от идеи такого интерфейса отказался, и нарисовал что-то своё, вынеся в отдельную библиотеку.
"Лучшие" моменты разработки
Распознавание изображений
Как всё началось можно почитать с старой статье.
Здесь пришлось математически описать шаблон облачков диалогов в сером цвете, с динамическим расстоянием между разными ключевыми точками, и контрастности перехода цветов, чтобы их опредлять. Всё шло сложно но нормально, пока не оказалось что для разных разрешений окна игры один и тот же шаблон с подстроенными коэффициентами не подходит. Я так и не смог найти и высчитать формулу, потому пришлось под все размеры экрана всё скринить и смотреть, а есть ли тут какая-то формула?
Нет, формулы нет. Ну или я очень затупил. Потому я сделал математические шаблоны для соотношений сторон экрана, а не прям разрещений
Главное что оно работает. Никому не интересно как, поверьте
Автозагрузка и права администратора
А права нужны для того что-бы повить глобальный перехватчик нажатий на клавиатуру. Ни никак иначе нельзя было сделать. И Майкрософт запрещают запускать автозапуском программы с правами администратора. НО!
В Винде есть Планировщик Задач
И туда можно добавить задачу с помощью... Ээээ. PowerShell скрипта, который можно запустить в фоне.
Это самая тупая идея для обхода такой проблемы, но она сработало. Правда занимает секунды 3-4 на выполнение :/
Одновременный запуск нескольких приложений
В моём случае - нужно было как-то это запретить, и открывать уже запущенное приложение. в WPF проекте это сделать нельзя, а вот в следующей его версии UWP есть отдельная галочка в настройках проекта. И шо делать?
Оказалось, лучшием решением было бы поднять локальный сервер/канал обмена сообщениями в системе, и посылать команду/слушать, если приложение запускается
NamedPipeServerStream
И закрывать текущее, если такое же уже запущено.
Блин, сложно, ладно, объясн. проще:
Знаете как можно запустить игру стим через исполнение комманды в Виндоус на Win+R
Вот Стим слушает такое. А я слушаю своё, но только когда запущенна программа.
Ослеживание фокусировки игры
Звучит немножко сложно, но в целом довльно просто. Мы вешам хук на перехват сообщений о том что какое-то окно получило фокус, или его потеряло, где всё это видно, вместе с идентификатором окна в системе.
SetWinEventHook
Но. Большое но. Я столкнулся с проблемой. Если запустить игру в окне (это важно) и переключиться на другое окно. А потом навести мышкой на значок игры в пуске и нажать. Игра развернётся, окно сфокусируется... Только вот Виндоус говорит что фокус сейчас у окна explorer. Я не могу это объяснить, жта проблема только с этой игрой. Но она не одна.
Проблема №2. Видете этот экран?
Что произойдёт если я нажму на него, начнётся грузится мир, и я переключусь на другое окно?
Правильно - игра пошлёт сообщение Винде что она сфокусирована. Но только сообщение, фокуса у неё не будет.
Я уже и спросил на StackOverflow типа ПОЧЕМУ!? ЧТО Я ДЕЛАЮ НЕ ТАК!? И мне сказали чтовсё так, но у тебя в коде странные решения.
А странные решения потому что я думал как это обойти. Поставил ещё фокус и на коик мышкой - что-бы при первом клике когда такое вот произошло, перефокусировать окно принудительно обратно.
Ну как-бы ладно. Я нашел другое - есть фокус окна, а есть фокус клавиатуры. И это разные фокусы - куда сейчас будут вводится команды с клавиатуры и на какое окно сфокустрованно сейчас. И, да, они могут быть разными. И в случае с Геншином, когда такое происходит, и когда фокус окна и клавиатуры разный...
Я это теперь отлавливаю и принулительно фокусируюсь на окне, у которого нет фокуса клавиатуры.Что я могу сказать - это костыль, но это криворукость разработчиков Геншина. Я не мог спать по ночам, думая как обойти эту проблему, но в итоге обошел.
А все другие сложности, они оказались и не сложностями. Просто заняли много времени. Эти же, что выше. Над ними пришлось долго думать. Ладно хватит о интересных проблемах
Подводим итоги
Я допиливал код, исправил разные штуки с асинхронностью, что-бы и привести код в порядок, выпустив последнее обновление, и на этом закончить всё что было на уме.
Ну и написать резюме с таким долгостроем-гигапроектом-портфолио-самипридумайтеназвание
Но в итоге, когда я дописал сегодня утром вот посленее что хотел, и мне оставалось только где-то неделя-две работы сделать разные другие штуки, я узнал об апдейте игры, и что моя программа не нужна более. Потому я всё закоммитил на гитхаб, сделал последнюю релизную сборку, и написал там прощальное сообщение.
Что я хочу вам сказать. В общем 36 звёзд ⭐ на Гитхабе с 1.3 скачиваниями. И 2.3к скачиваний на Gamebanana. В целом, неплохо.
Я многому научился как программист, было и весело, и интересно и сложно, и тащемта, но главное - я поверил в свои силы, и что всё возможно. И эта уверенность, что ты чего-то достиг, она помогает по жизни и с другими задачами. Типа "Я сделал в прошлом вот то, значит справлюсь и с этим - Ай Кэн Ду Ит"!!!
Программистам, кто это вдруг всё читает, я хочу сказать что - опыт приходит пока что-то делаешь. Ничего не делаешь - ничему не научишься. Ну и что языки программирования гов**. Пишите на чём хотите, это лишь инструменты, а самое главное - это идея.
На этом всё. Всем хороших дней. Я пойду чуть погрущу и буду думать что делать дальше (изучать юнити, или начать чёт ещё писать). В любом случае я не остановлюсьб, меня может остановить только семейная жизнь (которой нет).
(И, ДА, - У МЕНЯ ЕСТЬ ОСНОВНАЯ РАБОТА!!!)
P.S. Интересно было бы вам, начни я стримить. Что-то по погроммированию/игоры
Опять День РЖД напрограммировал какой-то хуйни
Круто!
Вот именно что какой-то хуйни, ЛОООООЛ. Всё так
Пон.
Эййййййй. Откуда это у тебя? 👀
Дееееееееньчик
Где
СООООООДАААААААААА