Objective c 自定义按钮类setuserinteractionenabled
注意:这是用于OSX应用程序,而不是iOS应用程序 我正在创建一个自定义按钮类,它是SKSpriteNode的一个子类。我希望这个类能够处理按钮按下,所以我发现我必须将setuserinteractionenabled设置为YES。当我在自定义按钮类中执行此操作时,mouseDown事件会接收消息。创建按钮的SKScene在单击按钮时不再接收消息。有没有办法解决这个问题?我甚至尝试在SKScene中启用setuserinteractionenabled,但没有成功。我找不到任何问题来解决这个问题 按钮Objective c 自定义按钮类setuserinteractionenabled,objective-c,button,sprite-kit,Objective C,Button,Sprite Kit,注意:这是用于OSX应用程序,而不是iOS应用程序 我正在创建一个自定义按钮类,它是SKSpriteNode的一个子类。我希望这个类能够处理按钮按下,所以我发现我必须将setuserinteractionenabled设置为YES。当我在自定义按钮类中执行此操作时,mouseDown事件会接收消息。创建按钮的SKScene在单击按钮时不再接收消息。有没有办法解决这个问题?我甚至尝试在SKScene中启用setuserinteractionenabled,但没有成功。我找不到任何问题来解决这个问题
#import <SpriteKit/SpriteKit.h>
typedef enum ButtonState {
UNPRESSED,
PRESSED
} ButtonState;
@interface Button : SKSpriteNode
@property ButtonState state;
-(id)initButtonWithImage:(NSString*)unselectedImage selectedImage:(NSString*)selectedImage;
-(void)setButtonState:(NSString*)event;
@end
GameMenu.m(一个场景)
AppDelegate.m
....(header files etc)
@implementation AppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
/* Set up the window for the app */
NSRect frame = [_window frame];
frame.size = CGSizeMake(1280, 740);
[_window setFrame: frame display: YES animate: NO];
[_window center]; //sets the window to the centre of the screen
/* Pick a size for the scene */
//SKScene *scene = [ChordAttackMenu sceneWithSize:CGSizeMake(1280, 720)]; //ChordAttack Menu
//SKScene *scene = [MyScene sceneWithSize:CGSizeMake(1280, 720)]; //ChordAttack
//SKScene *scene = [NoteBlasterMenu sceneWithSize:CGSizeMake(1280, 720)]; //BassBlaster Menu
//SKScene *scene = [NoteBlaster sceneWithSize:CGSizeMake(1280, 720)]; //BassBlaster
SKScene *scene = [GameMenu sceneWithSize:CGSizeMake(1280, 720)];
/* Set the scale mode to scale to fit the window */
//scene.scaleMode = SKSceneScaleModeAspectFit;
scene.scaleMode = SKSceneScaleModeAspectFill;
[self.skView presentScene:scene];
self.skView.showsFPS = YES;
self.skView.showsNodeCount = YES;
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
return YES;
}
所以这很奇怪。你可以看出,我不是目标c最好的。但根据苹果公司的说法,在你处理完事件后,你会将其传递给响应者链
[super theEvent];
但在本例中,游戏场景是按钮的父级,而不是其超级视图。因此,您需要做的是这样调用事件:
[self.parent theEvent];
或
最好有一个控制器以一种不太复杂的方式管理这些事件。因为添加的每个孩子都希望向上传递事件,所以响应者链将需要实现上述代码。在GameMenu.m中的initButtons方法中,将每个按钮的下一个响应者设置为
chordAttackButton.nextResponder = self;
noteBlasterButton.nextResponder = self;
在Button类中,通过将鼠标向下/向上事件传递到响应程序链
-(void)mouseDown:(NSEvent *)theEvent {
[self setButtonState:@"mousedown"];
[super mouseDown:theEvent];
}
-(void)mouseUp:(NSEvent *)theEvent {
[self setButtonState:@"mouseup"];
[super mouseUp:theEvent];
}
你是怎么做到的?我试过这个,但它给了我一个错误<代码>chordAttackButton.acceptsFirstResponder=true哦,对不起,我很笨。你必须在button类中重写它,所以我必须为第一个响应者创建一个setter?我有点困惑。我以前从未与急救人员合作过。请帮助:/好吧,假设我刚刚用你的代码创建了一个项目,它似乎工作正常。你能发布你的AppDelegate.m吗?嘿,伙计/姑娘,我测试了你的代码,把它弄得一团糟。这对我来说很好。按钮和场景都接收它们的适当事件。
[self setNextResponder:referenceToGameScene];
[self.nextResponder theEvent];
chordAttackButton.nextResponder = self;
noteBlasterButton.nextResponder = self;
-(void)mouseDown:(NSEvent *)theEvent {
[self setButtonState:@"mousedown"];
[super mouseDown:theEvent];
}
-(void)mouseUp:(NSEvent *)theEvent {
[self setButtonState:@"mouseup"];
[super mouseUp:theEvent];
}