【问题标题】:How do I use AppKit elements in a OS X SpriteKit game?如何在 OS X SpriteKit 游戏中使用 AppKit 元素?
【发布时间】:2014-07-08 22:30:56
【问题描述】:

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

[编辑] 我浏览了 Apple SpriteKit 游戏示例(“Adventure”),似乎他们以某种方式向他们的 SKView 添加了一个 NSButton。

【问题讨论】:

    标签: macos sprite-kit appkit nsbutton


    【解决方案1】:

    这是从一个教程视频中截取的,但是很遗憾我找不到该视频了。但是,一种方法是在游戏顶部显示一个工作表,并将您的可可控件保存在与 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
    

    【讨论】:

    • 嗨@Theis,感谢您的回复。什么是 .sheetWindow 属性?我不确定如何执行您所说的这部分,“将 .sheetWindow 属性连接到窗口,并将文件所有者连接到下面包含的类。此外,我已将 xib 文件中的按钮连接到“ closeWindow:" 方法,但这完全是可选的。"
    • .sheetWindow 是 xib 文件(根项)的 NSWindow。连线 => 连接到 xib。
    • 我还是有点困惑。您是说获取 Window 对象(将代表菜单)并将其连接到 .xib 的 SKView 吗?到目前为止我所拥有的是:我创建了一个 SpriteKit OSX 项目。我添加了一个用户界面窗口文件,它创建了一个新的 .xib。
    【解决方案2】:

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

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

    【讨论】:

    • 假设我想在我的 SKScene 之上创建一个 NSButton。我是否必须首先创建一个 NSView,将 NSButton 嵌入到该视图中,然后执行 setWantsLayer 代码? SpriteKit 代码如何调用 AppKit 控件?如果我的问题很奇怪,我提前道歉......我正在努力了解这一切是如何结合在一起的。
    • 这确实是另一个单独发布的问题。简短的版本是应用程序是一个应用程序,无论它是在 ios 还是 os x 上。他们都有一个响应者链。
    • 好的,我单独发一下。
    • 我已经把它贴在这里了:stackoverflow.com/questions/27658589/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多