【问题标题】:How to make a node move where you touch the screen in SpriteKit如何使节点移动到您在 SpriteKit 中触摸屏幕的位置
【发布时间】:2020-09-12 17:30:46
【问题描述】:

我已经尝试了很多 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
      }
}

【问题讨论】:

  • 我想我看到了这个问题,但仅供参考,如果您在尝试运行此代码时包含一些关于到底出了什么问题的详细信息,这将有助于改善您的问题。你说你想让节点移动到你触摸的地方,但是你没有告诉我们当你触摸屏幕时应用程序中发生了什么。据推测,该节点并没有像您预期的那样移动,但如果您能向我们提供更多关于到底发生了什么以及为什么这不是您预期的详细信息,这将有助于澄清问题。
  • 节点完全不动

标签: swift sprite-kit


【解决方案1】:

您的代码是正确的,除非您使用带有大写 H 的 Head 而不是像 playerHead 这样的驼峰式代码。所以这意味着您指的是类定义而不是实例变量。您需要在 GameScene.swift 文件中创建 Head 类的实例,并且您应该在代码中引用它而不是 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。现在我可以在这个GameScene 文件的其他地方使用对player 的引用。

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

我把它做成了a demo project on GitHub,你可以下载它并在 Xcode 中打开它来查看文件结构是如何组织的。

【讨论】:

  • 您好,感谢您的帮助,我已经完成了您所说的一切,但是我现在收到一条错误消息:使用未解析的标识符“播放器”
  • @Hugh 您是否在与GameScene 文件相同的目录级别创建了Player 文件?您是否在 GameScene 文件中的正确级别声明了 player 变量(而不是在其中一种方法中)?如果您更新您的问题以显示更多代码以及可能在 Xcode 中显示您的布局的屏幕截图,这将有所帮助。因为当前的问题可能在您显示的代码之外。我更新了我的答案,增加了一些我认为你正在做但可能没有做的事情。
  • @Hugh 我更新了我的 GitHub 并提供了一个示例项目的链接,该项目演示了这一点,我是 providing the link here as well
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多