我正在使用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)
}
}
如果有人可以通过指导我找到正确的方向来帮助解决这个问题,或者尝试解决这个问题,我会非常感激。
提前致谢!
答案 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