Sök…


Anmärkningar

SKScene representerar en enda scen i en SpriteKit-applikation. En SKScene "presenteras" i en SKView . SKSpriteNodes läggs till scenen för att implementera de faktiska spriterna.

Enkla applikationer kan ha en enda SKScene som innehåller allt SpriteKit-innehåll. Mer komplexa appar kan ha flera SKScenes som presenteras vid olika tidpunkter (t.ex. en öppningsscen för att presentera spelalternativen, en andra scen för att implementera själva spelet och en tredje scen för att presentera "Game Over" -resultaten).

Underklassificering av SKScene för att implementera primär spriteKit-funktion

SpriteKit-funktionalitet kan implementeras i en underklass av SKScene. Till exempel kan ett spel implementera huvudspelfunktionaliteten i en SKScene-underklass som heter GameScene.

I Swift :

import SpriteKit

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        /* Code here to setup the scene when it is first shown. E.g. add sprites. */
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch in touches {
            let location = touch.locationInNode(self)
            /* Code here to respond to a user touch in the scene at location */
        }
    }

    override func update(currentTime: CFTimeInterval) {
        /* Code here to perform operations before each frame is updated */
    }
}

Sekundär funktionalitet kan sedan implementeras i underklasser av SKSpriteNodes som används inom scenen (se Subclassing SKSpriteNode ).

Skapa en SKScene som fyller SKView

Ett enkelt användningsfall för att skapa en SKScene som exakt fyller SKView. Detta undviker behovet av att överväga att skala vyn för att passa eller ställa in en kamera för att visa en del av scenen.

Följande kod antar att en SKView som heter skView redan finns (t.ex. som definierad i Skapa en fullskärms SKView med Interface Builder ) och en underklass av SKScene som heter GameView har definierats:

I Swift :

let sceneSize = CGSizeMake(skView.frame.width, skView.frame.height)
let scene = SKScene(size: sceneSize)

skView.presentScene(scene)

Men om SKView kan ändra storlek (t.ex. om användaren roterar sin enhet och detta får vyn att sträckas på grund av dess begränsningar) kommer SKScene inte längre att passa SKView. Du kan hantera detta genom att ändra storlek på SKScene varje gång SKView ändrar storlek (t.ex. i metoden didChangeSize).

Skapa en SKScene som skalar för att passa SKView

En SKScene har en skalaMode- parameter som definierar hur den ska ändra sin storlek för att passa in i SKView den presenteras i SKView om den inte har samma storlek och / eller form.

Det finns fyra alternativ för scaleMode:

  • AspectFit : scenen skalas (men inte sträckt) tills den passar in i vyn. Detta säkerställer att scenen inte är förvrängd men det kan finnas vissa områden i vyn som inte täcks av scenen om scenen inte har samma form som vyn.
  • AspectFill : scenen skalas (men inte sträckt) för att fylla vyn helt. Detta säkerställer att scenen inte är förvrängd och att vyn är helt fylld men vissa delar av scenen kan beskäras om scenen inte har samma form som vyn.
  • Fyll : scenen skalas (och vid behov sträckas) för att fylla vyn helt. Detta säkerställer att vyn är helt fylld och att ingen av din scen beskärs men scenen kommer att förvrängas om scenen inte har samma form som vyn.
  • ResizeFill : scenen skalas inte alls utan dess storlek ändras för att passa bildens storlek.

Följande kod antar att en SKView som heter skView redan finns (t.ex. som definierad i Skapa en fullskärms SKView med gränssnittsbyggare ) och en underklass av SKScene som heter GameView har definierats och använder sedan AspectFill skalamod:

I Swift 3 :

    let sceneSize = CGSize(width:1000, height:1000)
    let scene = GameScene(size: sceneSize)
    scene.scaleMode = .aspectFill

    skView.presentScene(scene)

Skapa en SKScene med en SKCameraNode (iOS 9 och senare)

Du kan placera en SKCameraNode i en SKScene för att definiera vilken del av scenen som ska visas i SKView. Tänk på SKScene som en 2D-värld med en kamera som flyter ovanför: SKView visar vad kameran "ser".

Till exempel kan kameran fästas på huvudpersonens sprite för att följa handlingen i ett rullningsspel.

SKCameraNode har fyra parametrar som definierar vilken del av scenen som visas:

  • position : detta är kamerans position i scenen. Scenen återges för att placera denna position mitt i SKView.
  • xScale och yScale : dessa definierar hur scenen zoomas i vyn. Håll dessa två värden desamma för att undvika förvrängning av vyn. Ett värde på 1 betyder ingen zoom, värden mindre än en kommer att zooma in (få spriterna att se större ut) och värden över 1 kommer att zooma ut (gör att sprites verkar mindre).
  • zRotation : detta definierar hur vyn roteras i vyn. Ett värde på noll är ingen rotation. Värdet är i radianer, så ett värde på Pi (3.14 ...) kommer att rotera vyn upp och ner.

Följande kod antar att en SKView som heter skView redan finns (t.ex. som definierad i Skapa en fullskärms SKView med hjälp av Interface Builder ) och en underklass av SKScene som heter GameView har definierats. Detta exempel ställer bara in kamerans utgångsläge, du måste flytta kameran (på samma sätt som andra SKSpriteNodes i scenen) för att bläddra i vyn:

I Swift 3 :

    let sceneSize = CGSize(width:1000, height:1000)
    let scene = GameScene(size: sceneSize)
    scene.scaleMode = .aspectFill

    let camera = SKCameraNode()
    camera.position = CGPointM(x:500, y:500)
    camera.xScale = 1
    camera.yScale = 1
    camera.zRotation = 3.14
    scene.addChild(camera)
    scene.camera = camera

    skView.presentScene(scene)


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow