需要帮助更改在 didMoveToView 中调用的 SKSpriteNode 的速度、方向和生成时间

Posted

技术标签:

【中文标题】需要帮助更改在 didMoveToView 中调用的 SKSpriteNode 的速度、方向和生成时间【英文标题】:Need help changing speed, direction and spawn time of SKSpriteNode called in didMoveToView 【发布时间】:2015-03-16 06:17:41 【问题描述】:

对不起,文字墙,我只是想很好地解释一下我的游戏是如何设置的,以便您更好地理解我的问题。 我对我目前正在使用 swift 制作的游戏有一些疑问。

我正在制作一个玩家必须躲避敌人的游戏。玩家是一个 SKSpriteNode 图像,它获取它的物理体并在此处添加到场景中:

 override func didMoveToView(view: SKView) 
        player.position = CGPoint(x: size.width/2, y: size.height/2)
        player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
        player.physicsBody?.dynamic = true
        player.physicsBody?.categoryBitMask = PhysicsCategory.Player
        player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
        player.physicsBody?.collisionBitMask = PhysicsCategory.None
        player.physicsBody?.usesPreciseCollisionDetection = true
        addChild(player)
    

这个实现看起来效果很好,我在 Player 和 Enemy 之间发生了碰撞。

敌人也被初始化为 SkSpriteNodes:

func addEnemy() 
        let enemy = SKSpriteNode(imageNamed: “enemy”)
        enemy.name = “enemy”
        enemy.position = CGPoint(x: size.height/2, y: size.width/2)
        self.addChild(enemy)
        enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.width/2.75)
        enemy.physicsBody?.dynamic = true
        enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
        enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Player
        enemy.physicsBody?.collisionBitMask = PhysicsCategory.None 

// code for making the enemies move here (including speed)
        
        enemy.runAction(SKAction.sequence([moveAction,removeAction]))
    

并且在 didMoveToView(view: SKView) 中每 0.7 秒不断生成,如下所示:

    runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock(addEnemy),
            SKAction.waitForDuration(0.7)
            ])
        ))

所以我的问题如下。这是做我想要实现的最合适的方法吗?那是;以不同的间隔不断产生多种不同类型的敌人?

我正在努力弄清楚如何(例如)让敌人在 10 秒后才开始生成,或者我如何通过按下屏幕上的 UIButton 来改变敌人的方向?似乎因为它们都是在视图加载时被调用和创建的,所以我不能对方向、速度等进行不断的更改。

有什么更好的方法可以做到这一点,或者我该如何做我需要的?

谢谢:)

【问题讨论】:

【参考方案1】:

听起来您想要做的是使用更新方法而不是使用重复的 SKAction。

在更新中,您使用 currentTime 计算已经过去了多少时间,然后决定是否应该生成敌人。这也让你有机会根据游戏的当前状态以任何你想要的方式生成敌人。

就按钮而言。这确实取决于您的游戏,但大多数游戏都有某种倒计时或需要某种用户交互才能开始游戏。

编辑

我的 swift 有点生锈了,但它会是这样的......

var lastUpdateTime = 0.0;
var spawnTimer = 0.0;
var nextSpawnTime = 10.0;

override func update(currentTime: CFTimeInterval) 

    if (lastUpdateTime == 0.0)
    
        lastUpdateTime = currentTime
        return
    

    spawnTimer += currentTime-lastUpdateTime

    //Do any other update logic here

    if (spawnTimer >= nextSpawnTime)
    
        spawnTimer = 0.0
        spawn()
    

    lastUpdateTime = currentTime



func spawn ()

    //spawn and change nextSpawnTime if you wish
    println("spawn")


希望这会有所帮助且有意义。

【讨论】:

感谢您的回答,这很有帮助。我在使用 currentTime 更新时每 10 秒调用一次函数时遇到问题。你能帮我解决这个问题吗? 每当我尝试在更新中生成项目时,它们都会不断地生成每次更新调用,这非常快。你能帮忙吗^^ 太棒了,我感激不尽,工作完美! :)

以上是关于需要帮助更改在 didMoveToView 中调用的 SKSpriteNode 的速度、方向和生成时间的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit - didMovetoView 未被调用

尝试在具有 SpriteKit 场景 (SWIFT) 的 didMoveToView 中使用 waitForDuration 延迟生成节点但不工作

应用程序中的调用函数didbecomeactive - Swift 2.0

需要帮助在 Eclipse 中更改我的包名

React:如何停止重新渲染组件或对同一路由更改路由器进行 API 调用

Swift和Spritekit sceneDidLoad被调用多个