GameScene尺寸比我的设备屏幕尺寸

时间:2015-08-03 03:48:51

标签: ios swift sprite-kit

我正在使用swift和SpriteKit,我遇到的问题是我认为我的GameScene比我的设备的屏幕尺寸宽。我需要做的是移动图像,然后不允许它移过屏幕边缘。

我现在所处的位置是我的图像会与屏幕的顶部和底部碰撞,但它会向左或向右移动并与屏幕外的某个边缘相撞。

我在搜索中遇到了这个问题,试图解决问题: Screen's real size is bigger than what I see

只是按照他们的尝试并注释出scene.scaleMode = .AspectFill这一行会导致与屏幕边缘的碰撞才能正常工作,但就像他们所说的那样,图像现在没有正确缩放,仅在我的情况下占据中间,每边留下灰色边缘。

他们的另一个补救措施是在取出默认创建的场景之后添加scene = GameScene(size: self.view.frame.size),我假设,GameViewController.swift但我不知道要删除什么来尝试这样做。

我的viewDidLoad目前看起来像这样:

override func viewDidLoad() {
        super.viewDidLoad()


        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {

            // Configure the view.
            let skView = self.view as! SKView
            skView.showsFPS = true
            //skView.showsNodeCount = true

            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true

            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .AspectFill

            skView.presentScene(scene)

        }

    }

如果有人可以通过指导我找到正确的方向来帮助解决这个问题,或者尝试解决这个问题,我会非常感激。

提前致谢!

3 个答案:

答案 0 :(得分:3)

尝试使用viewWillLayoutSubviews代替viewDidLoad并使用skView.bounds.size初始化您的场景:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
        // Configure the view.
        let skView = self.view as SKView
        skView.showsFPS = true
        skView.showsNodeCount = true
        skView.showsPhysics = true
        skView.showsDrawCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */

        if(skView.scene == nil){

            scene.scaleMode = .AspectFill
            scene.size  = skView.bounds.size
            skView.presentScene(scene)
        }


    }
}

viewDidLoad中,可能还不知道最终视图大小,viewWillLayoutSubviews有时是初始化场景的最佳位置。

从.sks文件加载场景时,默认大小为1024x768。这就是为什么你的场景有时比预期的要宽,这可以改变,就像我发布的代码一样。

如果您查看错误的视图大小(但我怀疑),请检查您的启动图像...如果选择错误,视图的大小可能会错误。

答案 1 :(得分:0)

尝试:

var scene = GameScene(size: UIScreen.mainScreen().bounds)

或:

var dev_w = UIScreen.mainScreen().bounds.width*2
var dev_h = UIScreen.mainScreen().bounds.height*2
var new_frame = CGRectMake(0 , 0, dev_w, dev_h)
var scene = GameScene(size: new_frame)

答案 2 :(得分:0)

我在SpriteKit中遇到过与Objective-C iOS 7和8类似的问题。将#include <iostream> #include <string> #include <string.h> //for strcpy and strcat method using namespace std; int main() { string Str1, Str2, Str3; cin >> Str1 >> Str2 >> Str3; int length_Str1 = Str1.size(); int length_Str2 = Str2.size(); int length_Str3 = Str3.size(); char aCString[length_Str1+length_Str2+length_Str3+1]; string Str_Array[] = {Str1, Str2, Str3}; strcpy(aCString, Str_Array[0].c_str()); //copy the first index of array for(int i =1;i<3;i++) //concatenate each index of array strcat(aCString, Str_Array[i].c_str()); return 0; } 替换为另一个SKScene时,将SKScene大小设置为self.size会导致此确切错误。我的解决方案很简单:

//ObjectiveC
MyScene *newScene = [[MyScene alloc] initWithSize:CGSizeMake(self.view.frame.size.width * 2, self.view.frame.size.height * 2)];
newScene.scaleMode = SKSceneScaleModeAspectFill;

//Swift
var newScene : MyScene = MyScene(size:CGSize(width: self.view.frame.size.width * 2, height: self.view.frame.size.height))
newScene.scaleMode = .AspectFill