由于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;
}