SpriteKit:尝试在缩放的Sprite上使用SKNode.contains()的过程

时间:2019-02-24 00:53:00

标签: swift macos sprite-kit scale

我在缩放的Sprite上使用SKNode.contains()时遇到麻烦,而且我无法弄清缺少的重要概念。

我有“鬼怪”精灵,它们在“监狱”精灵中四处移动。格林姆斯有时会穿过墙壁,我想知道他们何时离开监狱。我以为我可以简单地使用jail.contains(gremlin)(或某些变体),也许需要做一些数学运算才能达到正确的比例,但没有任何乐趣。我似乎无法弄清楚与contains()一起使用的精灵或框架,大小,变换方式或其他任何形式。

我对coordinate systemsframes and boundshit testingscaling,框架,大小,原点,锚点以及我所能做的一切已经读了很多找到。我已经读过this个问题,还有thisthisthisthis,还有很多其他问题。

我想念一些东西。这是一些简化的代码,显示了我遇到的问题。这是清理后的版本。我已经尝试过convertPoint()的每个排列,大小不断缩小,规模不断缩小,更改谁是谁的父母以及其他各种拼命尝试的尝试。没有运气。

在此示例代码中,为了解决这个问题,我想控制哪个大矩形用作小矩形的容器。现在设置的方式,我试图使红色矩形外部的小矩形变为灰色。如您所见,似乎红色矩形的点击测试区域的大小与蓝色矩形相同。也就是说,除了蓝色矩形最边缘的颜色以外,其他所有颜色均为绿色。

帮助!

Brain-deadness

class GameScene: SKScene {
    static var shared: GameScene?

    var bottomSprite: SKSpriteNode!
    var middleSprite: SKSpriteNode!
    var setupComplete = false
    var spriteTexture: SKTexture?
    var textureAtlas: SKTextureAtlas?
    var topSprite: SKSpriteNode!

    func getMarkerColor(outerSprite: SKSpriteNode, innerSprite: SKSpriteNode) -> NSColor {
        return outerSprite.frame.contains(innerSprite.frame) ? .green : .gray
    }

    override func didMove(to view: SKView) {
        GameScene.shared = self
        spriteTexture = SKTexture(imageNamed: "debugRectangle")
    }

    func drawContainerSprite(parent: SKNode, scale: CGFloat, color: NSColor) -> SKSpriteNode {
        let sprite = SKSpriteNode(texture: spriteTexture)

        sprite.color = color
        sprite.colorBlendFactor = 1.0
        sprite.anchorPoint = CGPoint(x: 0.5, y: 0.5)

        sprite.setScale(scale)
        sprite.size = scene!.size
        parent.addChild(sprite)

        sprite.position = CGPoint.zero
        return sprite
    }

    func drawMarkerSprite(parent: SKNode, scale: CGFloat) -> SKSpriteNode {
        let sprite = SKSpriteNode(texture: spriteTexture)

        sprite.size = CGSize(width: bottomSprite.size.width * 0.05, height: bottomSprite.size.height * 0.05)
        sprite.colorBlendFactor = 1.0
        sprite.anchorPoint = CGPoint(x: 0.5, y: 0.5)

        let x = Int.random(in: Int(-self.bottomSprite.size.width)..<Int(self.bottomSprite.size.width))
        let y = Int.random(in: Int(-self.bottomSprite.size.height)..<Int(self.bottomSprite.size.height))

        sprite.position = CGPoint(x: x, y: y)
        parent.addChild(sprite)

        return sprite
    }

    override func update(_ currentTime: TimeInterval) {
        if !setupComplete {
            bottomSprite = drawContainerSprite(parent: self.scene!, scale: 0.5, color: .blue)
            middleSprite = drawContainerSprite(parent: bottomSprite, scale: 0.5, color: .orange)
            topSprite = drawContainerSprite(parent: middleSprite, scale: 1.0, color: .red)

            setupComplete = true
        }

        let markerSprite = drawMarkerSprite(parent: self.scene!, scale: 1.0)
        markerSprite.color = getMarkerColor(outerSprite: topSprite, innerSprite: markerSprite)
    }
}

1 个答案:

答案 0 :(得分:0)

这是您所缺少的:SKNode.contains(_:)CGRect.contains(_:)不同。

SKNode.contains(_:)与矩形无关。这是关于命中测试点是否在父节点内的测试。 CGRect.contains(_:)是关于矩形的,它对节点,缩放比例或SpriteKit一无所知。如果要使用Sprite的框架来检查gremlins是否已脱离监狱,则必须自己缩放。