如何使用字符串作为SKScene的名称

时间:2017-11-21 03:35:27

标签: ios swift sprite-kit nsuserdefaults

我正在制作24级游戏,我正在使用NSUserDefaults通过将其值设置为级别数字让我知道自己处于什么级别。

我正在尝试获取NSUserDefault值并将其设置为字符串,这样当我呈现场景时它将知道要去哪个级别。但由于某种原因它不起作用。它说我无法将字符串转换为SKScene。

userdefault保存数字级别(1,2,3等)。有了这个数字,我想去那个名为(Level1,Level2等)的场景。我试图将数字附加到字符串“Level%i”,然后使用该字符串显示场景。但它并没有让我说它不能将String转换为SKScene。

以下是用于呈现关卡场景的代码:

if self.atPoint(location) == NextLevelButton{

        let LevelSelection = UserDefaults.standard.object(forKey: "LevelSelection") //as? String




        let level2 = NSString(format: "Level%@", LevelSelection! as! SKScene) // Here is where I try to make a string and convert it into a SKScene

        removeAllActions()
        removeAllChildren()
        let scene = level2 (size: self.size) // I get an error here   "Cannot call value of non-function type 'NSString'"
        let sKView = self.view! as SKView
        sKView.ignoresSiblingOrder = true
        scene.scaleMode = .aspectFill

        sKView.presentScene(scene)

以下是Level1场景中代码的另一部分:

let defaultLevel = 1
UserDefaults.standard.set(defaultLevel, forKey: "LevelSelection")

场景的名称是Level1,Level2等。我只需要将NSUserDefualt变量的编号附加到字符串“Level”并且我有场景

有谁知道我做错了什么?如果这不是正确的方法,那是什么?

提前感谢您!

1 个答案:

答案 0 :(得分:1)

你做不到。字符串不能转换为对象。

可能的解决方案是数组:

  Observable.fromIterable(selectedJobs)
            .observeOn(AndroidSchedulers.mainThread()) // Added this from one answer in SO. but still no resolution.
            .all(homeJob -> {

                if (!homeJob.isCanCloseJob()) {
                    selectedJobs.remove(homeJob); // <- this is what causing Exception
                    //toast message
                } else {
                    //do something
                }

                return true;
            })
            .subscribe(new SingleObserver<Boolean>() {
                @Override
                public void onSubscribe(Disposable disposable) {

                }

                @Override
                public void onSuccess(Boolean aBoolean) {

                    baseRealm.executeTransaction(realm -> realm.copyToRealmOrUpdate(selectedJobs));

                }

                @Override
                public void onError(Throwable throwable) {
                    AppLogger.e(tag, throwable.getMessage());
                 // throws Caused by: java.util.ConcurrentModificationException
                }
            });

然后您可以按索引检索级别

let levels : [SKScene] = [level1, level2, level3]