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?
我想和 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?