2015-02-06 3 views
3

Использование SpriteKit, как бы я нарисовал SKTexture, которая повторяется горизонтально, чтобы заполнить ширину SKSpriteNode? Это то, что у меня есть до сих пор - только растягивает текстуру.Как нарисовать текстуру узла Sprite?

var header = SKSpriteNode() 
    let headerTexture = SKTexture(imageNamed: "inGameHeader-1.png") 
    header = SKSpriteNode(texture: headerTexture) 
    header.position = CGPoint(x: 0, y: CGRectGetMaxY(self.frame)-39) 
    header.size.width = CGRectGetWidth(self.frame) 
    header.size.height = 150 
    header.anchorPoint = CGPoint(x: 0,y: 1) 
    addChild(header) 
+0

Я думаю, что в настоящее время нет простого способа наложить текстуру, но вы можете создать много спрайтов в одном проходе рисования. Что дает вам аналогичный результат ... – Whirlwind

+0

hmm, как бы я это сделал? Все, что мне действительно нужно сделать, это повторить градиент ширины 1px, чтобы заполнить фон заголовка. Я просто решил, что это будет более эффективно, чем градиент ширины ширины 600 пикселей, который повторяется только 1px. – Chris

+0

Как я уже сказал, в настоящее время нет простого способа сделать это, но вам не нужно беспокоиться об этом, у Spritekit есть способ оптимизировать вещи: https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/DesigningGameswithSpriteKit/DesigningGameswithSpriteKit.html#//apple_ref/doc/uid/TP40013043-CH7-SW7 – Whirlwind

ответ

0

рабочая реализация основана на использовании SpriteKit шейдер можно найти на this answer. Обратите внимание, что вам нужно будет импортировать заголовок, чтобы использовать его в Swift.

0

Это мое решение: Отправьте свое изображение этой функции с размером спрайта, за которым следует размер плитки. Это вернет черепичную SKTexture.

-(SKTexture *)tiledTextureImage:(UIImage *)image ForSize:(CGSize)size tileSize:(CGSize)tileSize{ 

// First we create a new size based on the longest side of your rect 
int targetDimension = (int)fmax(size.width,size.height); 
CGSize targetSize = CGSizeMake(targetDimension, targetDimension); 

// Create a CGImage from the input image and start a new image context. 
struct CGImage *targetRef = image.CGImage; 
UIGraphicsBeginImageContext(targetSize); 
CGContextRef contextRef = UIGraphicsGetCurrentContext(); 

// Now we simply draw a tiled image 
CGContextDrawTiledImage(contextRef, CGRectMake(0,0, tileSize.width,tileSize.height), targetRef); 
UIImage *tiledTexture = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// Finally create a texture and return it. 
return [SKTexture textureWithImage:tiledTexture]; 
} 
0

вы знаете, вы можете сделать это в UIButton или UIImageView по resizableImageWithCapInsets, так, Вот мое решение:

-(SKTexture *)textureWithImage:(UIImage *)image tiledForSize:(CGSize)size withCapInsets:(UIEdgeInsets)capInsets{ 
//get resizable image 
image = [image resizableImageWithCapInsets:capInsets]; 
//redraw image to target size 
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); 
[image drawInRect:CGRectMake(0, 0, size.width-1, size.height-1)]; 
[[UIColor clearColor] setFill]; 
//get target image 
UIImage *ResultImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
// get texture 
SKTexture * texture = [SKTexture textureWithImage:ResultImage]; 
return texture; 
} 
0

Вот статическая функция для Swift 3 и 4. Не используя расширение в качестве Класс SKTexture фактически не имеет назначенного инициализатора.

Примечание. Это не будет очень результативным. Лучше предварительно загружать текстуру перед использованием или погружаться в мир пользовательских шейдеров.

static func generateTiledTexture(size: CGSize, imageNamed imageName: String) -> SKTexture? { 
    var texture: SKTexture? 

    UIGraphicsBeginImageContext(size) 
    let context = UIGraphicsGetCurrentContext() 

    if let image = UIImage(named: imageName), let cgImage = image.cgImage { 
     context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height), byTiling: true) 

     if let tiledImage = UIGraphicsGetImageFromCurrentImageContext() { 
      texture = SKTexture(image: tiledImage) 
     } 
    } 

    UIGraphicsEndImageContext() 

    return texture 
} 
Смежные вопросы