如何使节点在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
      }
}

解决方法

您的代码是正确的,除了您使用带有大写字母H的Head而非驼峰式playerHead之类的东西。因此,这意味着您引用的是类定义,而不是实例变量。您需要在Head文件中创建GameScene.swift类的实例,并且应该在代码中引用该实例,而不是Head

这就是我在项目中的方法。我在项目Player.swift中有一个单独的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的类型,并且为它分配了一个纹理这是我为玩家角色的图形创建的图像文件。然后,我对其进行初始化,并添加所需的编码器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对象并对其进行更改,这些更改将实时更新。在这里,我正在用两种方法改变节点的位置,只是为了使示例运行起来更平滑。

我将其放入a demo project on GitHub中,您可以下载该文件并在Xcode中打开以查看文件结构的组织方式。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...