【问题标题】:How to get SKLabelNode score with image Numbers in spritekit [closed]如何使用 spritekit 中的图像编号获得 SKLabelNode 分数 [关闭]
【发布时间】:2014-10-16 13:29:41
【问题描述】:

我正在为 iPhone 制作一个带有 sprite kit 的游戏。在 gameScene.m 中,我添加了带有图像编号的分数,因此我可以通过以下 2 个案例获得 1 位和 2 位分数,但我想在 case3 中添加 3 位分数,如果您需要了解更多信息,请告诉我在降级之前谢谢。

 //int _gamescore;
_gameScore = 0;
_finalScore = [SKSpriteNode node];
 NSString *digit = [NSString stringWithFormat:@"%i",_gameScore];
[self setScore:(int)digit.length];

-(void)setScore:(int)numberofDigitsInScore
  {
    NSMutableString *scorestring = [NSMutableString stringWithFormat:@"%i", _gameScore];
    [_finalScoreSprite removeAllChildren];
    double val1;
    int sides;
     CGFloat y = self.size.height/2 -10;//position of score on screen

switch (numberofDigitsInScore) {
   case 1:      //  0-9 numbers
       {
           NSString *digit =[scorestring substringFromIndex:0];
           SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:[NSString      
           stringWithFormat:@"Number%@",digit]]; // Number(images 0-9 number images)
           sprite.position = CGPointMake(self.size.width/2, y );
           [_finalScore addChild:sprite];
           break;
       }

 case 2:     //   10-99 numbers
       {
        for (int i = 0; i < scorestring.length; i++) {
            sides =(i!=0)? 1 :-1;
            NSString *digit= [scorestring substringWithRange:NSMakeRange(i, 1)];
            SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:[NSString
             stringWithFormat:@"Number%i",digit.intValue]];

            if (digit.intValue == 1)
            {
                val1 = 5   ;
            } else{
                val1 = 0;
            }
            sprite.position = CGPointMake(self.size.width/2 + (17 -val1)*sides, y);
            [_finalScore addChild:sprite];
        }

        break;
}

【问题讨论】:

  • 所有这些代码都能让你的分数居中吗?
  • 可能使用适当的字符串格式化程序,例如这个:@"%03d"?
  • 你的意思是让你的分数居中?这是图像数字分数格式的代码,我只希望案例 3 加 3 位数字?
  • 它不工作的漏洞

标签: ios objective-c iphone ios7 sprite-kit


【解决方案1】:

我建议您概括代码以避免创建多个案例(每个分数长度一个)。这是一种方法...

  1. 创建一个 SKNode
  2. 将数字添加到 SKNode 并使用每个数字的宽度(即 sprite.size.width)加上一些字符间距来设置它们的 x 位置
  3. 使用 -(CGRect)calculateAccumulatedFrame 确定 SKNode 的边界框
  4. 使用边界框的尺寸使节点居中

编辑:这是将一串成比例的位图字符居中的代码

- (SKSpriteNode *) createScoreNode
{
    SKSpriteNode *score = [SKSpriteNode node];
    SKNode *node = [SKNode new];
    NSString *scoreString = [NSString stringWithFormat:@"%i", 12122];
    CGFloat posX = 0;
    for (int i=0; i<[scoreString length]; i++) {
        NSString *digit = [scoreString substringWithRange:NSMakeRange(i,1)];
        SKSpriteNode *digitSprite = [SKSpriteNode spriteNodeWithImageNamed:
                                     [NSString stringWithFormat:@"Number%@",digit]];
        digitSprite.anchorPoint = CGPointMake(0,0);
        digitSprite.position = CGPointMake(posX,0);
        [node addChild:digitSprite];
        posX += digitSprite.size.width + kCharacterSpacing;
    }
    CGRect boundingBox = [node calculateAccumulatedFrame];
    CGFloat nodeX = -boundingBox.size.width/2;
    CGFloat nodeY = -boundingBox.size.height/2;

    node.position = CGPointMake(nodeX, nodeY);

    [score addChild:node];
    return score;
}

【讨论】:

  • 如果你在这里放一些例子或者修改我的代码会很好
  • 我看到你已经接受了一个答案,但我还是编辑了我的答案,以便你可以比较方法。
  • 还没有尝试过,但现在我正在处理声音开/关,很快就会尝试
  • 嗨,今天我在模拟器编号上运行它时遇到了有趣的错误,图像变得完美,但是当我在 iphone 上运行时,它只显示 x 框和芽(SKTexture:加载图像资源时出错:“Number1”2014- 10-01 20:25:14.916 Ring[1454:518317] SKTexture:加载图像资源时出错:所有数字的“Number1”)?
  • 要检查两件事:1) 图像的名称拼写是否正确?模拟不区分大小写,但设备是和 2)您在非视网膜模拟器设备上测试并且您的设备是视网膜。在后一种情况下,您将需要名为“Number1@2x.png”的图像的视网膜版本。
【解决方案2】:

意大利面条代码的急性案例。尝试简化。消除隐晦的变量名称,例如 val1sides。您不应该两次编写相同的代码,并且应该足够概括以适用于任意位数。

CGFloat widthOfDigit = .... // figure this out beforehand. Include spacing.
NSString *scoreString = [NSString stringWithFormat:@"%i", _score];
CGFloat currentX = (self.size.width - (scoreString.length-1) * widthOfDigit) / 2.0
for (int i=0; i<scoreString.length; i++) {
   NSString *digit = [scoreString substringWithRange:NSMakeRange(i,1)];
   SKSpriteNode *digitSprite = [SKSpriteNode spriteNodeWithImageNamed:
      [NSString stringWithFormat:@"Number%@",digit]];
   digitSprite.position = CGPointMake(currentX,y);
   [_finalScore addSprite:digit];
   currentX += widthOfDigit;
}

【讨论】:

  • 字体成比例(见神秘变量 val1)。
  • 不过,我的示例展示了如何简化这一点。您可以不同地计算大小,然后添加不同的增量,或者您可以将字符间隔一点以使它们具有相同的宽度。
  • 你试过其他答案了吗?
  • aiden 我试过用另一个,但如果有人帮助我,我无法正确使用它,那就太好了
  • 感谢 mundi 帮助我,在你的帮助下我想通了,它现在可以正常工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多