TGTGInsightтелеграм анализLIVE / telegram public index
← Такты, стеки, два колеса

TGINSIGHT SIMILAR POSTS

Намери подобно съдържание

Изходен канал @clockstackwheels · Post #892 · 29.10

Frostpunk — весьма самобытная игра-стратегия с интересной стилистикой. Изначально это видеоигра, но по ней не так давно вышла настолка, которую будут локализовать и официально привезут в Россию. Сейчас уже идёт предзаказ у издательства Фабрика Игр. Чтобы понять, хочу ли я настолку, решил наконец попробовать компьютерную версию, которая давно лежала в листе ожидания. По сюжету климат на Земле превратился в вечную сверхсуровую зиму, цивилизация уничтожена, и только жалкие остатки человечества пытаются выжить. Они нашли огромный угольный генератор (о том, как он появился, рассказывает дополнение к игре) и потихоньку строят город вокруг него. Основные ресурсы это уголь, дерево, сталь и пища, которые нужно добывать разными способами, попутно выстраивая как экономику, так и социальные взаимоотношения. Симуляция в игре прорабатывает действия и состояние каждого отдельного человека. Отправил кого-то работать на плохо отапливаемый завод — у него растёт шанс заболеть, после чего он работать не сможет какое-то время, и эффективность завода снижается. В итоге, заботиться об отоплении нужно не просто так, потому что игра командует, а с вполне конкретной практичной целью. Температура в мире постоянно снижается. Начинаешь ты при -20, а заканчиваешь активные действия уже около -80. У населения есть уровень надежды и уровень недовольства: в мою первую игровую сессию я проиграл как раз из-за его превышения. Нужно правильно выстраивать цепочку законов и других управляющих воздействий, определять направление развития исследований, решать конфликты. Вообще, считаю стратегии такого плана очень полезным опытом, потому что они, хоть и с сильным упрощением, показывают работу процессов на уровень выше, чем индивидуальные потребности человека. Вот ты, как управляющий, видишь, что уголь заканчивается, и, если срочно не добыть его больше, то кухня замёрзнет, тогда не будет еды, все умрут. Отправляешь людей на суточные смены, они возмущаются и называют тебя тираном, но ты то понимаешь, что иначе им же станет хуже. Посылаешь на работу детей и калек — выживание требует, ничего не поделаешь. Чтобы возмущение не росло, строишь дозорные вышки и обучаешь побольше стражи. Кто-то умер — не отвлекаемся от работы, завтра минус семьдесят, если лазареты с больными не обогреть, то умрёт ещё больше. Город в виде концентрических колец вокруг источника тепла — не только очень красивое решение, но и прекрасный образец хорошего UX для стратегии. У тебя все точки контроля под рукой, не нужно постоянно мотать камеру через всю карту. Ну и в целом игра очень логичная, это и плюс и минус. Минус, потому что после двух сессий ты уже будешь хорошо знать, что делать, так что реиграбельность страдает. Ещё заметно, что разработчикам не хватило денег на более дорогие анимации, катсцены, и вообще полировку мелочей. Но первая часть очень популярна, уже анонсирована вторая, авторы заработали, так что ждём всего больше и лучше! А настолку, наверное, возьму. #games

Hashtags

Резултати

Намерени 3 подобни публикации

Търсене: #viewmodel

当前筛选 #viewmodel清除筛选
Android Broadcast

@android_broadcast · Post #9572 · 18.10.2025 г., 11:35

