我的游戏有
class Enemy
谁是我可以改变的人工智能/功能
trait Moving
trait VerticalMover extends Moving
trait RandomMover extends Moving
等等。现在我需要根据特征获取预加载的东西。我想要做的是有一个 Map 接受所有扩展为键的特征,然后接受一些 EnemyContainer 作为值,这些特征将预加载与特征相关的内容。
但是我如何定义这样的 Map 以及如何格式化我的 .get() 以通过某个 Enemy 的实例获取容器。就像是:
val myEnemy = new Enemy with RandomMover
val myDetails:EnemyContainer = enemyDetailsStore.get(myEnemy.getClass)
最佳答案
好吧,我假设您的敌人详细信息存储类型为 Map[Class[_ <: Moving], EnemyDetails]
.我怀疑是这样的:
//gives a Map[Class[_ <: Moving], EnemyDetails] for all matching keys
enemyDetailsStore.filterKeys(_ isInstance myEnemy)
或者:
//Iterable[EnemyDetails]
enemyDetailsStore collect { case (c, d) if c isInstance myEnemy => d }
或者甚至只是:
//Option[EnemyDetails]
enemyDetailsStore collectFirst { case (c, d) if c isInstance myEnemy => d }
会为你做的。这段代码唯一的“问题”是它是 O(N),因为它需要遍历 map ,而不是简单的查找,这将是 O(1) 或 O(log N)
关于类类型作为 Scala 映射中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335946/