我创建了一个SKView,它提供了一个像这样的SKScene子类:
SKView *skv = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:skv];
self.skScene = [[TestScene alloc] initWithSize:v.bounds.size];
[skv presentScene:_skScene];
然后,为了查看坐标系原点,我在场景中添加了一个10x10的小方块。
SKSpriteNode *ori = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(10,10)];
[self addChild:ori];
您可以在左下角看到绿色方块:
从我的想法来看,SpriteKit坐标系就是原点总是在中心。但在场景中,原点位于左下角。当我将子节点添加到{0,0}时,它也出现在左下角。
当我添加SKSpriteNode并将其在场景中定位{0,0}时,它会显示在左下角。但它以左下角的场景原点为中心(从左到右,从一半到左下)。
但现在它变得更加混乱。当我将SKSpriteNode添加到另一个SKSpriteNode时,子精灵在父级中是CENTERED。
那么它是否意味着场景坐标系与精灵坐标系不同?
回顾:
我的场景配置错误还是这样?
答案 0 :(得分:17)
这是它的工作方式。所有OpenGL视图(至少是2D视图)的原点都在左下角。
精灵的位置也是正确的。两者都默认位于0,0。基于anchorPoint因子,相对于节点位置绘制精灵的纹理。它的默认值为0.5,0.5将纹理置于节点位置的中心位置。
您可以将场景的anchorPoint更改为0.5,0.5,这会将精灵移动到场景的中心。您也可以更改精灵的anchorPoint,但不建议这样做,因为它会影响旋转,缩放,碰撞检测和子节点位置等。
答案 1 :(得分:3)
您可以将此代码添加到GameViewController.swift:
override func viewDidLoad() {
super.viewDidLoad()
// Detect the screensize
var sizeRect = UIScreen.mainScreen().applicationFrame
var width = sizeRect.size.width * UIScreen.mainScreen().scale
var height = sizeRect.size.height * UIScreen.mainScreen().scale
// Scene should be shown in fullscreen mode
let scene = GameScene(size: CGSizeMake(width, height))
// 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)
}
答案 2 :(得分:0)
我所做的是将要显示的SKScene的大小设置为要显示场景的Viewcontroller的bounds.size
。像这样:
if let scene = GameScene(fileNamed:"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
scene.size = skView.bounds.size
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
我希望这也适合你,如果我在这里犯了任何错误,请告诉我:)