iOS Spritekit - SKSpriteNode .centerRect 属性不起作用

Posted

技术标签:

【中文标题】iOS Spritekit - SKSpriteNode .centerRect 属性不起作用【英文标题】:iOS Sprite Kit - SKSpriteNode's .centerRect property not working 【发布时间】:2013-10-31 19:33:58 【问题描述】:

我在浏览 Apple 的 SpriteKit 文档时发现了一个非常有用的功能,我可以在编写 UI 时使用它。问题是我无法让它工作。

请查看此页面并向下滚动到“调整 Sprite 大小”-Apple Docs

我确实复制了图像尺寸并使用了相同的代码,以防我做错了什么。但我总是得到一个拉伸的图像,而不是保持相同比例的正确“端盖”。

我指的是这段代码:

SKSpriteNode *button = [SKSpriteNode spriteWithImageNamed:@"stretchable_button.png"];
button.centerRect = CGRectMake(12.0/28.0,12.0/28.0,4.0/28.0,4.0/28.0);

我做错了什么?有没有我遗漏的步骤?

编辑:

这是我一直在使用的代码。我将它从我的按钮类中剥离并尝试将它与 SKSPriteNode 一起使用,但问题仍然存在。我还更改了图像以确保不是那样。我使用的图像是正常尺寸的 32x32。

SKSpriteNode *button = [SKSpriteNode spriteNodeWithImageNamed:@"Button.png"];
[self addChild:button];

button.position = ccp(200, 200);
button.size = CGSizeMake(128, 64);
button.centerRect = CGRectMake(9/32, 9/32, 14/32, 14/32);

【问题讨论】:

何时/如何将按钮添加到视图中? 我在我的 SKScene 的 init 方法中添加了按钮 【参考方案1】:

如果您调整 sprites .scale 属性,.centerRect 属性的工作方式与文档中所述相同。

试试:

SKTexture *texture = [SKTexture textureWithImageNamed:@"Button.png"];
SKSpriteNode *button = [[SKSpriteNode alloc] initWithTexture:texture];
button.centerRect = CGRectMake(9/32, 9/32, 14/32, 14/32);
[self addChild:button];    
button.xScale = 128.0/texture.size.width;
button.yScale = 64.0/texture.size.height;

【讨论】:

最后一行代码是否存在剪切和粘贴错误?应该是 yScale 和高度吗?【参考方案2】:

9/32 是整数除法,因此传递给CGRectMake 的结果为零。其他三个参数同上。如果您使用像您引用的示例那样的浮点文字,您可能会得到更好的结果。

【讨论】:

【参考方案3】:

这里更新一下它是如何工作的。顺便说一句,我的图像尺寸宽度是 48 像素,高度是 52 像素,但这根本不重要。可以使用任何图像:

SKSpriteNode *button = [SKSpriteNode spriteNodeWithImageNamed:@"Button.png"];

//(x, y, width, height). First two values are the four corners of the image that you DON'T want touched/resized (They will just be moved).
//The second two values represent how much of images width & height you want cut out & used as stretching material. Cut out happens from the center of the image.
button.centerRect    = CGRectMake(20/button1.frame.size.width, 20/button1.frame.size.height, 5/button1.frame.size.width, 15/button1.frame.size.height);

button.position      = CGPointMake(self.frame.size.width/2, self.frame.size.height/2); //Positions sprite in the middle of the screen.
button.xScale        = 4; //Resizes width (This is all I needed).
//button.yScale      = 2; //Resizes height (Commented out because I didn't need this. You can uncomment if the button needs to be higher).
[self addChild:button];

阅读本文档中名为“调整 Sprite 大小”的部分:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Sprites/Sprites.html#//apple_ref/doc/uid/TP40013043-CH9-SW10

“图 2-4 可拉伸的按钮纹理”演示了 (x, y, width, height) 的工作原理。

【讨论】:

【参考方案4】:

根据 rwr 的回答,这里是 SKSpriteNode 的有效初始化方法。我在自己的游戏中使用它。基本上,您在输出图像周围制作 10px 的插图。然后这样称呼它:

[[HudBoxScalable alloc] initWithTexture:[atlas textureNamed:@"hud_box_9grid.png"] inset:10 size:CGSizeMake(300, 100) delegate:(id<HudBoxDelegate>)clickedObject];

-(id) initWithTexture:(SKTexture *)texture inset:(float)inset size:(CGSize)size 
    if (self=[super initWithTexture:texture]) 

        self.centerRect = CGRectMake(inset/texture.size.width,inset/texture.size.height,(texture.size.width-inset*2)/texture.size.width,(texture.size.height-inset*2)/texture.size.height);

        self.xScale = size.width/texture.size.width;
        self.yScale = size.height/texture.size.height;

    
    return self;

【讨论】:

不幸的是,这种方法对我不起作用。我正在 iOS8 上进行测试。

以上是关于iOS Spritekit - SKSpriteNode .centerRect 属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 Spritekit 滞后

SpriteKit 自动恢复和自动暂停 iOS8

如何在 iOS7 中使用 SpriteKit 添加粒子

iOS 混合 Spritekit 和 UIKit

在 SpriteKit 中处理不同的 iOS 设备分辨率

如何使用 iOS 7 SpriteKit 粒子向非游戏的 iOS 应用程序添加粒子效果?