Библиотека игры phaser имеет API, в котором вы передаете пользовательский объект при запуске игровой сцены ( docs ). Этот объект данных может быть любым объектом javascript вообще и может быть извлечен изнутри сцены из настроек сцены . Мой вопрос: как мне определить этот объект на фасадах фазера в общем виде и определить строго типизированную версию в моем собственном коде?
До сих пор я только что ссылался на объект как js.Object
в API фазера и приводил его к моему собственному типу при создании сцены:
@js.native
trait ScenePlugin extends js.Object {
def start(key: SceneKey, data: js.UndefOr[js.Object] = js.undefined): ScenePlugin
}
@js.annotation.ScalaJSDefined
class LevelConfig(
val key: LevelKey,
val loadingImage: Option[AssetKey] = None) extends js.Object
@ScalaJSDefined
class LoadScene extends Scene {
private val loader = new SceneLoader(scene = this)
private var levelConfig: LevelConfig = _
override def preload(): Unit = {
levelConfig = sys.settings.data.asInstanceOf[LevelConfig]
}
...
}
Это работает, но я не доволен этим, потому что мне нужно привести объект данных. Любые ошибки с фактическим объектом, который передается в ScenePlugin.start()
, вызовут ошибки во время выполнения, и я также мог просто использовать vanilla JS. Кроме того, мой LevelConfig
не может быть классом case, поскольку я получаю ошибку компиляции Classes and objects extending js.Any may not have a case modifier
, которую я не до конца понимаю.
Кто-нибудь имел дело с этой ситуацией раньше и что вы делали, чтобы обойти ее? Я предполагаю, что проблема связана с библиотекой, которая используется, поэтому, возможно, мне нужно создать какую-то оболочку для класса Phaser Scene, чтобы справиться с этим? Я довольно новичок в ScalaJS и надеюсь улучшить мое понимание, поэтому любые объяснения с решениями будут высоко оценены (и одобрены). Большое спасибо!