用Swift做个游戏Lecture 03 —— 实现foreground的持续移动

用Swift做个游戏Lecture 03 —— 实现foreground的持续移动,第1张

概述本文任务 游戏运行中,Foreground地面持续滚动。 持续移动地面 任务一需要解决的问题: 如何移动地面。 如何无缝连接。 问题一的解决思路是每次渲染完毕进入update()方法中更新Foreground的坐标位置,即改变position的x值。 问题二的解决思路是实例化两个Foreground,相邻紧挨,以约定好的速度向左移动,当第一个节点位置超出屏幕范围(对玩家来说是不可见)时,改变其坐标 本文任务 游戏运行中,Foreground地面持续滚动。 持续移动地面

任务一需要解决的问题:

如何移动地面。 如何无缝连接。

问题一的解决思路是每次渲染完毕进入update()方法中更新Foreground的坐标位置,即改变positionx值。

问题二的解决思路是实例化两个Foreground,相邻紧挨,以约定好的速度向左移动,当第一个节点位置超出屏幕范围(对玩家来说是不可见)时,改变其坐标位置,添加到第二个节点尾部,如此循环实现无缝连接,参考图为:



代码实现:

找到GameScene类中的setupForeground()方法,由于现在需要实例化两个Foreground,显然早前的已不再使用,替换方法中的所有内容:

func setupForeground() {    for i in 0..<2{        let foreground = SKSpriteNode(imagenamed: "Ground")        foreground.anchorPoint = CGPoint(x: 0,y: 1)        // 改动1        foreground.position = CGPoint(x: CGfloat(i) * size.wIDth,y: playableStart)        foreground.zposition = Layer.Foreground.rawValue        // 改动2        foreground.name = "foreground"        worldNode.addChild(foreground)    }}

注意我们采用for-in进行2次实例化,代码有两处改动:1.放置位置与i值相关;2.给节点取名为“foreground”,方便之后查找 *** 作。

Foreground匀速移动,自然速度值需要固定,姑且这里设为150.0,请在let kImpulse: CGfloat = 400.0下方添加一行速度常量定义let kGroundSpeed: CGfloat = 150.0

对于Foreground的位置更新自然也是在方法update()中进行了,每隔大约33毫秒就跳入该函数更新position。就像早前updatePlayer()一样,在其下方声明一个名为updateForeground方法。

func updateForeground(){   //1   worldNode.enumerateChildNodesWithname("foreground") { (node,stop) -> VoID in        //2       if let foreground = node as? SKSpriteNode{            //3           let moveAmt = CGPointMake(-self.kGroundSpeed * CGfloat(self.dt),0)           foreground.position += moveAmt           //4           if foreground.position.x < -foreground.size.wIDth{             foreground.position += CGPoint(x: foreground.size.wIDth * CGfloat(2),y: 0)           }       }   }}

讲解:

还记得先前设置了Foreground节点的名字为foreground吗?通过enumerateChildNodesWithname方法即可遍历所有名为foreground的节点。 注意nodeSKNode类型,而foreground精灵是SKSpriteNode类型,需要向下变形。 计算dt时间中foreground移动的距离,更新position坐标位置。 倘若该foreground超出了屏幕,则正如前面所说的将其添加到第二个精灵尾部。

4中的位置条件判断,希望读者理解透彻。首先SpriteKit中坐标系与之前不同,原点位于左下角,x轴正方向自左向右,y轴正方向自下向上;其次wordNode节点位于原点处,因此它内部的坐标系也是以左下角为原点。请集合上文图片进行理解。

ok,将updateForeground方法添加到update()中的最下面即可,点击运行。

总结

以上是内存溢出为你收集整理的用Swift做个游戏Lecture 03 —— 实现foreground的持续移动全部内容,希望文章能够帮你解决用Swift做个游戏Lecture 03 —— 实现foreground的持续移动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1083900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存