gpt4 book ai didi

swift - SpriteKit : stuck trying to use SKNode. contains() 缩放 Sprite

转载 作者:行者123 更新时间:2023-11-30 10:49:49 37 4
gpt4 key购买 nike

我在缩放 Sprite 上使用 SKNode.contains() 时遇到问题,而且我不知道我错过了什么重要概念。

我有“gremlin” Sprite ,它们在“ jail ” Sprite 内移动。小魔怪有时可以穿墙,我想知道他们什么时候离开 jail 。我想我可以简单地使用 jail.contains(gremlin) (或某些变体),也许可以对其进行一些数学计算以获得正确的比例,但没有乐趣。我似乎无法弄清楚要与 contains() 一起使用哪个 Sprite 或哪个帧,或者哪个大小,或者哪种变换,或者其他什么。

我读过很多关于 coordinate systems 的内容。 , frames and bounds , hit testing , scaling 、框架、尺寸、起源、 anchor ,我能找到的一切。我读过this所以问题,和this , this , this ,和this ,以及其他一些。

我错过了一些东西。这是一些精简的代码,显示了我遇到的问题。这是清理后的版本。我尝试过convertPoint()的每一种排列,缩小和增大尺寸,缩小和增大规模,改变谁是谁的 parent ,以及其他各种绝望的理解尝试。运气不好。

在这个示例代码中,为了解决这个问题,我想控制哪个大矩形用作小矩形的容器。按照现在的设置方式,我试图将红色矩形之外的小矩形变为灰色。正如您所看到的,红色矩形的 HitTest 区域似乎与蓝色矩形的大小相同。也就是说,除了蓝色矩形最边缘的部分之外,所有内容都是绿色的。

救命!

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)
}
}

最佳答案

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

SKNode.contains(_:) 与矩形无关。这是关于 HitTest 一个点是否在父节点内部。 CGRect.contains(_:) 是关于矩形的,它对节点、缩放或 SpriteKit 一无所知。如果您要使用 Sprite 的框架来检查小魔怪是否出狱,则必须自己对其进行缩放。

关于swift - SpriteKit : stuck trying to use SKNode. contains() 缩放 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54847750/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com