Cocoa 屏保视图

Cocoa ScreenSaverView

我想和 ScreenSaverView 一起玩 mac OS X.

我遵循了这个教程http://cocoadevcentral.com/articles/000088.php 并且有效(不能说完美,但有效)。 我还在本教程的第 2 部分中看到他们正在玩 openGL 等东西

我有 2 个一般性问题:

1)我可以在屏幕保护视图中使用 SprteKit 吗?

2)我的代码这里有什么问题 -> 它编译得很好,但是除了黑屏我什么也没看到(我想看我的 *.png)。

- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
    self = [super initWithFrame:frame isPreview:isPreview];
    if (self)
    {
        _imageView = [[NSImageView alloc]initWithFrame:[self bounds]];
        [_imageView setImage:[NSImage imageNamed:@"SettingsButton.png"]];
        [self addSubview:_imageView];
        [self setAnimationTimeInterval:1.0];
    }
    return self;
}

编辑:尝试使用绘制矩形:

- (void)drawRect:(NSRect)rect0
{
    [super drawRect:rect0];

    NSImage *anotherImage = [NSImage imageNamed:@"SettingsButton.png"];
    [anotherImage drawAtPoint:NSMakePoint(10,100) fromRect:NSMakeRect(0,0,[anotherImage size].width,[anotherImage size].height) operation:NSCompositeCopy fraction:1.0];


    // Calculate a random color
    CGFloat red = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0;
    CGFloat green = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0;
    CGFloat blue = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0;

    NSColor* color = [NSColor colorWithCalibratedRed:red
                                  green:green
                                   blue:blue
                                  alpha:1];


    NSColor * color2 = [NSColor colorWithPatternImage:anotherImage];
    [color2 set];

    NSBezierPath * path = [NSBezierPath bezierPathWithRect:rect0];
   [path fill];
}

当我设置一种颜色时,我可以看到一个由随机颜色填充的屏幕(正常)

当我使用图像中的图案 color2 时 什么都不起作用 :-( -> 我尝试了不同的图像 那里什么都没有...

我在构建阶段检查过我确实将图像复制为资源包

可能是什么问题?

编辑:好的,所以在我尝试 drawRect 之后,我怀疑 imageNamed 方法造成了麻烦,并将我的原始尝试重写为:

- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
    self = [super initWithFrame:frame isPreview:isPreview];
    if (self)
    {
        _imageView = [[NSImageView alloc]initWithFrame:[self bounds]];
        NSBundle * tempBundle = [NSBundle bundleForClass:[self class]];

    // Load your image, "top.tiff". Don't forget to release it when you are done (not shown).
        NSImage * theImage = [[NSImage alloc] initWithContentsOfFile:
                          [tempBundle pathForImageResource:@"personal1.jpg"]];
        [_imageView setImage:theImage];
        [self addSubview:_imageView];
        [self setAnimationTimeInterval:1.0];

    }
    return self;
}

Whoaallaaa 成功了!!(有点)我看到了我的照片 :-) !!!

至于问题的第 1 部分 -> 是的,这是可能的 刚试过,它有效! 有一点不足的是,我只能使用 cmd 键 xD

退出 ScreenSaver

通过子类化 SKView 并将事件传递给下一个响应者设法解决了这个问题。

然而,它给了我一个绝妙的想法 -> 实际上,它只是打开了一个机会,可以制作一个简单的 SK 游戏作为屏幕保护程序的一部分,这本来是一个可爱的功能。

遗憾的是我无法将其提交到应用商店:)

我不清楚 SpriteKit 视图 (SKView) 是否可以在普通 OSX/iOS 应用程序中使用。我过去搜索过,一无所获。

如果 SpriteKit 与其他游戏框架(它从中借鉴了很多结构)有任何相似之处,那么它将使用传统的游戏循环;即清除屏幕,绘制所有内容,稍等一下,然后重复。

Cocoa 应用程序使用对事件做出反应的运行循环,并采取措施仅重绘需要重绘的内容。

所以我会对你的第一个问题说"No"。

就你的第二个与代码相关的问题而言,我看不出有什么问题,但是我不熟悉那个 init 方法; class 是什么 class?