【问题标题】:Swift Sprite Kit Began Touch FunctionSwift Sprite Kit 开始触控功能
【发布时间】:2025-11-24 20:15:01
【问题描述】:

我在搞乱一个 xcode 项目,我试图让一个红球 SKShapeNode 在我触摸它时四处移动。我自己在触摸开始类中的源代码并没有起到作用。我的代码有什么缺陷,我需要做什么才能修复它。

import SpriteKit

class GameScene: SKScene {

    //Rectangle Skeletions
    var leftWallRect = CGRect(x: 0, y: 0, width: 40, height: 1000)

    var ball = SKShapeNode(circleOfRadius: 25);


    override func didMoveToView(view: SKView) {

        // Declare the Sprites in your scene
        var ball = SKShapeNode(circleOfRadius: 25);
        let leftWall = SKShapeNode(rect: leftWallRect);
        let rightWall = SKShapeNode(rect: leftWallRect);
        let pin = SKSpriteNode(imageNamed: "pin");

        // Ball Properties
        ball.strokeColor = UIColor.blackColor()
        ball.fillColor = UIColor.redColor()
        ball.position = CGPointMake(self.frame.width / 2 , self.frame.height / 4 - 100 )
        self.addChild(ball)

        // Left Wall Properties
        leftWall.fillColor = UIColor.purpleColor()
        leftWall.strokeColor = UIColor.blackColor()
        leftWall.position = CGPointMake(self.frame.size.width / 3 - 45, self.frame.size.height / 2 - 400)
        self.addChild(leftWall)

        //Right Wall Properties
        rightWall.fillColor = UIColor.purpleColor()
        rightWall.strokeColor = UIColor.blackColor()
        rightWall.position = CGPointMake(self.frame.size.width / 2 + 175, self.frame.size.height / 2 - 400)
        self.addChild(rightWall)
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */

        let touch = touches.first as! UITouch
        let touchLocation = touch.locationInNode(self)

        if touchLocation == ball.position{

            ball.position = touchLocation

            println("Touches");
        }
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

【问题讨论】:

  • -touchesBegan: withEvent : 被调用了吗? (设置断点看是不是)
  • 我检查了它并没有被调用。我如何解决它? @NicolasMiari
  • 通常是因为属性userInteractionEnabled(继承自UIResponder)设置为false。但是,默认值为true(至少对于UIResponder;对于SKScene 不确定)。

标签: swift sprite-kit touchesbegan touchesmoved


【解决方案1】:

大声笑哇,这很有趣,if touchLocation == ball.position 如果你能击中你的球的确切像素位置,我会印象深刻。你想要的是这样的:

let touch = touches.first as! UITouch
let touchLocation = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(touchLocation)
if touchedNode == ball{
...

但就个人而言,我会做一个SKSpriteNode 的子类,并在这个孩子的触摸例程中做你的球的触摸代码

【讨论】: