Note that there are some explanatory texts on larger screens.

plurals
  1. POSprite kit and colorWithPatternImage
    primarykey
    data
    text
    <p>Do we have any way of repeating an image across an area, like a SKSpriteNode? <code>SKColor colorWithPatternImage</code> doesn't work unfortunately.</p> <p>Edit:</p> <p>I did the following categories, it seems to work so far. Using Mac, not tested on iOS. Likely needs some fixing for iOS.</p> <pre><code>// Add to SKSpriteNode category or something. +(SKSpriteNode*)patternWithImage:(NSImage*)image size:(const CGSize)SIZE; // Add to SKTexture category or something. +(SKTexture*)patternWithSize:(const CGSize)SIZE image:(NSImage*)image; </code></pre> <p>And the implementations. Put in respective files.</p> <pre><code>+(SKSpriteNode*)patternWithImage:(NSImage*)imagePattern size:(const CGSize)SIZE { SKTexture* texturePattern = [SKTexture patternWithSize:SIZE image:imagePattern]; SKSpriteNode* sprite = [SKSpriteNode spriteNodeWithTexture:texturePattern]; return sprite; } +(SKTexture*)patternWithSize:(const CGSize)SIZE image:(NSImage*)image { // Hopefully this function would be platform independent one day. SKColor* colorPattern = [SKColor colorWithPatternImage:image]; // Correct way to find scale? DLog(@"backingScaleFactor: %f", [[NSScreen mainScreen] backingScaleFactor]); const CGFloat SCALE = [[NSScreen mainScreen] backingScaleFactor]; const size_t WIDTH_PIXELS = SIZE.width * SCALE; const size_t HEIGHT_PIXELS = SIZE.height * SCALE; CGContextRef cgcontextref = MyCreateBitmapContext(WIDTH_PIXELS, HEIGHT_PIXELS); NSAssert(cgcontextref != NULL, @"Failed creating context!"); // CGBitmapContextCreate( // NULL, // let the OS handle the memory // WIDTH_PIXELS, // HEIGHT_PIXELS, CALayer* layer = CALayer.layer; layer.frame = CGRectMake(0, 0, SIZE.width, SIZE.height); layer.backgroundColor = colorPattern.CGColor; [layer renderInContext:cgcontextref]; CGImageRef imageref = CGBitmapContextCreateImage(cgcontextref); SKTexture* texture1 = [SKTexture textureWithCGImage:imageref]; DLog(@"size of pattern texture: %@", NSStringFromSize(texture1.size)); CGImageRelease(imageref); CGContextRelease(cgcontextref); return texture1; } </code></pre> <p>Ok this is needed as well. This likely only works on Mac.</p> <pre><code>CGContextRef MyCreateBitmapContext(const size_t pixelsWide, const size_t pixelsHigh) { CGContextRef context = NULL; CGColorSpaceRef colorSpace; void * bitmapData; //int bitmapByteCount; size_t bitmapBytesPerRow; bitmapBytesPerRow = (pixelsWide * 4);// 1 //bitmapByteCount = (bitmapBytesPerRow * pixelsHigh); colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);// 2 bitmapData = NULL; #define kBitmapInfo kCGImageAlphaPremultipliedLast //#define kBitmapInfo kCGImageAlphaPremultipliedFirst //#define kBitmapInfo kCGImageAlphaNoneSkipFirst // According to http://stackoverflow.com/a/18921840/129202 it should be safe to just cast CGBitmapInfo bitmapinfo = (CGBitmapInfo)kBitmapInfo; //kCGImageAlphaNoneSkipFirst; //0; //kCGBitmapAlphaInfoMask; //kCGImageAlphaNone; //kCGImageAlphaNoneSkipFirst; context = CGBitmapContextCreate (bitmapData,// 4 pixelsWide, pixelsHigh, 8, // bits per component bitmapBytesPerRow, colorSpace, bitmapinfo ); if (context== NULL) { free (bitmapData);// 5 fprintf (stderr, "Context not created!"); return NULL; } CGColorSpaceRelease( colorSpace );// 6 return context;// 7 } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload