【问题标题】:iPhone 5s SpriteKit drawing odditiesiPhone 5s SpriteKit 画怪
【发布时间】:2015-06-08 15:53:00
【问题描述】:

我了解 iPhone 5s 的像素分辨率为 640 x 1136,点分辨率为 320 x 568(用于向后兼容非 Retina 设备)。

当我使用 SpriteKit 时,问题/困惑/奇怪似乎出现了。 示例:

我正在从左下角 (0, 0) 到右上角(宽度、高度)画一条线。结果是这条线几乎画了一半。事实上,当我打印出屏幕尺寸时,它应该是 320 x 568。所以我决定从 (0, 0) 绘制到 (width * 2, height * 2)。当然,这打印出 640 x 1136。

所以奇怪的是: 尽管我是从一个角到角的对角线绘制,但实际上,它不是,是从一个角到另一个角绘制的。

注意事项:

 - I'm getting the width & height values from self.value.frame.size.
 - The diagonal line seems to draw just fine using any of the iPad simulators.

有什么想法吗?

【问题讨论】:

  • 我无法产生你所说的......如果我在 (0,0) 和 (width, height) 点之间画一条线,我会得到一条从左下角到左上角的线.您可以检查控制器中的场景缩放模式以及将绘制线条的代码从场景的 init 方法移动到 didMoveToView 方法。如果您需要代码,我会写一个答案。此外,有关您如何做所有事情(以及使用哪些方法)的代码示例将有助于调试。

标签: ios sprite-kit skscene skview


【解决方案1】:

无论如何,这就是我取得好成绩的方式:

只需打开一个新项目并尝试以下操作:

在您的 GameViewContrller 中使用 viewWillLayoutSubviews 而不是使用 viewDidLoad

编辑: 这是 Rob Mayoff 撰写的 good explanation,关于 viewDidLoadviewWillLayoutSubviews 等方法。

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;
    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = YES;

    // Create and configure the scene.

    if(!skView.scene){
        GameScene *scene = [GameScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;

        // Present the scene.
        [skView presentScene:scene];
    }
}

所以现在在场景类的 didMoveToView 方法中,画一条线:

    SKShapeNode *yourline = [SKShapeNode node];
    CGMutablePathRef pathToDraw = CGPathCreateMutable();
    CGPathMoveToPoint(pathToDraw, NULL, 0.0, 0.0);
    CGPathAddLineToPoint(pathToDraw, NULL, self.frame.size.width,self.frame.size.height);
    yourline.path = pathToDraw;
    [yourline setStrokeColor:[UIColor redColor]];
    [self addChild:yourline];
    CGPathRelease(pathToDraw);

阅读 this 关于 init 与 didMoveToView 的信息(阅读 LearnCocos2D 发布的 cmets)。

差不多就这些了,希望对你有帮助。

【讨论】:

  • 这可以解决问题。我回家后会试试这个。但就目前而言,我仍然不明白为什么所有 iPad 模拟器都能正常工作。我的缩放比例是 AspectFit。而且我确实相信我正在从 didMoveToView 方法中绘制东西(但我需要验证这一点)。
  • @AlvinfromDiaspar 您应该检查如何在视图控制器中初始化场景。在 viewDidLoad 中,视图的最终大小可能还不知道。我将使用一个好的链接更新我的答案,该链接描述了 viewDidLoad 和 viewWillLayoutSubviews 之间的更多深度差异。另请注意,在我的示例中,我没有从 .sks 文件创建场景。
  • 最好不要从 .sks 文件加载场景?
  • @AlvinfromDispar 从 .sks 创建场景没有错。请记住,从 .sks 创建场景时,场景大小由 GameScene.sks 文件确定(我认为默认大小为 1024x768)。但是你可以像这里描述的那样改变它:stackoverflow.com/a/26266857/3402095
  • 我在 viewWillLayoutSubviews 上创建,并在 didMoveToView 上绘制场景。我认为问题在于我的第一个场景是由 .sks 加载的(它的大小适用于 iPad)。第二个场景我使用第一个场景的大小以编程方式创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多