В чем разница между SKScene.size.width SKSpriteNode.size.width? - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в swift 5 . Я распечатал self.size.width в GameScene, и в результате получилось 677.0 Я распечатал self.size.width из другого класса - скажем, Ground, и результат будет 4002.0

Я в замешательстве, пожалуйста, помогите.

Большое спасибо.

GameScene.swift:

import SpriteKit

class GameScene: SKScene {
    let cam = SKCameraNode()
    let bee = SKSpriteNode()
    let ground = Ground()

    override func didMove(to view: SKView) {
      self.anchorPoint = .zero
      //self.backgroundColor = UIColor(red: 0.4, green: 0.6, blue: 0.95, alpha: 1.0)
      self.camera = cam
      self.addingTheFlyingBee()
      self.addBackground()

      let bee2 = Bee()
      bee2.position = CGPoint(x: 325, y: 325)
      self.addChild(bee2)

      let bee3 = Bee()
      bee3.position = CGPoint(x: 200, y: 325)
      self.addChild(bee3)

      ground.position = CGPoint(x: -self.size.width * 2, y: 0)
      ground.size = CGSize(width: self.size.width * 6, height: 0)
      ground.createChildren()
      self.addChild(ground)
  }

    override func didSimulatePhysics() {
        self.camera!.position = bee.position
  }

    func addBackground() {
      let bg = SKSpriteNode(imageNamed: "background-menu")
      bg.position = CGPoint(x: 220, y: 220)
      bg.zPosition = -1
      self.addChild(bg)

  }

    func addingTheFlyingBee() {
        bee.position = CGPoint(x: 250, y: 250)
        bee.size = CGSize(width: 38, height: 34)
        self.addChild(bee)

        let beeAtlas = SKTextureAtlas(named: "Enemies")
        let beeFrames : [SKTexture] = [
            beeAtlas.textureNamed("bee"),
            beeAtlas.textureNamed("bee-fly")
        ]
        let flyAction = SKAction.animate(with: beeFrames, timePerFrame: 0.14)
        let beeAction = SKAction.repeatForever(flyAction)
        bee.run(beeAction)

        let pathLeft = SKAction.moveBy(x: -200, y: -10, duration: 2)
        let pathRight = SKAction.moveBy(x: 200, y: 10, duration: 2)
        let flipTextureNegative = SKAction.scaleX(to: -1, duration: 0)
        let flipTexturePositive = SKAction.scaleX(to: 1, duration: 0)
        let flightOfTheBee = SKAction.sequence([ pathLeft, flipTextureNegative, pathRight, flipTexturePositive])
        let neverEndingFlight = SKAction.repeatForever(flightOfTheBee)
        bee.run(neverEndingFlight)

    }

Ground.swift:

import Foundation
import SpriteKit

class Ground: SKSpriteNode, GameSprite {
  var textureAtlas: SKTextureAtlas = SKTextureAtlas(named: "Environment")
  var initialSize = CGSize.zero

  func createChildren() {
    self.anchorPoint = CGPoint(x: 0, y: 1)
    let texture = textureAtlas.textureNamed("ground")
    var tileCount: CGFloat = 0
    let tileSize = CGSize(width: 35, height: 300)

    while tileCount * tileSize.width < self.size.width {
      let tileNode = SKSpriteNode(texture: texture)
      tileNode.size = tileSize
      tileNode.position.x = tileCount * tileSize.width
      tileNode.anchorPoint = CGPoint(x: 0, y: 1)
      self.addChild(tileNode)
      tileCount += 1
    }

  }

  func onTap() {}
}

1 Ответ

0 голосов
/ 10 апреля 2020

Я не очень понимаю вопрос. Так как ширина вашей сцены составляет 677.0px, а ширина грунта должна быть 6 *, то есть 4062px. Ваш вопрос "Почему ширина наземного узла 4002px вместо 4062px?" или «В чем разница между этими свойствами?»

Если вы задаете второй вопрос, то это должен быть ответ: SKScene.size.width вернет ширину текущей сцены, а SKSpriteNode.size.width вернет ширину целевой узел в вашем случае «наземный» узел.

self.size.width вернет ширину текущего класса, который вы редактируете.

Так что в файле GameScene.swift, если вы вызываете self.size.width внутри class GameScene: SKScene вернет ширину GameScene.

В файле Ground.swift вызов self.size.width внутри class Ground: SKSpriteNode, GameSprite вернет ширину Земли.

Надеюсь, это ответ на ваш вопрос.

...