【问题标题】:Missing Type UIEvent?缺少类型 UIEvent?
【发布时间】:2019-04-15 14:14:43
【问题描述】:

我正在使用带有 SpriteKit 和 swift 5 的 XCode 10.2 来创建 Mac 应用程序,但我终其一生都找不到处理节点上点击事件的工作示例。

我能找到的最新信息建议使用以下内容:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { }

但是 XCode 错误,说

Use of undeclared type 'UIEvent'
Use of undeclared type 'UITouch'

我不确定如何继续,因为我找到的所有信息都建议使用上述代码。到目前为止,其他一切都正常。这是我的 GameScene 类:

import SpriteKit

class GameScene: SKScene {

    var circle: SKShapeNode = SKShapeNode();
    var label: SKLabelNode = SKLabelNode();
    var ground: SKShapeNode = SKShapeNode();

    /**
     * Did Move Callback
     */
    override func didMove(to view: SKView) {
        initGround(view: view);
        initLabel(view: view);

        let recognizer = NSClickGestureRecognizer(target: self, action: #selector(tap));
        view.addGestureRecognizer(recognizer);
    }

    /**
     * Click Handler
     */
    @objc func tap(recognizer: NSGestureRecognizer) {
        let viewLocation = recognizer.location(in: view);
        let sceneLocation = convertPoint(fromView: viewLocation);

        addCircle(view: view!, position: sceneLocation);
    }

    // Not Working
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {


    }

    /**
     * Init Ground
     */
    func initGround(view: SKView) {

        let path = CGMutablePath();
        path.move(to: CGPoint(x: 0, y: 30));
        path.addLine(to: CGPoint(x: view.frame.width, y: 30));
        path.addLine(to: CGPoint(x: view.frame.width, y: view.frame.height));
        path.addLine(to: CGPoint(x: 0, y: view.frame.height));
        path.addLine(to: CGPoint(x: 0, y: 30));

        ground.path = path;
        ground.lineWidth = 5;
        ground.strokeColor = SKColor.brown;

        let borderBody = SKPhysicsBody(edgeLoopFrom: path);
        borderBody.friction = 5;
        self.physicsBody = borderBody;

        addChild(ground);
    }

    /**
     * Add Label
     */
    func initLabel(view: SKView) {

        label = SKLabelNode(text: "No Gravity");
        label.name = "no gravity button";
        label.position = CGPoint(x: label.frame.width / 2, y: 5);
        label.fontSize = 12;
        label.fontColor = SKColor.yellow;
        label.fontName = "Avenir";
        label.isUserInteractionEnabled = true;

        addChild(label);
    }

    /**
     * Add Circle
     */
    func addCircle(view: SKView, position: CGPoint) {
        let size = Int.random(in: 1 ..< 50);
        let color = getRandomColor();

        circle = SKShapeNode(circleOfRadius: CGFloat(size));

        // Set Position
        circle.position = position;

        // Set Physics
        circle.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(size));
        circle.physicsBody?.affectedByGravity = false;
        circle.physicsBody?.usesPreciseCollisionDetection = true;
        circle.physicsBody?.restitution = 1; //0.8
        circle.physicsBody?.linearDamping = 0;
        circle.physicsBody?.friction = 0; //0.2
        circle.physicsBody?.isDynamic = true;
        circle.physicsBody?.mass = CGFloat(size);
        circle.physicsBody?.allowsRotation = true;
        circle.physicsBody?.velocity = CGVector(dx: 0, dy: -1000);

        circle.strokeColor = color;
        circle.glowWidth = 1.0;
        circle.fillColor = color;

        addChild(circle)
    }

    func getRandomColor() -> SKColor {
        return SKColor(red: .random(in: 0...1),
                       green: .random(in: 0...1),
                       blue: .random(in: 0...1),
                       alpha: 1.0)
    }
}

有没有人有使用 Swift 5 和在 SpriteKit 中处理点击/触摸的经验?或者也许只是为什么 XCode 说 UIEvent 和 UITouch 不是真实的东西?

谢谢!

【问题讨论】:

  • 这适用于 iOS 还是 Mac 应用程序? – UIEvent 来自 UIKit (iOS),NSGestureRecognizer 来自 AppKit (macOS)
  • 已编辑问题,它是一个 Mac 应用程序 - 但我认为它应该适用于任何一个,不是吗?
  • UIEvent, UITouch, ... 来自 UIKit,仅适用于 iOS。
  • 好吧,开枪——我想那是有道理的。我仍然没有更接近找到用于检测点击节点的文档或示例:/ 了解这非常有帮助

标签: swift sprite-kit


【解决方案1】:

在 Mac 上,您将实现

-(void)mouseDown:(NSEvent *)theEvent {
}

- (void)mouseUp:(NSEvent *)theEvent {
}

- (void)mouseExited:(NSEvent *)theEvent {
}

在每种情况下,您都会调用

CGPoint loc = [theEvent locationInNode:self];

了解点击在场景中发生的位置。

【讨论】:

  • Google 是您的朋友。 raywenderlich.com/…
  • 问题是它是从 2015 年开始的,大部分代码在 swift v5 中不再有效
【解决方案2】:

用户Martin R 指出 UIEvent 和 UITouch 类仅包含在 iOS 项目中。我正在创建一个 Mac 应用程序,但我没有意识到我的 GameScene 类中已经有了点击处理程序:

override func didMove(to view: SKView) {
    let recognizer = NSClickGestureRecognizer(target: self, action: #selector(click));
    view.addGestureRecognizer(recognizer);
}

这会向我已经定义的点击处理程序注册一个回调:

/**
 * Click Handler
 */
@objc func tap(recognizer: NSGestureRecognizer) {
    let viewLocation = recognizer.location(in: view);
    let sceneLocation = convertPoint(fromView: viewLocation);
    let touchedNode = self.atPoint(sceneLocation);

    if let name = touchedNode.name {
        if name == "no gravity button" {
            print("Touched")
        }
    }

    addCircle(view: view!, position: sceneLocation);
}

我能够获得点击的节点名称并按照我最初的意图对其进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2016-06-13
    • 1970-01-01
    • 2011-12-29
    • 2017-10-30
    • 2020-08-04
    相关资源
    最近更新 更多