1

在斯卡拉我有这个功能:

def handleCollision {
    walls.foreach(w => if (curPlayer.intersects(w)) {
            curPlayer.setLocation(playerStartPos._1, playerStartPos._2)
            updateLives(-1)
        })
    obstacles.foreach(o => if (curPlayer.intersects(o)) {
            curPlayer.setLocation(playerStartPos._1, playerStartPos._2)
            updateLives(-1)
        })
} // End "handleCollision"

我想要做的是当玩家在我的比赛声明中按下键“c”时:

 case 'c' => 

我希望它调用此函数并覆盖上述函数,使其不再工作:

def cheatKey {
    walls.foreach(w => if (curPlayer.intersects(w)) {
            updateLives(+0)
        })
    obstacles.foreach(o => if (curPlayer.intersects(o)) {
            updateLives(+0)
        })
 }

谢谢

4

3 回答 3

2

您可以首先声明 avar来保存用于处理碰撞的默认函数,如下所示:

var collisionFunction = () => {
  curPlayer.setLocation(playerStartPos._1, playerStartPos._2)
  updateLives(-1)    
}

然后,您的 handleCollision 函数将更改为:

def handleCollision { 
  walls.foreach(w => if (curPlayer.intersects(w)) {
    collisionFunction()
  })

  obstacles.foreach(o => if (curPlayer.intersects(o)) {
    collisionFunction()
  })
}

然后,当您达到作弊条件时,您将像这样更新碰撞函数:

collisionFunction = () => {
  updateLives(+0)
}

这有点粗糙,因为它有一个用于函数交换的可变变量,但它适用于您想要做的事情。

于 2013-05-01T22:18:32.897 回答
1

您可以引入 a var f,将其初始化为

f = handleCollision

然后在你的案例陈述集中

f = cheatKey

f在您会使用cheatKey或的地方使用handleCollision

这基本上是策略模式

于 2013-05-01T22:16:54.147 回答
1

子类,然后:

override def handleCollision = {
  if (cheat) cheatKey else super.handleCollision
}
于 2013-05-01T22:25:05.400 回答