Вот реальная история, как знание механики работы ViewModel спасло мне вечер 👇 У меня приложение на Compose и Jetpack Navigation 3 (работает на основе состояния Back Stack). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же ViewModel.❗️Баг: при переходе в папку навигация срабатывает, UI не меняется. Современные ИИ подсказали общие вещи, но не помогли — промты, видимо, подвели (тут мне ещё надо прокачать знания) 🙂 Вспомнил ключевой факт про архитектуру: 👉 Все ViewModel живут в ViewModelStore. 👉 В пределах одного ViewModelStoreOwner (Activity/Fragment/NavBackStackEntry) получение ViewModel по умолчанию идёт по типу. 👉 Если нужно несколько экземпляров одного типа на одном owner’е — используем key. Решение в одну строку — привязать ключ к ViewModel, связанный с текущей папкой: @Composable fun FileNavigator( folderId: Id, modifier: Modifier = Modifier, ) { // новый folderId → новый экземпляр ViewModel → новый UI-стейт val viewModel: FileNavigatorViewModel = viewModel( key = "files(rootId='$folderId')" ) // ... } Мини-чеклист, если ловите такой баг 👉 Один экран используется повторно с разными параметрами? → Нужен key. 👉 Меняется route, но owner тот же? → key обязателен. 👉 Используете Hilt/Koin? → У этих функций тоже есть параметр key (hiltViewModel(key=...), koinViewModel(key=...)). 👉 key должен детерминированно зависеть от входных данных (например, folderId). 👉 При навигации назад убедитесь, что ViewModel освобождается ожидаемо. Ещё нюанс - если у вас сложная иерархия графов, проверьте, к какому ViewModelStoreOwner вы реально привязаны. Рекомендую посмотреть мои видео по теме: 📹Разбор Jetpack Navigation 3 🪙Полный разбор Jetpack ViewModel в Android и Kotlin Multiplatform #android#compose#androidjetpack#viewmodel#архитектура

Android Broadcast

@android_broadcast · Post #8901 · 05.04.2025 г., 10:43

🤖Альтернативный способ обработке one-off событий из ViewModel (EN, 10м) В статье рассказывается в чем сложность с обработкой одноразовых событий, которые надо передать из ViewModel в UI. Автор рассматривает способ через callback интерфейс в конструкторе ViewModel @HiltViewModel class MyViewModel @Inject constructor( // inject the interface private val toastMessages: ToastMessages, ) : ViewModel() { fun doSomething() { viewModelScope.launch { try { // execute async operation here } catch (e: CustomException) { // initiate a one-off event toastMessages.showToast(e.localizedMessage) } } } } 🔗 Альтернативная ссылка на статью #android#viewmodel#dagger#hilt

Android Broadcast

@android_broadcast · Post #9683 · 20.11.2025 г., 14:59

🚀Lifecycle 2.10.0 вышел в стабильной версии! Google выпустила мажорное обновление библиотек Lifecycle. Этот релиз сфокусирован на улучшении интеграции с Compose. ⚙️rememberLifecycleOwner для Compose Новый композабл позволяет создавать изолированные LifecycleOwner внутри UI. Идеально для компонентов, которым нужно независимое управление состоянием — например, для HorizontalPager, где только активная страница должна быть в состоянии RESUMED. @Composable fun MyComposable() { val lifecycleOwner = rememberLifecycleOwner( maxLifecycle = Lifecycle.State.RESUMED, parentLifecycleOwner = LocalLifecycleOwner.current, ) CompositionLocalProvider( LocalLifecycleOwner provides lifecycleOwner ) { // Дочерние композаблы теперь имеют собственный жизненный цикл } } 🚀 Интеграция с Navigation 3 Новый артефакт lifecycle-viewmodel-navigation3 предоставляет готовый декоратор для автоматической привязки ViewModel к отдельным экранам в Navigation 3. NavDisplay( backStack = backStack, entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberViewModelStoreNavEntryDecorator(), // Добавляем эту строку ), entryProvider = entryProvider { /* ... */ } ) Удобства для разработчиков: 👉 Идиоматичный Kotlin API для создания кастомных CreationExtras CreationExtras { this[MY_CUSTOM_KEY] = "myValue" } 👉 Метод savedStateHandle.saved() теперь нативно поддерживает nullable типы 👉Конструкторы SavedStateHandle помечены как @VisibleForTesting ⚠️ Важное изменение Повышение minSdk с API 21 до API 23 — убедитесь, что ваше приложение соответствует новым требованиям. #Jetpack#Lifecycle#Compose#Navigation#ViewModel#Kotlin