scala游戏编程:以功能性风格推进对象位置
发布时间:2020-12-16 09:19:25 所属栏目:安全 来源:网络整理
导读:长时间的 java程序员慢慢学习scala(喜欢它的方式),我认为我的心灵仍然围绕在功能上写作的概念.现在我试图为一些移动的2D纹理写一个简单的可视化工具.命令式的方法很简单,我相信大部分人都会认识到这个相对普遍的代码块(东西被改变来保护无辜者): class Movi
长时间的
java程序员慢慢学习scala(喜欢它的方式),我认为我的心灵仍然围绕在功能上写作的概念.现在我试图为一些移动的2D纹理写一个简单的可视化工具.命令式的方法很简单,我相信大部分人都会认识到这个相对普遍的代码块(东西被改变来保护无辜者):
class MovingTexture(var position,var velocity) extends Renders with Advances { def render : Unit = {...} def advance(milliseconds : Float) : Unit = { position = position + velocity * milliseconds } } 这段代码可以正常工作,但是它有很多可变状态,其功能充满了副作用.我不能让自己摆脱这一切,必须有更好的办法! 有没有人有一个惊人的,优雅的功能解决这个简单的问题?有没有人知道一个来源,我可以更多地了解如何解决这些问题? 解决方法
游戏通常是高性能事务,在这种情况下,您可能会发现可变状态只是您需要的.
但是,有几个简单的解决方案: case class MovingTexture(position: VecXY,velocity: VecXY) extends Renders with Advances { def advance(ms: Float) = copy(position = position + ms*velocity def accelerate(acc: Float,ms: Float) = copy(velocity = velocity + ms*acc) ... } 也就是说,不要让你的课程更新自己,让他们返回自己的新副本. (你可以看到这可能会很快昂贵)对于俄罗斯方块来说,没有什么大不了的,对于孤岛危机,也许并不那么聪明.)这似乎只是把问题推回一个层次:现在你需要一个var的MovingTexture,对吧?一点也不: Iterator.iterate(MovingTexture(home,defaultSpeed))(_.advance(defaultStep)) 这将在同一个方向产生无休止的位置更新.您可以做更复杂的事情来混合用户输入或什么. 或者,你可以 class Origin extends Renders { // All sorts of expensive stuff goes here } class Transposed(val ori: Origin,val position: VecXY) extends Renders with Advances { // Wrap TextureAtOrigin with inexpensive methods to make it act like it's moved def moving(vel: VecXY,ms: Float) = { Iterator.iterate(this).(tt => new Transposed(tt.ori,position+ms*vel)) } } 也就是说,重量级的东西永远不会更新,并且对它们的重量较轻的视图,使它们看起来好像改变了你想要改变的方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |