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

var次のように、衝突を処理するためのデフォルト関数を保持するようにa を宣言することから始めることができます。

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 を次のように更新します。

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

関数スワッピング用の変更可能な変数があるため、これは少し大雑把ですが、目的には機能します。

于 2013-05-01T22:18:32.897 に答える
1

サブクラス、次に:

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

var f初期化する を導入できます

f = handleCollision

次に、ケースステートメントセットで

f = cheatKey

また、 またはfのいずれかを使用する場所をcheatKey使用しますhandleCollision

これは基本的に戦略パターンです。

于 2013-05-01T22:16:54.147 に答える