我正在构建基于精灵工具包的游戏,缺少“右键单击”实际上很难向用户传达一些重要信息。作为解决方案,我正在考虑手势,如长按,双指敲击等。
如何在SKSpriteNode上实现手势?
当触摸SKSpriteNode时,我正在使用这个来获得类似按钮的行为。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self selectSkill:YES];
}
答案 0 :(得分:2)
在UIGestureRecognizer
之前,您保留了状态变量,用于跟踪触摸的位置和时间。这是一个快捷的解决方案,buttonTouched:
是一种检查UITouch是否在您正在检查的按钮上的方法。
var touchStarted: NSTimeInterval?
let longTapTime: NSTimeInterval = 0.5
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
if let touch = touches.anyObject() as? UITouch {
if buttonTouched(touch) {
touchStarted = touch.timestamp
}
}
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
if let touch = touches.anyObject() as? UITouch {
if buttonTouched(touch) && touchStarted != nil {
let timeEnded = touch.timestamp
if timeEnded - touchStarted! >= longTapTime {
handleLongTap()
} else {
handleShortTap()
}
}
}
touchStarted = nil
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
touchStarted = nil
}
答案 1 :(得分:1)
答案 2 :(得分:0)
没有简单的方法可以做到这一点,但我能想到的一种方法是在你的SKScene中添加一个子SKView,并将一个UIImageView放在SKView中。然后,您可以像SKView一样添加手势识别器。
这是我正在谈论的一个例子:
UIImageView *button = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ButtonSprite"]];
SKView *spriteNodeButtonView = [[SKView alloc] initWithFrame:CGRectMake(100, 100, button.frame.size.width, button.frame.size.height)];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(someMethod:)];
[spriteNodeButtonView addGestureRecognizer:tap];
[spriteNodeButtonView addSubview:button];
您可以将SKView放在任何位置,并使用SKView上的任何手势识别器:UITapGestureRecognizer
,UILongPressGestureRecognizer
,UISwipeGestureRecognizer
,UIPinchGestureRecognizer
,{{1} },UIRotationGestureRecognizer
或UIPanGestureRecognizer
。
然后为你的方法实现做这样的事情:
UIScreenEdgePanGestureRecognizer