如何在OS X SpriteKit游戏中使用AppKit元素?

时间:2014-07-08 22:30:57

标签: macos sprite-kit appkit nsbutton

我试图在我的OS X SpriteKit游戏中使用像NSButtons和NSPopUpButtons这样的AppKit元素。对于iOS,我知道你可以使用UIKit,但你不能将UIKit与OS X SpriteKit游戏一起使用。我试图在SKView顶部添加按钮,但它没有显示出来。我看了下面的帖子(Using an NSButton with SpriteKit),但我不清楚我应该怎么做。如何通过代码和/或xib文件进行所有正确的连接(对于按钮或任何其他AppKit UI元素),以便它显示在我的场景中?

[编辑]我浏览了Apple SpriteKit游戏示例("冒险"),看起来他们已经在某种程度上为他们的SKView添加了一个NSButton。

2 个答案:

答案 0 :(得分:0)

这是从教程视频中获取的,但我再也找不到视频了。但是,一种方法是在游戏顶部显示一个工作表,并将你的cocoa控件保存在一个独立于spritekit内容的xib文件中。

我已经包含了下面的代码,用于在spritekit设置中显示工作表。

它还需要一个窗口.xib文件(所以一定要选择一个窗口)。将.sheetWindow属性连接到窗口,将文件所有者连接到下面包含的类。此外,我已将xib文件中的按钮连接到“closeWindow:”方法,但这完全是可选的。

此示例用于编辑NSManagedObjects,但我删除了大量实际编辑代码以使示例更清晰。我保留了委托,因为你经常想回调打开它的spritekit。

通过创建以下类的对象并调用“showWindowFor ...”方法来显示工作表。此方法采用NSManagedObject,但这当然是完全可选的。你可以制作一个名为“ - (void)showWindow”的方法。

·H

#import <Foundation/Foundation.h>

@protocol AttributeEditorSheetDelegate <NSObject>

-(void) attributeEditorSavedObject;

@end

@interface AttributeEditorSheet : NSObject {
    NSManagedObject * _editedObject;
}

@property (weak,nonatomic) id <AttributeEditorSheetDelegate> delegate;
@property (weak) IBOutlet NSWindow * sheetWindow;
- (IBAction)closeWindow:(NSButton *)sender;

-(void) showWindowForNSManagedObject:(NSManagedObject *)editedObject;

@end

的.m

#import "AttributeEditorSheet.h"

@implementation AttributeEditorSheet

-(void) showWindowForNSManagedObject:(NSManagedObject *)editedObject {
    if (self.sheetWindow==nil) {
        [[NSBundle mainBundle] loadNibNamed:@"AttributeEditorWindow" owner:self topLevelObjects:nil];
    }

    _editedObject = editedObject;


    [[NSApplication sharedApplication].mainWindow beginSheet:self.sheetWindow completionHandler:nil];
}


- (IBAction)closeWindow:(NSButton *)sender {
    [self.delegate attributeEditorSavedObject];
    [[NSApplication sharedApplication].mainWindow endSheet:self.sheetWindow];
}
@end

答案 1 :(得分:0)

只需确保为要在SKView前显示的任何AppKit视图或控件启用图层支持。 UIKit视图都内置了CALayers。 AppKit有它们但默认情况下不启用。

您可以在IB或代码中使用 [someViewOrControl setWantsLayer:YES]