# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
3 теста |
|||
На этом уроке мы создадим простой конвертер валюты. Будем переводить рубли в доллары по текущему курсу. Отчёт отправил: 10080. FireWolf Выполнено за 10 дней 22 час. 45 мин. [Показать отчёт] Научился: Так как делать в WPF такой интерфейс для меня уже слишком просто, то я решил усложнить себе задачу и делать программу под Андроид, и в процессе узнал много хорошего про создание интерфейса под Андроид и много плохого про стабильность работы дизайнера интерфейса под Андроид в Visual Studio... Сложности: Найти решение для исправления ошибки с отображением дизайнера интерфейса. |
|||||
2 | WPF. Конвертер валюты. Класс конвертации. |
3 теста |
|||
На этом уроке мы создадим класс для конвертации валюты.
Отчёт отправил: 10080. FireWolf Выполнено за 1 день 12 час. 6 мин. [Показать отчёт] Научился: Делаю под Андроид, так что с прошлого урока научился простому способу исправлять баг VS с пропаданием кнопок переключения между дизайнером/кодом Layout'а. Хочу сделать в программе конвертацию с выбором между несколькими валютами, так что в следующем уроке надо подумать, как запрашивать с сайта курсы между разными валютами и как часто их обновлять. В такой программе это не принципиально, но вместо double я решил использовать decimal - финансовые расчёты как-никак :) Ещё размеры элементов надо причесать - но это уже в конце, как всё заработает. |
|||||
3 | WPF. Конвертер валюты. Курс валют в JSON. |
1 тест |
|||
На этом уроке мы загрузим JSON с курсами валют. Используете сервис: https://currencylayer.com/ Отчёт отправил: 10080. FireWolf Выполнено за 10 час. 6 мин. [Показать отчёт] Научился: Классы парсера и конвертера сделал пока статичными. Строку запроса собираю в StringBuilder, чтобы можно было подставлять ключ и валюты (пока куски строк указаны сразу, но в конце сделаю получение ключа из настроек в другом Activity и, возможно, отдельные запросы для разных валют). Для конвертации в несколько валют думаю между запросами курса для конуретной конвертации или запрашивать сразу несколько курсов и сохранять их в Dictionary. Также в настройки надо добавить периодичность обновления курсов, чтобы не выбрать месячный лимит запросов :) А так, пока программа уже рабочая (пока из долларов в рубли). На телефоне запускается, получает курс с сервера и пересчитывает. Но вот эмулятор Андроида выходить в и-нет не хочет никак :( |
|||||
4 | WPF. Конвертер валюты. Ньютон против Паскаля. |
2 теста |
|||
На этом уроке мы десериализируем JSON с использованием сторонней библиотеки от Newtonsoft. Напишите, что ещё вы добавите в эту программу. Отчёт отправил: 10080. FireWolf Выполнено за 6 дней 17 час. 2 мин. [Показать отчёт] Научился: Сделал под Андроид, так что я теперь умею делать простенькие мобильные приложения :) Кроме того, что эта программа под Андроид, я ещё немного отступил от предложенного в уроке: 1) По возможности сделал классы, методы и поля статичными - кроме сохраняемых значений и передачи данных в основном тут идёт просто обработка и возврат значений. Да и хотел потренироваться со статичными классами. 2) Сделал ввод ключа в отдельном окне настроек - хотел понять, как работать с несколькими окнами в Андроиде и возвращать из них данные. 3) Сделал сохранение ключа в настройках приложения, чтобы не вводить его заново, да и надо это тоже уметь :) 4) Добавил выбор из какой валюты в какую конвертировать, а всё конвертирование сделал через decimal - оно как раз для финансовых данных :) 5) Соответственно, строка запроса к сайту формируется в StringBuilder с подстановкой из какой валюты в какие - запрашиваются сразу несколько валют в какие будет конвертироваться, чтобы не делать лишних запросов. Полученный JSON парсится и сохраняется в Dictionary по ключу из какой валюты конвертируется. 6) Веб-запрос формируется, если ключ исходной валюты отсутствует в Dictionary или имеющийся там Timestamp более чем на 2 часа отстаёт от текущего, иначе берётся из Dictionary. 7) Чтобы сделать программу более гибкой и не плодить кучу шаблонов для разных вариантов отпарсенного JSON хотел сначала работать с ним как с динамическим объектом через отражения с формированием запроса поля, составленным из строки GetField(from (например "USD") + to (например "RUB")), правда оказалось, что с JObject можно работать как с Dictionary, так что потренироваться с Reflection не удалось, но возможность составлять запрос по ключу из строк пригодилась :) 8) Курс для выбранных в данное время валют сохраняется, чтобы далеко не ходить при каждом событии ввода цифры :) 9) Так как бесплатный тарифный план на apilayer.net позволяет конвертировать только из USD, то при проверке поля success в ответе сайта подставляется курс 1.00. Но, при апгрейде тарифа всё теоретически должно само заработать и для других исходных валют. Можно конечно сделать в таком случае пересчёт валют через доллар, но это сделаю если вдруг почту засыпят требованиями выложить программу в PlayMarket :))))) тогда и интерфейс дошлифую :))) Сложности: Сложным было заставить эмулятор коннектиться к сети, но в результате он сам заработал как надо. Не мог получить доступ к полям через Reflection, а оказалось, что оно и не нужно :( Видеообзор: _HBusxYgeEc |
|||||
5 | WPF. Простая змейка. Эллипс на канвасе |
2 теста |
|||
На этом уроке мы создадим упрощённую версию игры "Змейка". Змейка состоит из одного кружка и бегает за одним кроликом. Наша цель - понять, как делать анимацию на WPF. Отчёт отправил: 10080. FireWolf Выполнено за 1 день 3 час. 43 мин. [Показать отчёт] Научился: Так как после написания Калейдоскопа и Арканоида под WPF в данном уроке я нового для себя не узнал бы, то я решил закрепить навыки написания приложения под Андроид, полученные при написании конвертера валют из этого курса и игры в цифры из курса Наноигры, и написать Змейку тоже под Андроид. Оказалось, что в Андроиде есть некоторые ограничения по использованию Canvas - его нельзя поместить внутрь какого-нибудь Layout'а, так что название программы и менюшки оказываются недоступными. Наверное, сделаю вызов нового Activity при старте игры. Но главное я смог вывести красный кружок - чувствую будет очень интересно это программировать! Сложности: Пока ничего, но предвижу проблемы с реализацией управления жестами, так как с ними не работал ещё, а также пока не пробовал делать перемещение графических объектов по Canvas в Андроиде. |
|||||
6 | WPF. Простая змейка. Таймер для еды. |
1 тест |
|||
На этом уроке мы добавим таймер и будем выдавать игру по тикам.
Отчёт отправил: 10080. FireWolf Выполнено за 3 дня 6 час. 3 мин. [Показать отчёт] Научился: Делаю под Андроид :) Когда в отчёте о выполнении предыдущего урока я предположил, что будет интересно, то и не представлял насколько, хотя и чувствовал смутную тревогу перед будущим... В общем суть такова: Нельзя просто так взять и нарисовать что-то на Canvas! То-есть можно, но только один раз при создании канвы. А чтобы сделать что-то по таймеру, то надо это делать через лямбду RunOnUiThread, да ещё делать перерисовку канвы через Invalidate каждый раз... И это не говоря о том, что Layout в виде Canvas представляет собой не xml/axml файл, а cs и логика для отрисовки находится в нём! (правда и в WPF можно всю или почти всю логику тоже в XAML запихнуть). Вот теперь думаю, как съеденную еду убирать в следующих уроках, чтобы сохранять змею: сохранять координаты еды и перерисовывать только тот участок (и также поступать с хвостом змеи) или перерисовывать всё? Будет ли разница в быстродействии вообще? Или вообще делать на Xamarin Forms - там вроде почти WPF. Но это будет неспортивно! Сложности: Собрать воедино разрозненные сведения о рисовании на Canvas в Xamarin, о перерисовке Canvas и о работе с UI через события, чтобы сделать такую элементарную вещь, как обновление канвы по таймеру. Нигде нет внятного руководства, только мануалы по отдельным несвязанным азам работы и читаты оттуда же. Прямо закрытая секта разработчиков под Android какая-то! Видеообзор: TJqMo66HoCI |
|||||
7 | WPF. Простая змейка. Управление движением. |
1 тест |
|||
На этом уроке мы отобразим змейку, заставим её двигаться под управлением с клавиатуры. Отчёт отправил: 10080. FireWolf Выполнено за 6 дней 9 час. 27 мин. [Показать отчёт] Научился: Продолжаю делать под Андроид :) Добавил перемещение "змейки" по движению пальца. По сравнению со старым, добрым, простым и понятным (всё познаётся в сравнении) WPF, в Xamarin конечно есть свои странности. В частности расположение элементов на канве надо задавать в момент вызова события OnDraw, и значит там надо делать "вилку" - для изначального расположения "змейки" в центре экрана или для послудующих управляемых положений. Наверное, есть какой-то способ заранее узнать размеры будущей канвы и просто заранее задать начальные значения для змейки без лишнего условия? В любом случае пытаться разобраться в программировании под андроид мне очень понравилось, хотя и требует много времени, в том числе и из-за медленного взаимодействия студии и эмулятора. Далее надо сделать анимацию поплавнее и, возможно, заменить полный Invalidate, на локальный. Сложности: Собирать по крупицам информацию о работе разных аспектов приложения и увязывание их вместе. Конечно, если бы я не пробовал делать приложения на WPF до этого, то мне было бы гораздо сложнее разобраться с Xamarin :) Видеообзор: hoChc_mSySU |
|||||
8 | WPF. Простая змейка. Победа и поражение. |
1 тест |
|||
На этом уроке мы запрограммируем правила победы и проигрыша. Напишите, что можно добавить. Отчёт отправил: 10080. FireWolf Выполнено за 18 дней 5 час. 20 мин. [Показать отчёт] Научился: Так как делал под Андроид, то научился ещё лучше справляться с весьма альтернативным программированием под Xamarin :) Понял, что в любой непонятной ситуации, когда на экран не выводится что-то, что должно выводиться, надо использовать лямбду RunOnUiThread :) В целом делать под Xamarin довольно интересно и тренирует выдержку, чтобы удерживаться от сквернословия :) Думаю, что большинство проблем от того, что я пытаюсь работать напрямую с канвой и лучше было бы использовать какую-нибудь библиотеку для работы с графикой, но думаю, я уж лучше сейчас помучаюсь с канвой, зато потом будет отдых, когда буду с графическими библиотеками колдовать :) Попытался сразу сделать растущий хвост змеи и выводом всего дела обходом коллекции, но всё равно только голова выводится, хотя в коллекции есть отдельные сегменты с разными координатами. Буду смотреть дальше. Сложности: У меня сгорел ноут. Пусть он был старый и тормозной, но интеловский процессор позволял запускать эмулятор Андроида с интеловской библиотекой HAXM. Мой стационарник же на старом АМДшном Феноме, что вызывает много боли при попытке запустить эмулятор Вижуал Студии. Genymotion в принципе работает, но написанные мной программы в этом эмуляторе не запускаются - видимо несоответствие набора команд. Победить мне пока не удалось, как я не пытался менять набор команд при компиляции... Попробую в следующий раз Bluestacks - может заработает? А то держать телефон на проводе у компа не очень удобно. |
|||||
9 | WPF. Простая змейка. VIP урок. Длина тела. |
|
|||
На этом уроке мы научим змейку удлиняться.
Отчёт отправил: 10080. FireWolf Выполнено за 5 час. 5 мин. [Показать отчёт] Научился: Ура! Я доделал змейку! Как оказалось, проблема с отображением только головы змейки заключалась в моём ошибочном предположении, что ShapeDrawable являет собой структуру, а не класс. Под Андроидом простое решение как для WPF не подходит, так как канва не хранит в себе объекты и надо озаботиться коллекцией объектов самому. Возможно в других View с этим легче, но я делал напрямую через канву (не делайте так! :) ) Попутно научился снимать скриншоты и записывать видео через ADB :) Сложности: Все сложности были решены на предыдущих уроках :) Видеообзор: 0dpJjqExqsA |
|||||
10 | WPF. Финальный урок |
без видео |
|||
Запиши видеообзор созданных тобою программ на C# по технологии WPF.
Отчёт отправил: 10080. FireWolf Выполнено за 51 мин. [Показать отчёт] Научился: Потренировался в записи обзоров. Видеообзор: U1jgsFaXB-Q |
|||||
11 | WPF. Простая змейка. VIP урок. Поймай хвост! |
1 тест |
|||
На этом уроке мы узнаем, как поместить в объект эллипса координаты каждой части туловища. А потом сделаем проверку на "самоедство". При попытке поймать хвост игра должна заканчиваться. Однако хвост поймать ещё не так просто будет :) Придумайте, что ещё можно добавить в эту игру и сделайте это! Отчёт отправил: 10080. FireWolf Выполнено за 12 час. 7 мин. [Показать отчёт] Научился: Так как я изначально стал делать Змейку под Android, то реализовать методом опроса Children в Canvas. Более того, я делал Змейку под голый Xamarin без всяких фреймворков, а прямая работа с полотном там очень неудобная и требует держать часть логики в основной Activity, а часть реализовать в отдельном View, где и создаётся Canvas. Разумеется, так как делал я делать не надо, а надо использовать какой-нибудь фреймворк для создания игр, а ещё лучше Unity. Сама Змейка была у меня уже давно сделана, но я захотел доделать курс и реализовать "самоедение". Какие были сложности: 1) Из-за прямой работы с Canvas пришлось разнести логику игры отдельно в Activity и отдельно во View. По хорошему, надо в MainActivity держать меню игры, а из него вызывать отдельную Activity для игрового поля и из него управлять состоянием View с Canvas внутри. Впрочем, у меня и так получилось, что во View происходит весь расчёт картинки, который по таймеру в MainActivity перерисовывается и запрашивается для проверки съедения хвоста, выхода за границы или выигрыша. Возможно, есть более эффективный и прямой способ, и если я решусь ещё раз на подобный эксперимент, то я буду делать немного по другому 2) Для отрисовки необходимо запрашивать UIThread, иначе на экране ничего не появится, что немного похоже на WPF, так что просто надо посмотреть, как это правильно вызывается :) (Подсказка: RunOnUiThread(() => SomeMethod());) 3) Так как у Canvas нет Children, то все части змейки надо держать в какой-то своей коллекции. Я для этого использовать Dictionary, куда записывал части змейки для отрисовки с крутящимся по кругу счётчиком в качестве ключа. Конечно, можно было использовать LinkedList или поколдовать над обычным List, чтобы он работал как Queue, но это не эффективно, потому что постоянно нужно добавлять/убавлять объекты. 4) Код сложно дебажить, так как обратной связи от Visual Studio гораздо меньше, чем если просто писать под .NET и не всегда срабатывают Breakpoint, так что без опыта написания под Android придётся страдать (как мне :)). 5) Очень мало информации по тонкостям написания под Android - такое ощущение, что программисты для мобильных устройств это какая-то тайная секта! А руководства по Xamarin по своей сухости сравнимы со списком сносок в конце научных статей, а по понятности с инструкциями по сборке вида "деталь А16, вставьте в деталь Д07 и закрепите шурупом Ф71". 6) Для реализации "самоедения" я по достижении определённой длины змейки, пропуская несколько сегментов, отправлял остальные сегменты на проверку пересечения головой (получилось использовать ранее написанный метод проверки пересечения с едой), но не сразу удалось сообразить в каком направлении крутить счётчик для опроса Dictionary с сегментами тела змейки (да, жаль что нельзя обходить Queue по индексу - жизнь была бы проще). В любом случае я рад, что решил пойти сложным путём и делать Змейку именно под Android. После этого WPF уже вообще кажется по сложности чем-то для начальных классов. Так как опыта у меня мало, это был для меня серьёзный вызов и тем более приятно, что я сним справился (вообще я обычно скромный :)). Сложности: Ответить на вопрос "Зачем я это делаю?" |
|||||
12 | WPF. Аудиотреннинг |
1 тест |
|||
На этом уроке мы напишем программу, которая поможет вам записать аудиотреннинг и перепрограммировать себя на успех и на развитие. С помощью программы Audacity мы запишем тренинг в mp3 файл. Слушайте свои тренинги в наушниках на минимальной громкости 7 часов каждый день. И через пару месяцев увидите результаты. К сожалению, быстрее не получится. |
|||||
Итого: 12 видеоуроков |
1 час. 45 мин. 16 тестов |
19 чел. | |||
Финалисты: Николай Денисов, Александр, Андрей Шевченко, Иван Воронин, Tekashnik, Snepper, Роман, zhikharevav, ser2018, Александр Балбашов, Oleksandr, Владимир, Александр, Max, Yefim, Кирилл, Дмитрий, MaxB, One . |