检测滚轮运动和方向

时间:2013-12-31 13:13:58

标签: objective-c macos sprite-kit mousewheel

我正在使用新的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

5 个答案:

答案 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和其他一些视图,例如标签和按钮。

无论如何,我想让集合视图能够水平滚动,父卷轴视图可以垂直滚动。我通过存储和比较deltaXdeltaY值来实现这一目标。

我制作了一个自定义滚动视图类,并将其设置为集合视图的滚动视图。

以下是标题代码:

#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))。您只能使用精灵工具包中的触摸事件。