gpt4 book ai didi

ios - 如何在创建另一个同名 SKSpriteNode 后与 SKSpriteNode 交互?

转载 作者:行者123 更新时间:2023-11-28 13:08:40 26 4
gpt4 key购买 nike

对于令人困惑的问题标题,我深表歉意,但我不太确定如何表述我的问题。我的最终目标是在创建 SKSpriteNode 一定时间后删除它。但是,有一个小并发症。使用以下代码

func remove() {
laser.removeFromParent()
}

runAction(
SKAction.sequence([
SKAction.waitForDuration(5.0),
SKAction.runBlock(remove)
])
)

我能够删除我命名为“激光”的 SKSpriteNode。当我调用一次函数 fireLasers() 时,一切运行顺利,激光在 5 秒后消失。问题是当我在 5 秒内调用它两次时。发生这种情况时,第一道激光会无限期地停留,而第二道激光会比预期的更早消失。我明白为什么会这样,但想知道是否有解决办法。下面是 GameScene 的代码,它创建了世界、背景图像、玩家 Sprite,并定义了 fireLasers 函数。 ViewController 中发生了很多与 Sprite 的速度和方向相关的事情,但我希望这足以找到解决方案。

import SpriteKit

class GameScene: SKScene {

var player = SKSpriteNode()
var world = SKShapeNode()
var worldTexture = SKSpriteNode()
var laser = SKShapeNode()

override func didMoveToView(view: SKView) {
self.anchorPoint = CGPointMake(0.5, 0.5)
self.size = CGSizeMake(view.bounds.size.width, view.bounds.size.height)

// Add world
world = SKShapeNode(rectOfSize: CGSizeMake(7000, 7000))
world.physicsBody = SKPhysicsBody(edgeLoopFromPath: world.path!)
world.fillColor = SKColor.blackColor()
self.addChild(world)

// Add Background Image
worldTexture = SKSpriteNode(imageNamed: "grid")
worldTexture.size = CGSize(width: 7000, height: 7000)

world.addChild(worldTexture)

// Add player
player = SKSpriteNode(imageNamed: "Spaceship")
player.size = CGSize(width: 50, height: 50)
player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 50, height: 50))
player.physicsBody?.affectedByGravity = false
player.physicsBody?.dynamic = true
world.addChild(player)




}

override func update(currentTime: CFTimeInterval) {
world.position.x = -player.position.x
world.position.y = -player.position.y
}


func fireLasers() {
laser = SKShapeNode(rectOfSize: CGSizeMake(10, 50))
laser.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 10, height: 50))
laser.position.x = player.position.x
laser.position.y = player.position.y + CGFloat(50)
laser.fillColor = SKColor.redColor()
laser.physicsBody?.dynamic = true
laser.physicsBody?.affectedByGravity = false
world.addChild(laser)

func remove() {
laser.removeFromParent()
}
runAction(
SKAction.sequence([
SKAction.waitForDuration(5.0),
SKAction.runBlock(remove)
])
)


}



}

最佳答案

与其保持对激光的引用(如您所见,这会迫使您一次只能有一个激光),为什么不对创建的激光节点本身运行一个操作?这将允许您使用方便的 SKAction 类方法 removeFromParent():

let newLaser = makeNewLaser()
let laserAction = SKAction.sequence([SKAction.waitForDuration(5), SKAction.removeFromParent()])
newLaser.runAction(laserAction)

关于ios - 如何在创建另一个同名 SKSpriteNode 后与 SKSpriteNode 交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021098/

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