【发布时间】: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