首页 > 解决方案 > 如何使节点移动到您在 SpriteKit 中触摸屏幕的位置

问题描述

我已经尝试了很多 YouTube 教程,但我就是找不到真正有效的教程。我正在使用 Apple 的框架SpriteKit,我想让一个节点移动到我触摸的地方。任何帮助将不胜感激,这里有我场景中的一些代码:

let Head = SKNode()

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
      for touch in touches {
            let location = touch.location(in: self)
            Head.position.x = location.x
      }
}

标签: swiftsprite-kit

解决方案


您的代码是正确的,除非您使用Head的是大写 H 而不是驼峰式的playerHead. 所以这意味着您指的是类定义而不是实例变量。你需要Head在你的GameScene.swift文件中创建一个类的实例,你应该在你的代码中引用它而不是Head.

这是我在项目中的做法。我在项目中有一个单独的 Swift 文件,名为Player.swift

import SpriteKit

class Player: SKSpriteNode {
    let playerTexture = SKTexture(imageNamed: "playergraphic")
    
    init() {
        super.init(texture: playerTexture, color: .clear, size: playerTexture.size())
    }
    
    // Satisfy the NSCoder required init.
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

所以我建立了一个名为Player(你可以使用不同的名称,但确保像我一样大写)的类,它是一种类型,SKSpriteNode我已经为它分配了一个纹理,这是我为玩家角色的图形创建的图像文件。然后我初始化它并添加所需的 coder init。

现在,转向GameScene文件:

import SpriteKit

class GameScene: SKScene {
    let player = Player()
    
    override func didMove(to view: SKView) {
        addChild(player)
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches {
            player.position = t.location(in: self)
        }
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches {
            player.position = t.location(in: self)
        }
    }
    
}

首先,我player通过创建Player类的实例来声明变量。我决定给它命名,player但你可以随意命名,但你应该使用 camelCase。player现在我可以在这个GameScene文件的其他地方使用该引用。

接下来,在didMove(to:)方法中,我将player对象添加到场景中,以便在场景加载后它会立即出现在屏幕上。最后,在触摸方法中,我引用了player对象并对其进行了实时更新。在这里,我正在做同样的事情,以两种方法更改节点的位置,只是为了让示例运行更顺畅一些。

我把它做成了 GitHub 上的一个演示项目,你可以下载并在 Xcode 中打开它,看看文件结构是如何组织的。


推荐阅读