1

当我在 SKScene 上设置背景图像时。我写了下面的代码:

#import "JTEDMyScene.h"
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
@interface MyScene()
@property BOOL isContentCreated;
@end

@implementation MyScene

-(void) didMoveToView:(SKView *)view
{

 if(!self.isContentCreated)
 {
    self.isContentCreated = YES;
    [self createSceneContent];
 }
}

-(void)createSceneContent
{
 [self addChild:[self createBackground]];
}

-(SKSpriteNode *)createBackground
{
SKSpriteNode *backgroundSprite;
SKTexture *textureImage;
if (IS_IPAD) {
    textureImage = [SKTexture textureWithImageNamed:@"home_ipad1.jpg"];
    backgroundSprite = [SKSpriteNode spriteNodeWithTexture:textureImage];
}
backgroundSprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

return backgroundSprite;
}

设备方向模式只有横向左和横向右。我的图像尺寸是宽度 = 1024 和高度 = 768 和 264 dpi。但是图像没有完全显示图像的一部分正在显示。

4

4 回答 4

1

马克的想法是正确的。我认为他的意思是,问题出在您的视图控制器 .m 文件中,而不是在您的场景中。与其在 VC 的 viewDidLoad 方法中创建 SKView 和 SKScene 并呈现 SKScene,不如将该代码放在 viewWillLayoutSubviews 方法中。类似这样的东西:

-(void)viewWillLayoutSubviews  {
  [super viewWillLayoutSubviews];

  SKView * skView = (SKView *)self.view;
    SKScene * scene = [YourScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [skView presentScene:scene];
}

显然,viewWillLayoutSubviews 的调用晚于 viewDidLoad。调用 viewDidLoad 时,视图甚至还没有添加到视图层次结构中。

Ray Wenderlich's Sprite Kit Tutorial for Beginners引用了 SO 的这个答案来解释为什么会发生这种情况。

于 2013-10-07T20:20:16.313 回答
1

尝试在 viewWillLayoutSubviews 中呈现和创建 MyScene - 如果您还没有这样做的话。如果您只是将 viewDidLoad 重命名为 viewWillLayoutSubviews 并重命名超级调用,它可能会起作用。

于 2013-10-04T13:15:19.920 回答
0

我开始了一个空白项目并将您的代码复制粘贴到其中,它工作正常。我知道您说过您设置了设备方向,但是您是否在项目设置中这样做了?这是我能想到的唯一问题。选择您的项目,常规选项卡,然后在部署信息下,有一个“设备”下拉框。选择 iPad 并确保“横向左侧”和“横向右侧”是唯一选中的两个。我的猜测是该项目认为它应该以纵向模式开始,因此它在开始时将您的 768 高图像垂直拉伸到 1024;然后当您的应用程序确定它处于横向时,它只会相应地旋转拉伸的图像,这将导致图像被切断。

于 2013-10-01T19:59:54.857 回答
0

是的,要控制和调整背景图像(在我的情况下)与设备方向相对应,您必须使用-(void)viewWillLayoutSubviews

但别忘了,它默认从第一个场景开始,所以你需要在这个函数中使用一些“sceneNumber”选择器来指向实际场景

于 2014-01-05T07:23:49.887 回答