我正在使用新的Sprite-Kit框架编写游戏,并希望使用鼠标滚轮来更改玩家的枪。首先,我想在滚轮移动时进行处理。我尝试了Cocoa Event Handling Guide
中的以下方法- (void)scrollWheel:(NSEvent *)theEvent
{
NSLog(@"SCROOOOOOOLL iN MOVeMENT");
}
结果:什么都没有,我移动鼠标滚轮时没有处理。
我知道如何处理此事件?
更新: 我看到两个答案谈论来自NSResponder或NSView的类派生,但我的类派生自SKScene,我使用Sprite-kit框架进行编程,而obj-c不允许多重继承。
这里是类定义:
#import <SpriteKit/SpriteKit.h>
@interface OpcionesMenu : SKScene
@end
答案 0 :(得分:5)
即使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
答案 1 :(得分:0)
我认为这可能有所帮助:
<%= f.collection_select :category_id, Category.all, :id, :name, promt: "Choose a category", class: "form-dropdown" %>
答案 2 :(得分:0)
我知道这是一个老问题,但我在收集视图中遇到了这个问题。所以我的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
答案 3 :(得分:-1)
我对SpriteKit了解不多,但我发现有一个SKView
类是NSView
的子类。我猜你应该继承SKView
并将scrollWheel:
方法放在那里。
答案 4 :(得分:-3)
SKScene是SpriteKit的一部分,它是一个iOS框架,而不是AppKit框架。因此根本没有滚轮处理(并且在继承链中没有NSResponder(但是UIResponder))。您只能使用精灵工具包中的触摸事件。