Sprite Kit Universal App:iPhone和Non-Retina iPad的相同纹理



由于Sprite Kit/ios7仅支持iPhone 4和更新,因此我不需要iPhone上的非Retina纹理。因此,如果我有一个通用的应用程序,并且想保持整体捆绑包尺寸较小,则可以为视网膜iPhone和非Retina iPad使用相同的纹理。(像这个问题一样)

为此,我不使用标准命名约定,例如"@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当然是一半。)

预先感谢您的帮助!

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

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

…并以这样的命名:" mytexture.png"one_answers" mytexture@2x~ipad.png"。

在iPad上,一切都按预期工作。在iPhone上,我不想加载 @2x纹理,因此设备模型" 〜Ipad"。现在,iPhone上没有 @2x纹理,因此" myTexture.png"已加载。由于我定义了大小:我的SKSpriteNode的参数和cgsize的尺寸为iPad上的一半,因此纹理被缩小,现在"视网膜"。

我自己解决了此问题,如下所示:

创建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;
}

最新更新