无法更改 SKSpriteNode 的纹理
Unable to change the texture of SKSpriteNode
在我的游戏中,我正在创建一个具有特定纹理的 Circle 对象,但是例如,如果 Circle 撞到特定的墙,我希望它的纹理发生变化。不幸的是,由于某种原因这不起作用,我不知道为什么。
这是我的 Circle class 代码:
class Circle: SKNode, GKAgentDelegate{
let txtName = "farblos"
var node: SKSpriteNode {
let node = SKSpriteNode(imageNamed: txtName)
node.size = CGSize(width: 30, height: 30)
node.name = "circle"
return node
}
let agent: GKAgent2D
init(position: CGPoint) {
agent = GKAgent2D()
agent.position = vector_float2(x: Float(position.x), y: Float(position.y))
agent.radius = Float(15)
agent.maxSpeed = 50.0
agent.maxAcceleration = 20.0
super.init()
self.position = position
agent.delegate = self
addChild(node)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
只是为了测试目的,我在将节点添加为子节点后直接添加了这段代码。
node.texture = SKTexture(imageNamed: "cyan")
加载纹理时没有错误。该图像肯定存在,我可以从中创建一个 SKTexture。
你知道为什么纹理没有改变吗?
Circle 对象是这样创建的:
for _ in 1...i {
let entity = Circle(position: CGPoint.randomPoint(inBounds: b, notCollidingWith: allBoundaries))
agentSystem.addComponent(entity.agent)
allCircles.append(entity)
self.addChild(entity)
}
此代码正在场景的 didMoveTo 方法中执行。
在碰撞时,这是我的代码:
override func didBegin(_ contact: SKPhysicsContact, with circle: Circle) {
circle.physicsBody?.collisionBitMask = CollisionCategoryBitmask.allExcept(c).rawValue
circle.node.texture = txt
}
txt 创建于此:
var txt: SKTexture{
get{
return SKTexture(imageNamed: c)
}
}
c 是一个字符串,其值为 "cyan"
我认为这不起作用的原因是 "node" 变量的计算值。
您所做的是在您引用 "node" 变量时创建一个新节点。当你做 addChild(node)
您正在做两件事:创建一个新节点,然后将其添加为场景的子节点。
所以,如果你这样做
node.texture = SKTexture(imageNamed: "cyan")
您正在创建一个新节点并设置其纹理,但这与您添加到场景中的节点不同。
为避免这种情况,将创建的节点保存在变量中并使用该变量设置新纹理。
它对我有用 :) 希望这对您有所帮助
这个位有问题...
var node: SKSpriteNode {
let node = SKSpriteNode(imageNamed: txtName)
node.size = CGSize(width: 30, height: 30)
node.name = "circle"
return node
}
每次访问节点时都会重新分配纹理 "txtName"
它需要...
lazy var node: SKSpriteNode = {
let node = SKSpriteNode(imageNamed: txtName)
node.size = CGSize(width: 30, height: 30)
node.name = "circle"
return node
}()
在我的游戏中,我正在创建一个具有特定纹理的 Circle 对象,但是例如,如果 Circle 撞到特定的墙,我希望它的纹理发生变化。不幸的是,由于某种原因这不起作用,我不知道为什么。 这是我的 Circle class 代码:
class Circle: SKNode, GKAgentDelegate{
let txtName = "farblos"
var node: SKSpriteNode {
let node = SKSpriteNode(imageNamed: txtName)
node.size = CGSize(width: 30, height: 30)
node.name = "circle"
return node
}
let agent: GKAgent2D
init(position: CGPoint) {
agent = GKAgent2D()
agent.position = vector_float2(x: Float(position.x), y: Float(position.y))
agent.radius = Float(15)
agent.maxSpeed = 50.0
agent.maxAcceleration = 20.0
super.init()
self.position = position
agent.delegate = self
addChild(node)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
只是为了测试目的,我在将节点添加为子节点后直接添加了这段代码。
node.texture = SKTexture(imageNamed: "cyan")
加载纹理时没有错误。该图像肯定存在,我可以从中创建一个 SKTexture。
你知道为什么纹理没有改变吗?
Circle 对象是这样创建的:
for _ in 1...i {
let entity = Circle(position: CGPoint.randomPoint(inBounds: b, notCollidingWith: allBoundaries))
agentSystem.addComponent(entity.agent)
allCircles.append(entity)
self.addChild(entity)
}
此代码正在场景的 didMoveTo 方法中执行。
在碰撞时,这是我的代码:
override func didBegin(_ contact: SKPhysicsContact, with circle: Circle) {
circle.physicsBody?.collisionBitMask = CollisionCategoryBitmask.allExcept(c).rawValue
circle.node.texture = txt
}
txt 创建于此:
var txt: SKTexture{
get{
return SKTexture(imageNamed: c)
}
}
c 是一个字符串,其值为 "cyan"
我认为这不起作用的原因是 "node" 变量的计算值。
您所做的是在您引用 "node" 变量时创建一个新节点。当你做 addChild(node)
您正在做两件事:创建一个新节点,然后将其添加为场景的子节点。
所以,如果你这样做
node.texture = SKTexture(imageNamed: "cyan")
您正在创建一个新节点并设置其纹理,但这与您添加到场景中的节点不同。
为避免这种情况,将创建的节点保存在变量中并使用该变量设置新纹理。
它对我有用 :) 希望这对您有所帮助
这个位有问题...
var node: SKSpriteNode {
let node = SKSpriteNode(imageNamed: txtName)
node.size = CGSize(width: 30, height: 30)
node.name = "circle"
return node
}
每次访问节点时都会重新分配纹理 "txtName"
它需要...
lazy var node: SKSpriteNode = {
let node = SKSpriteNode(imageNamed: txtName)
node.size = CGSize(width: 30, height: 30)
node.name = "circle"
return node
}()