【问题标题】:Scene transition in spritekit not transitioningspritekit中的场景过渡不过渡
【发布时间】:2014-09-07 17:07:49
【问题描述】:

我正在使用精灵套件快速制作游戏。 (我是 swift 新手)而且我想在按下节点时转换场景。我查了一下,正确的过渡方式是

    let transition = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)     
    let scene = GameScene(size: self.scene.size)
    scene.scaleMode = SKSceneScaleMode.AspectFill
    self.scene.view.presentScene(scene, transition: transition)

但是当我在编程时,它不喜欢 self.scene.size 并在场景上加上一个问号。这是我的代码

    let playView = PlayScene(size: self.scene?.size) 

我不知道如何解决这个问题。有什么建议么? (或者这可能只是我的一个简单错误,因为我是 swift 新手。

这是我的更多代码 在 GameScene.swift 文件中

类 GameScene:SKScene {

var playButton = SKSpriteNode(imageNamed: "Play")
var levelsButton = SKSpriteNode(imageNamed: "Levels")
var optionsButton = SKSpriteNode(imageNamed: "Options")

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    let myLabel = SKLabelNode(fontNamed:"Helvetica-Light")
    myLabel.text = "Mini Golf";
    myLabel.fontSize = 30;
    myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:525);
    println(size.height)
    println(size.width)
    let backgroundNode = SKSpriteNode(imageNamed: "Background")

    backgroundNode.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame));
    playButton.position = CGPoint(x: CGRectGetMidX(self.frame), y: 360)
    levelsButton.position = CGPoint(x: CGRectGetMidX(self.frame), y: 295)
    optionsButton.position = CGPoint(x: CGRectGetMidX(self.frame), y: 230)

    self.addChild(backgroundNode)
    self.addChild(playButton)
    self.addChild(levelsButton)
    self.addChild(optionsButton)
    self.addChild(myLabel)
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */
    super.touchesBegan(touches, withEvent: event)

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        //let touchedNode = nodeAtPoint(Location)
        //touchedNode.postiion =location
        let transitionToPlayScene = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)
        if CGRectContainsPoint(playButton.frame, location) {
            let playView = PlayScene(size: self.scene?.size)




        }
    }
}

这是 PlayScene.swift 文件中的代码

import Foundation
import UIKit
import SpriteKit

private let WALL_CATEGORY: UInt32 = 0x1 << 0
private let HOLE_CATEGORY: UInt32 = 0x1 << 1
private let GOLF_CLUB_CATEGORY: UInt32 = 0x1 << 2
private let BALL_CATEGORY: UInt32 = 0x1 << 4
private let DECORATION_BORDER_CATEGORY: UInt32 = 0x1 << 5


class PlayScene: SKScene, SKPhysicsContactDelegate  {

var ballNode = SKSpriteNode(imageNamed: "Ball")
var flag = SKSpriteNode(imageNamed: "Flag")
var club = SKSpriteNode(imageNamed: "Golf Club")
var tee = SKSpriteNode(imageNamed: "Tee")
var hole = SKSpriteNode(imageNamed: "Hole")
var decoBorder1 = SKSpriteNode(imageNamed: "Border 1")
var decoBorder2 = SKSpriteNode(imageNamed: "Border 2")

override func didMoveToView(view: SKView) {
    //Setting up the view's physics
    let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame);
    self.physicsBody = borderBody
    self.physicsBody?.friction = 0.0
    self.physicsBody?.categoryBitMask  = WALL_CATEGORY
    self.physicsWorld.gravity = CGVectorMake(0.0 ,0.0);
    self.physicsWorld.contactDelegate = self

    //Setting the ball's properties
    ballNode.position = CGPoint(x: CGRectGetMidX(self.frame), y: 100);
    ballNode.physicsBody = SKPhysicsBody(rectangleOfSize: ballNode.frame.size);
    ballNode.physicsBody?.categoryBitMask = BALL_CATEGORY
    ballNode.physicsBody?.mass = 50.0
    ballNode.physicsBody?.dynamic = true
    ballNode.physicsBody?.allowsRotation = true
    self.addChild(ballNode)

    //Setting the club's properties
    club.position = CGPoint(x: CGRectGetMidX(self.frame)-20, y: 75);
    club.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size);
    club.physicsBody?.categoryBitMask = GOLF_CLUB_CATEGORY
    club.physicsBody?.mass = 150.0
    club.physicsBody?.dynamic = true
    club.physicsBody?.allowsRotation = false
    self.addChild(club)

    //Setting the Tee's properties
    tee.position = CGPoint(x: CGRectGetMidX(self.frame), y: 70);
    //self.addChild(tee)

    //Setting the decoration border nodes
    decoBorder1.position = CGPoint(x: CGRectGetMinX(self.frame), y: 500);
    decoBorder2.position = CGPoint(x: CGRectGetMaxX(self.frame), y:500);
    decoBorder1.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size);
    decoBorder2.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size);
    decoBorder1.physicsBody?.categoryBitMask = DECORATION_BORDER_CATEGORY
    decoBorder1.physicsBody?.dynamic = false;
    decoBorder1.physicsBody?.allowsRotation = false
    decoBorder2.physicsBody?.categoryBitMask = DECORATION_BORDER_CATEGORY
    decoBorder2.physicsBody?.dynamic = false;
    decoBorder2.physicsBody?.allowsRotation = false
    //self.addChild(decoBorder1)
    //self.addChild(decoBorder2))

    //Setting the Hole properties
    hole.position = CGPoint(x: CGRectGetMidX(self.frame), y: 550);
    hole.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size);
    hole.physicsBody?.categoryBitMask = HOLE_CATEGORY
    hole.physicsBody?.dynamic = false
    hole.physicsBody?.allowsRotation = false
    //self.addChild(hole)
}

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    问号来自optional chaining,因为您的scene 属性必须是这样声明的SKScene?。不过这不是问题,它只是意味着如果您的场景为 nil,它将无法获得 size 属性。

    真正的问题可能是这一行:

    self.scene.view.presentScene(scene, transition: transition)
    

    原因是,您的scene 在出现之前可能没有view

    你可能想要这样的东西:

    (self.view as SKView).presentScene(scene, transition: transition)
    

    你会注意到我可能说了很多。我只是在推测这个问题,因为我没有看到足够的代码,但我很感激尝试缩小问题范围的努力。不过,您应该发布更多内容,因为它可能在其他地方。

    编辑

    尝试替换这个:

        let transitionToPlayScene = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)
        if CGRectContainsPoint(playButton.frame, location) {
            let playView = PlayScene(size: self.scene?.size)
    
    
    
    
        }
    

    有了这个

        if CGRectContainsPoint(playButton.frame, location) {
            let transitionToPlayScene = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)
            let nextScene = PlayScene(size: self.size)
            self.view!.presentScene(nextScene, transition: transitionToPlayScene)
        }
    

    【讨论】:

    • 我的场景属性没有像 SKScene 一样声明?那条线不是问题。
    【解决方案2】:

    最终对我有用的是:

     let transition = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)
     let scene = GameScene(size: (self.scene as SKScene!).size)
     scene.scaleMode = SKSceneScaleMode.AspectFill
     (self.view as SKView!).presentScene(scene, transition: transition)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多