如何在Sprite Kit游戏中仅在场景中显示一次标签

时间:2019-01-14 14:07:03

标签: ios sprite-kit skspritenode

我确信它必须非常容易实现,但是尽管以不同的方式进行了开发,但我在游戏中却未能实现。我的游戏是由不同的场景组成的,场景1是我希望用户仅浏览两次的场景,一次,当他第一次打开游戏并点按播放即可转到下一个场景(场景2),该场景基本上是一张地图并显示要做的不同活动数量。仅当用户完成场景2上地图显示的所有活动时,才第二次访问场景1。在场景2上轻按时,每个活动都导致一个不同的场景,即场景3、4、5、6,但将用户带回当他完成或未完成特定活动时的场景2。

现在我面临的问题是我的场景2,其中显示了一张地图,该地图还向用户在首次访问该场景时向用户展示了一些有关游戏的欢迎标签,这些标签仅需显示一次。当用户在另一个场景上完成/失败活动后返回场景2(地图场景)时,不应再给他展示标签,因为它们仅是使他第一次意识到游戏。我尝试使用布尔变量来解决此问题,但失败了,因为我认为用于跟踪“如果访客已经访问了场景”的布尔变量不应保存在节点的userdata属性中,因为每次用户返回到场景2。针对特定标签存储在userdata中的布尔变量只是重置为默认值,并不表示用户之前曾去过场景。

这非常棘手,但是我确信由于某些原因,解决方案很简单,因为我无法通过。

2 个答案:

答案 0 :(得分:0)

一种理想的方法是将场景与数据模型分开。

第二种方法是使用全局设置来替换存储在场景节点中的状态。

每次场景重新出现时,默认情况下所有节点都重新加载。因此,存储在节点中的信息仅与场景有关,而与游戏数据模型有关。

您正在走向令人兴奋的游戏编程设计。玩得开心。

答案 1 :(得分:0)

您可以通过给场景命名并在viewDidLoad上进行检查来解决此问题。

用户在场景3中获胜/失败后,您将创建场景2。给该场景起一个名称,例如scene.name = "scene_failed",然后将其呈现给用户。

let transition = SKTransition.flipVertical(withDuration: 1.0)
let next_scene = Scene_Two()
next_scene?.name = "scene_failed"
self.view?.presentScene(next_scene!, transition: transition)

这样,当调用场景2中的viewDidLoad函数时,它将触发if。

if scene?.name == "scene_failed"
{
     // redirected from scene 2
     hide_labels()
}
else
{
     // the scene has no name. so for sure it came from scene 1
     show_labels()
}

通过提供场景名称,您始终可以从转换的场景中知道。