2014-11-14 65 views
0

我想在某些遊戲中創建一種關於moving幾何單位的組件。所以,我想以這樣的方式從而scala - 作爲類的建模方法

trait Move 
case class MoveHorizontal(val velocityMvH: Int) extends Move 
case class MoveVertical(val velocityMvV: Int) extends Move 
case class MoveRandomly() extends Move 
case class MoveDiagonally(val velocityMvDx: Int = 0, val velocityMvDy: Int = 0) extends Move 
case class MoveDiagonal() extends Move 
case class MoveReverseX() extends Move 
case class MoveReverseY() extends Move 

class Moving(gu: GeometricalUnit, mv:() => Unit) extends Move { 
    val velocity = 20 
    var xVelocity: Int = velocity 
    var yVelocity: Int = -velocity 

    if (gu.isMovable == true) {  
    mv match { 
     case MoveHorizontal(mvH) => gu.dim.x += mvH 
     case MoveVertical(mvV) => gu.dim.y += mvV 
     case MoveRandomly() => moveRandomly() 
     case MoveDiagonally(mvDx, mvDy) => moveDiagonally(mvDx, mvDy) 
     case MoveDiagonal() => moveDiagonally() 
     case MoveReverseX() => xVelocity *= -1 
     case MoveReverseY() => yVelocity *= -1   
    } 
    } 
} 

,我想以後調用爲properties讓以使它們根據特殊功能的移動這些GeometricalUnits的說... 我想知道,如果一個更好的組織可以比我的似乎無聊?!


我的解決辦法: 這是我在通用的解決方案:

def initiatePieces(s: Movable, x: Int, y: Int) = { 
nrInitiations += 1 
s.dimM.x = x 
s.dimM.y = y 
s match { 
    case _: BBall => randomMvmBB() 
    case _: WBall => randomMvmWB() 
    case _: PBall => randomMvmPB() 
    case _ => "nothing" 
} 

}

這是怎麼了發起件,以同樣的方式,我用另一種方法,移動他們,正在調用基於可移動部件類型的功能

+0

不完全知道你想要做什麼,但這些案例似乎相當多餘。 – acjay 2014-11-15 00:46:29

+0

'Move'特質應該以任何一種方式密封 – 2014-11-15 02:45:16

+1

如何從'case class Direction(x:Int,y:Int,z:Int)開始' – 2014-11-15 02:51:22

回答

1

這個怎麼樣?

def Move(what:Movable, where:MoveFunction) : Movable 

應採取Movable要移動它(可應用到Movable一個函數(一個不變的狀態要移動什麼對象)和高階函數MoveFunction,各功能應然後利用現有的狀態,並通過應用高階函數(MoveFunction)到Movable對象返回一個新的狀態。

+0

我會試試這個......聽起來更像我想要做的!讓看... – Valerin 2014-11-15 10:38:55

+0

請張貼您的解決方案。很高興看到您使用的解決方案。 – 2014-11-15 16:34:19

+0

在我的問題結束時,是我的回答。可能它不是世界上最好的...... :) – Valerin 2014-11-16 11:03:11