我正在使用新的 Sprite-Kit 框架编写游戏,并希望使用鼠标滚轮来更改玩家的枪。首先我想处理滚轮移动时的情况。我尝试了以下方法,来自Cocoa事件处理指南
- (void)scrollWheel:(NSEvent *)theEvent
{
NSLog(@"SCROOOOOOOLL iN MOVeMENT");
}
结果:没什么,我移动鼠标滚轮时没有处理。
知道如何处理此事件吗?
更新: 我看到两个答案谈论来自 NSResponder 或 NSView 的类派生,但我的类派生自 SKScene,我正在使用 Sprite-kit 框架进行编程,而 obj-c 不允许多重继承。
这里是类定义:
#import <SpriteKit/SpriteKit.h>
@interface OpcionesMenu : SKScene
@end
尽管
SKScene
源自 NSResponder
,但它并不是 AppKit 事件的直接接收者。相反,容纳场景的 SKView
(源自 NSView
/UIView
)负责处理事件。您可以通过在场景的 mouseDown
方法上设置断点来观察这一点:
-[TWTMyScene mouseDown:]
-[SKView mouseDown:] ()
-[NSWindow sendEvent:] ()
-[NSApplication sendEvent:] ()
-[NSApplication run] ()
NSApplicationMain ()
因此您可以对
SKView
进行子类化并自己转发 scrollWheel
事件。或者,如果您喜欢危险的生活,您可以将此类别粘贴到任何代码的末尾,它会为您处理:
@implementation SKView(ScrollTouchForwarding)
- (void)scrollWheel:(NSEvent *)event {
[self.scene scrollWheel:event];
}
@end
我认为这会有所帮助:
- (void)scrollWheel:(NSEvent *)theEvent
{
[super scrollWheel:theEvent];
NSLog(@"user scrolled %f horizontally and %f vertically", theEvent.deltaX, theEvent.deltaY);
}
我知道这是一个老问题,但我在集合视图方面遇到了这个问题。所以我有一个
NSScrollView
,其中包含 NSCollectionView
和一些其他视图,例如标签和按钮。
无论如何,我想让集合视图能够水平滚动,父滚动视图能够垂直滚动。我通过存储和比较
deltaX
和 deltaY
值来实现这一点。
我制作了一个自定义滚动视图类并将其设置为集合视图的滚动视图。
这是标题代码:
#import <Cocoa/Cocoa.h>
@interface CustomCollectionScrollView : NSScrollView {
// Current scroll position.
CGFloat positionAxisX;
CGFloat positionAxisY;
}
@end
这是实现代码:
#import "CustomCollectionScrollView.h"
@implementation CustomCollectionScrollView
/// DRAW RECT METHOD ///
-(void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
positionAxisX = 0.0;
positionAxisY = 0.0;
}
/// SCROLL METHODS ///
-(void)scrollWheel:(NSEvent *)theEvent {
// Move the parent scroll view scroll view if the user is
// scrolling vertically otherwise move the collection scroll view.
if ((theEvent.deltaX == positionAxisX) && (theEvent.deltaY != positionAxisY)) {
[self.nextResponder scrollWheel:theEvent];
} else if ((theEvent.deltaX != positionAxisX) && (theEvent.deltaY == positionAxisY)) {
[super scrollWheel:theEvent];
}
// Update the current position values.
positionAxisX = theEvent.deltaX;
positionAxisY = theEvent.deltaY;
}
@end
我对 SpriteKit 不太了解,但我看到有一个
SKView
类,它是 NSView
的子类。 我猜你应该子类 SKView
并将你的 scrollWheel:
方法放在那里。
SKScene 是 SpriteKit 的一部分,SpriteKit 是一个 iOS 框架,而不是 AppKit 框架。因此根本没有滚轮处理(继承链中也没有 NSResponder(但 UIResponder))。您只能使用精灵套件中的触摸事件。