
Научился: Так как я изначально стал делать Змейку под 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 уже вообще кажется по сложности чем-то для начальных классов. Так как опыта у меня мало, это был для меня серьёзный вызов и тем более приятно, что я сним справился (вообще я обычно скромный :)).
Трудности: Ответить на вопрос "Зачем я это делаю?"