我在缩放的Sprite上使用SKNode.contains()
时遇到麻烦,而且我无法弄清缺少的重要概念。
我有“鬼怪”精灵,它们在“监狱”精灵中四处移动。格林姆斯有时会穿过墙壁,我想知道他们何时离开监狱。我以为我可以简单地使用jail.contains(gremlin)
(或某些变体),也许需要做一些数学运算才能达到正确的比例,但没有任何乐趣。我似乎无法弄清楚与contains()
一起使用的精灵或框架,大小,变换方式或其他任何形式。
我对coordinate systems,frames and bounds,hit testing,scaling,框架,大小,原点,锚点以及我所能做的一切已经读了很多找到。我已经读过this个问题,还有this,this,this和this,还有很多其他问题。
我想念一些东西。这是一些简化的代码,显示了我遇到的问题。这是清理后的版本。我已经尝试过convertPoint()
的每个排列,大小不断缩小,规模不断缩小,更改谁是谁的父母以及其他各种拼命尝试的尝试。没有运气。
在此示例代码中,为了解决这个问题,我想控制哪个大矩形用作小矩形的容器。现在设置的方式,我试图使红色矩形外部的小矩形变为灰色。如您所见,似乎红色矩形的点击测试区域的大小与蓝色矩形相同。也就是说,除了蓝色矩形最边缘的颜色以外,其他所有颜色均为绿色。
帮助!
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)
}
}
答案 0 :(得分:0)
这是您所缺少的:SKNode.contains(_:)
与CGRect.contains(_:)
不同。
SKNode.contains(_:)
与矩形无关。这是关于命中测试点是否在父节点内的测试。 CGRect.contains(_:)
是关于矩形的,它对节点,缩放比例或SpriteKit一无所知。如果要使用Sprite的框架来检查gremlins是否已脱离监狱,则必须自己缩放。