背景图像大小 Sprite Kit 游戏
Posted
技术标签:
【中文标题】背景图像大小 Sprite Kit 游戏【英文标题】:Background image size Sprite Kit Game 【发布时间】:2013-10-28 14:26:29 【问题描述】:我刚刚开始了一个新的 Sprite Kit 项目来学习如何使用它。我观看并阅读了很多教程,但没有一个教程可以回答我的问题。
我想为我的 iPhone 5S 创建一个应用程序。所以屏幕尺寸是1136x640。我为我的应用程序创建了一个 1136x640 背景图像。但是当我将图像添加到我的应用程序时,它会变得很大! ios 模拟器只显示图像的中间。
谁能告诉我我必须使用什么屏幕尺寸以及为什么?
非常感谢!
这是我从教程中复制的代码。 代码在initWithSize方法的myScene.m文件中
SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
[self addChild:background];
编辑:
我在谷歌上搜索并找到了这个:
必须使用“viewWillLayoutSubviews”更改 viewDidLoad 方法。
这是这个方法:
- (void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.bounds.size.width*2,skView.bounds.size.height*2)];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
起初场景 = MySceneWithSize 行是:
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
但它只是 iPhone 5 屏幕尺寸 (568x320) 的一半。所以我不得不加倍大小。有人知道为什么吗?
【问题讨论】:
只是一个想法:如果你想为你的手机制作一个应用程序,你真的应该主要在你的手机上测试它。根据我的卑微经验,模拟器往往是痛苦的来源。 Mike - 如果您仍然在 SO,您能否在下面标记正确/最有用的答案。我有偏见,但我认为是我的 ;-) @Gilesey - 对不起.. 完全忘记了这个线程。当然。你的答案有效。 【参考方案1】:对您当前问题的简短回答:
background.size = self.frame.size;
长答案,以及关于其他方法的讨论......
场景以逻辑单位工作,而不是物理像素(如其他帖子中所述)。
1 逻辑单元在旧套件上通常为 1 像素,在新套件/iPad 上通常为 2 像素。 这可能在 5 年内达到 4 个像素。
在逻辑单元中工作可以保护您免受将来尺寸变化的影响,并且应该对程序员有所帮助 - 尽管这经常使新手感到困惑。
让图像填充当前场景的最简单方法是将其大小设置为“逻辑单位”,无论它最初是什么大小。
这比使用 SKActions 更好(因为用户最终可能会看到它们,并且在操作完成之前不能依赖基于节点尺寸的任何计算),并且比缩放更好,因为缩放需要你知道原始图像的尺寸。
你可以通过 size 属性来做到这一点,如果你真的想制作动画,也可以通过一个动作来做到这一点。
只是在场景中......
-(void)didMoveToView:(SKView *)view
[super didMoveToView:view];
SKSpriteNode* background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
background.size = self.frame.size;
background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:background];
或者,如果您的图像效果很好,例如在更高的分辨率上,您可以将图像重命名为 myBackground@2x.png,将其添加到您的项目中,您可能根本不需要调整大小,但是您对于分辨率较低的设备,还需要将其缩小 50%,并将其保存为 myBackground.png。
我总是将导入图像的大小设置为我想要的逻辑单位(或屏幕尺寸的百分比)以保持我的理智。
【讨论】:
这是在sprite kit中设置BG图像最重要的部分。背景.size = self.frame.size;干得好。【参考方案2】:我发现,如果图像与您要创建的节点大小不同,则大小调整会有点有趣(例如在非视网膜设备上使用视网膜图像或图像命名不正确)。如果您从图像创建纹理并使用以下内容设置纹理和节点大小,则可以缩放图像以填充:
SKTexture *backgroundTexture = [SKTexture textureWithImageNamed:@"MyImage.png"];
SKSpriteNode *background = [SKSpriteNode spriteNodeWithTexture:backgroundTexture size:self.view.frame.size];
background.position = (CGPoint) CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame);
[scene addChild:background];
我不能 100% 确定这是否能解决您的问题,但可能值得一试。
【讨论】:
很抱歉打扰您...但我很好奇...使用 SKTexture 是否有理由/好处/优势,而不是仅对图像执行类似操作:SKSpriteNode *bgImage = [SKSpriteNode spriteNodeWithImageNamed:@"background"]; 去年玩SpritKit的时候发现[SKSpriteNode spriteNodeWithImageNamed:@"background"];不会将图像缩放到指定的 SKSprideNode 大小(例如,如果我的图像是 20x20,当我将节点大小设置为 100x100 时它不会缩放图像)。然而,做一个单独的 SKTexture 并将其传递给具有不同大小的构造函数会缩放图像。自从 7.1 发布以来,我还没有玩过 SpritKit,所以如果这仍然是真的,请 IDK。【参考方案3】:这条线以点为单位返回大小,而不是像素。这是因为不同的设备具有不同的分辨率,但点的大小相同。在非视网膜设备上,1 个点是 1 个像素,在视网膜设备上,1 个点是两个像素。这就是为什么你从
得到这个尺寸SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
您不想将场景的大小加倍,因为它只是我们屏幕的边界,不可见。
【讨论】:
【参考方案4】:您是否尝试在图片名称的末尾添加“@2x”?
【讨论】:
我认为它可能只适用于 Xcode 5,但 Xcode 可以自动描绘您正在使用的图像分辨率。如果您同时使用 2x 和标准,它通常只会选择 2x 作为自动 这个。另外,请在真实设备中尝试,而不是模拟器。【参考方案5】:我基本上按照上面的答案进行,但是我继续直接设置宽度和高度,这样我就不必担心设置是否正确,当然我还需要检查是否有使用 iPhone4 获得完整的解决方案。
- (void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];
// Configure the view.
SKView * skView = (SKView *)self.view;
if (!skView.scene)
skView.showsFPS = YES;
skView.showsNodeCount = YES;
CGSize tmpSize;
tmpSize.width = 640;
tmpSize.height = 1136;
// Create and configure the scene
SKScene * scene = [CreationScene sceneWithSize:tmpSize];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
【讨论】:
【参考方案6】:这对我有用。这样可以吗?
//Set background image.
SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground.png"];
background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
background.xScale = 0.5;
background.yScale = 0.5;
[self addChild:background];
【讨论】:
没关系,如果你从不改变底层图像尺寸。如果你这样做了,你将不得不改变你的代码。通过设置 .size,您可以保护自己免受这种类型的更改。【参考方案7】:解决方案:
将此代码放入您的 viewWillLayoutSubviews 中,而不是放入加载精灵的 UIViewController 的 viewDidLoad 中。
- (void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];
// Configure the view.
SKView * skView = (SKView *)self.view;
if (!skView.scene)
skView.showsFPS = YES;
skView.showsNodeCount = YES;
// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
说明:这会创建一个大小作为视图边界的场景。但是,当调用 viewDidLoad 时,这是在视图被添加到视图层次结构之前,因此它还没有响应布局更改。所以视图边界可能还不正确,这可能不是启动场景的最佳时间。
此答案复制自:http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners 功劳归于雷 :)。
我和你一样在我的 SKScene 中使用了相同的代码,但是如果没有 Ray 在 UIViewController 中提供的这个解决方案,它会显示场景,它将无法工作。
【讨论】:
【参考方案8】:我确实使用和精灵作为背景。
double escalax = self.size.width/ sprite.size.width ;
double escalay = self.size.height/ sprite.size.height ;
SKAction *mostrar = [SKAction scaleXTo:escalax y:escalay duration:0];
希望对你有帮助!
【讨论】:
【参考方案9】:我和你有同样的问题。经过几天的谷歌搜索和尝试,我终于找到了这个问题的关键。您可以尝试多次更改 scene.scaleMode,直到获得满意的尺寸。我昨晚才发现这个,所以如果你想了解更多,这里有一个链接
https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/Reference/Reference.html#//apple_ref/doc/uid/TP40013024-CH1-DontLinkElementID_3
【讨论】:
终于解决了我的问题。我已经把场景设置为1024*768,所以我的场景高度是768,而不是480。看到这个的每个人都可以尝试一下。以上是关于背景图像大小 Sprite Kit 游戏的主要内容,如果未能解决你的问题,请参考以下文章
iOS Sprite Kit didBeginContact 无法正常工作