【问题标题】:Sprite Kit universal app: Same textures for iPhone and non-retina iPad?Sprite Kit 通用应用程序:iPhone 和非视网膜 iPad 的纹理相同?
【发布时间】:2014-02-07 14:04:04
【问题描述】:

由于 Sprite Kit / iOS7 仅支持 iPhone 4 和更新版本,我不需要 iPhone 上的非视网膜纹理。因此,如果我有一个通用应用程序并希望保持整体包的大小较小,我可以为视网膜 iPhone 和非视网膜 iPad 使用相同的纹理。 (比如question

为此,我不使用“@2x”、“~ipad”等标准命名约定。而是根据设备类型加载所有纹理。这是个好主意吗?

简化示例:

SKTexture *myTexture;

if (isIPad && retinaDisplay){        
    myTexture = [SKTexture textureWithImageNamed:@"myTexture_iPad_HD"];
} else {
    // non-retina iPad and retina iPhone
    myTexture = [SKTexture textureWithImageNamed:@"myTexture_iPad_SD"];        
}

SKSpriteNode *mySprite = [SKSpriteNode spriteNodeWithTexture:myTexture size:CGSizeMake(...,...)]

(SKSpriteNode 的 CGSize 取决于设备。iPad 上的“可播放区域”是 960x640。iPhone 上是 480x320。所以在 iPhone 上 CGSize 是一半,当然。)

提前感谢您的帮助!

【问题讨论】:

  • 更重要的问题是:它有效吗?如果是这样,这里没有需要回答的问题。
  • 它似乎奏效了,但我不确定这个解决方案是否会在以后引起问题。所以我认为有人以不同(更好)的方式解决了这个问题。但现在我找到了一个仅使用标准命名约定即可工作的解决方案。

标签: ios objective-c sprite-kit


【解决方案1】:

事实证明,我可以使用标准命名约定来解决这个问题。只要我用……

myTexture = [SKTexture textureWithImageNamed:@"myTexture"];
[SKSpriteNode spriteNodeWithTexture:myTexture size:CGSizeMake(...,...)];

...并像这样命名我的纹理:“myTexture.png”和“myTexture@2x~ipad.png”。

在 iPad 上一切正常。在 iPhone 上,我不想加载 @2x 纹理,因此需要加载设备修饰符“~ipad”。现在 iPhone 上没有 @2x 纹理,因此会加载“myTexture.png”。由于我定义了我的SKSpriteNode 的 size: 参数并且 CGSize 是 iPad 上的一半大小,因此纹理被缩小,现在是“视网膜”。

【讨论】:

    【解决方案2】:

    对于我自己,我已经解决了这个问题如下:

    创建 Objective-C 类别 SKScene + iPad

    #import "SKScene+iPad.h"
    #import <objc/runtime.h>
    
    + (void)load {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Class class = [self class];
    
            SEL originalSelector = @selector(initWithSize:);
            SEL swizzledSelector = @selector(lns_initWithSize:);
    
            Method originalMethod = class_getInstanceMethod(class, originalSelector);
            Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
            BOOL didAddMethod =
            class_addMethod(class,
                            originalSelector,
                            method_getImplementation(swizzledMethod),
                            method_getTypeEncoding(swizzledMethod));
    
            if (didAddMethod) {
                class_replaceMethod(class,
                                    swizzledSelector,
                                    method_getImplementation(originalMethod),
                                    method_getTypeEncoding(originalMethod));
            } else {
                method_exchangeImplementations(originalMethod, swizzledMethod);
            }
        });
    }
    
    - (instancetype)lns_initWithSize:(CGSize)size {
        [self lns_initWithSize:size];
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            self.size = (CGSize) {
                self.size.width / 2.f,
                self.size.height / 2.f
            };
    
        }
        return self;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 2013-02-10
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多