加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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))
  }
}

也就是说,重量级的东西永远不会更新,并且对它们的重量较轻的视图,使它们看起来好像改变了你想要改变的方式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读