检测滚轮移动和方向

问题描述 投票:0回答:5

我正在使用新的 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
objective-c macos sprite-kit mousewheel
5个回答
6
投票

尽管

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

3
投票

我认为这会有所帮助:

- (void)scrollWheel:(NSEvent *)theEvent
{
    [super scrollWheel:theEvent];
    
    NSLog(@"user scrolled %f horizontally and %f vertically", theEvent.deltaX, theEvent.deltaY);
}

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

-1
投票

我对 SpriteKit 不太了解,但我看到有一个

SKView
类,它是
NSView
的子类。 我猜你应该子类
SKView
并将你的
scrollWheel:
方法放在那里。


-3
投票

SKScene 是 SpriteKit 的一部分,SpriteKit 是一个 iOS 框架,而不是 AppKit 框架。因此根本没有滚轮处理(继承链中也没有 NSResponder(但 UIResponder))。您只能使用精灵套件中的触摸事件。

© www.soinside.com 2019 - 2024. All rights reserved.