触摸功能在 SpriteKit 中不起作用吗

Posted

技术标签:

【中文标题】触摸功能在 SpriteKit 中不起作用吗【英文标题】:Did touch function not working in SpriteKit 【发布时间】:2021-03-20 11:13:40 【问题描述】:
import SpriteKit


class GameScene: SKScene 
    var cam: SKCameraNode?
    var player: SKSpriteNode?
    
    
    
    
    override func didMove(to view: SKView) 
       super.didMove(to: view)
       cam = SKCameraNode()
       self.camera = cam
       self.addChild(cam!)
        player = self.childNode(withName: "player") as? SKSpriteNode
    
    
     func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
        let touch:UITouch = touches.anyObject() as! UITouch
        let touchLocation = touch.location(in: self)

        if touchLocation.x < self.frame.size.width / 2 
            let moveRight = SKAction.moveBy(x: 300, y: 0, duration: 1)
            player?.run(moveRight)
         else 
            let moveLeft = SKAction.moveBy(x: -300, y: 0, duration: 1)
            player?.run(moveLeft)
            
        
    
    
    
    override func update(_ currentTime: TimeInterval) 
        super.update(currentTime)
        if let camera = cam, let pl = player 
          camera.position = pl.position
        
      
    
    

这是我的整个游戏场景和我使用 sk 场景拖放到屏幕上的精灵。如果这会影响任何事情,我已经在场景中添加了一个相机。感谢您的帮助。

【问题讨论】:

我认为你应该重写 touchesBegan 函数而不是创建你自己的函数。 @JohnL 给我这个错误 - 方法不会覆盖其超类中的任何方法 【参考方案1】:

您需要覆盖触摸开始功能。它还有助于放入打印声明以表明正在接收触摸。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
  for touch in touches 
  print("touch detected")
  let touchLocation = touch.location(in: self)

   if touchLocation.x < self.frame.size.width / 2 
       let moveRight = SKAction.moveBy(x: 300, y: 0, duration: 1)
       player?.run(moveRight)
    else 
       let moveLeft = SKAction.moveBy(x: -300, y: 0, duration: 1)
       player?.run(moveLeft)
   
  
 

【讨论】:

谢谢它有效,但无论我在哪里点击它似乎都只会向右移动。我认为这是因为我指定了框架大小而不是显示的实际视图。你知道我该如何解决这个问题吗? 我建议您打印 touchLocation.x 并多次触摸屏幕以了解您正在处理的数据。也打印出 frame.size.width。比较这 2 个,因为它们构成了 if 语句的 2 个部分。 您可以在运行 moveRight 或 moveLeft 操作之前查看 player?.removeAllActions(),它将停止当前在节点上运行的所有操作。 所以当我触摸最右边时它会向左移动,然后当我在同一个地方再次点击它时它会再次向右移动哈哈。我现在就按照你的指示去做。【参考方案2】:
import SpriteKit


class GameScene: SKScene 
    var cam: SKCameraNode?
    var player: SKSpriteNode?
    
    
    
    
    override func didMove(to view: SKView) 
       super.didMove(to: view)
       cam = SKCameraNode()
       self.camera = cam
       self.addChild(cam!)
        player = self.childNode(withName: "player") as? SKSpriteNode
    
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
      for touch in touches 
      print("touch detected")
      let touchLocation = touch.location(in: self)

        if touchLocation.x < (player?.position.x)! 
           let moveRight = SKAction.moveBy(x: 300, y: 0, duration: 1)
        print("right")
           player?.run(moveRight)
        else 
           let moveLeft = SKAction.moveBy(x: -300, y: 0, duration: 1)
        print("Left")
           player?.run(moveLeft)
       
      
     
    
    override func update(_ currentTime: TimeInterval) 
        super.update(currentTime)
        if let camera = cam, let pl = player 
          camera.position = pl.position
        
      
    
    

我在 JohnL 的帮助下想通了。通过添加 if touchLocation.x

【讨论】:

以上是关于触摸功能在 SpriteKit 中不起作用吗的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 触摸事件在 UIScrollView 中不起作用

触摸手势在 Scrollview(Xcode、Swift)中不起作用

@font-face 在 Firefox 中不起作用 [重复]

wordpress:触摸板(2 指)滚动在 IE 11 / Edge 浏览器中不起作用

AngularJS、SweetAlert.js 在自定义指令中不起作用

React Native 溢出 Touchable 在 Android 中不起作用