Несколько лет назад по сети разошёлся один видеоролик с демонстрацией концепции игры. Оказывается, автор не бросил затею, и всё это время собирал команду и делал релизную версию. И вот игра вышла несколько дней назад под названием Viewfinder, я сразу купил и прошёл. Чтобы понять, в чём прикол, посмотрите кусочек моего геймплея ниже.
Viewfinder это в чистом виде паззл. Хоть и есть некая претензия на сюжет, игровой процесс всё равно состоит из того, что вы последовательно решаете задачки, используя показанный принцип. Сами задачки интереснее и сложнее, чем, например, в The Entropy Centre. Но всё равно я мало где надолго задумался, кроме задачи с арбузом (кто проходил — напишите, быстро ли смогли догадаться).
Однако, вот этот вот переход при размещении фотографии каждый раз ощущается очень кайфово. Ты прям ждёшь очередного места в игре, где нужно будет это сделать. Создаётся даже ощущение, что игра эксплуатирует свою основную механику недостаточно интенсивно (хотя на ней буквально построено абсолютно всё). В какой-то момент авторы частично лишают нас этих возможностей, и все такие уровни я прошёл без удовольствия. Ну и фишку с таймером запускают слишком поздно, уже в самом конце.
Короче, классный пример инди с крутой идеей и качественной реализацией. Если вы по моему совету поиграли когда-то в Superliminal, и вам понравилось, то эта тоже зайдёт.
#games
🚀 Вышел стабильный JavaScript движок от Google для Android
Новая стабильная библиотека Jetpack JavaScript Engine позволит разработчикам выполнять JS код в изолированной и ограниченной среде.
class MainActivity : ComponentActivity() {
// Теперь nullable, без lateinit
private var jsSandbox: JavaScriptSandbox? = null
private var jsIsolate: JavaScriptIsolate? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!JavaScriptSandbox.isSupported()) {
Log.e("JS", "JavaScriptSandbox не поддерживается")
return
}
lifecycleScope.launch {
// Создаём и сохраняем в nullable-поле
jsSandbox = JavaScriptSandbox
.createConnectedInstanceAsync(applicationContext)
.await()
jsIsolate = jsSandbox?.createIsolate()
// При выполнении гарантируем, что jsIsolate != null
val result: String = jsIsolate
?.evaluateJavaScriptAsync(JS_SCRIPT_SCRING)
?.await()
?: "Ошибка: isolate не инициализирован"
Log.d("JS", "Результат выполнения: $result")
}
}
override fun onDestroy() {
super.onDestroy()
// Закрываем только если не null
jsIsolate?.close()
jsSandbox?.close()
}
}
#jetpack#js