-
-
Save IBwWG/9ffe25a059983e7e4eeb7640d6645a37 to your computer and use it in GitHub Desktop.
9-Slice Algo Test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package; | |
import flash.display.BitmapData; | |
import flash.geom.Matrix; | |
import flash.geom.Point; | |
import flash.geom.Rectangle; | |
import flixel.FlxSprite; | |
import flixel.FlxState; | |
/** | |
* ... | |
* @author MSGHero | |
*/ | |
class PlayState extends FlxState{ | |
var sprite:FlxSprite; | |
override public function create():Void { | |
sprite = new FlxSprite(50, 0); | |
loadSpriteSheet(); | |
add(sprite); | |
} | |
function loadSpriteSheet():Void { | |
//var bmd = new BitmapData(9, 9, false, 0xffffffff); | |
//var slices = [3, 3, 6, 6]; | |
var bmd = new BitmapData(19, 23, false, 0xffffffff); | |
var slices = [3, 5, 17, 16]; // bottom: 2, right: 7 | |
//var bmd = new BitmapData(19, 23, false, 0xffffffff); | |
//var slices = [3, 5, 16, 20]; // bottom: 3, right: 3 | |
//var bmd = new BitmapData(9, 9, false, 0xffffffff); | |
//var slices = [2, 2, 6, 6]; // bottom: 3, right: 3 | |
// generate an image from slice and size data: | |
var rect = new Rectangle(0, 0, slices[0], slices[1]); | |
bmd.fillRect(rect, 0xffff0000); | |
rect.setTo(slices[0], 0, slices[2] - slices[0], slices[1]); | |
bmd.fillRect(rect, 0xffff8800); | |
rect.setTo(slices[2], 0, bmd.width - slices[2], slices[1]); | |
bmd.fillRect(rect, 0xffffff00); | |
rect.setTo(0, slices[1], slices[0], slices[3] - slices[1]); | |
bmd.fillRect(rect, 0xff00ff00); | |
rect.setTo(slices[0], slices[1], slices[2] - slices[0], slices[3] - slices[1]); | |
bmd.fillRect(rect, 0xff0000ff); | |
rect.setTo(slices[2], slices[1], bmd.width - slices[2], slices[3] - slices[1]); | |
bmd.fillRect(rect, 0xffff00ff); | |
rect.setTo(0, slices[3], slices[0], bmd.height - slices[3]); | |
bmd.fillRect(rect, 0xffffffff); | |
rect.setTo(slices[0], slices[3], slices[2] - slices[0], bmd.height - slices[3]); | |
bmd.fillRect(rect, 0xff888888); | |
rect.setTo(slices[2], slices[3], bmd.width - slices[2], bmd.height - slices[3]); | |
bmd.fillRect(rect, 0xff444444); // not black against black background | |
var original = new FlxSprite(); | |
original.pixels = bmd; | |
add(original); | |
// ----------------------------------------------- 9 slice starts here | |
var leftW = slices[0]; | |
var topH = slices[1]; | |
var rightW = bmd.width - slices[2]; | |
var botH = bmd.height - slices[3]; | |
var centerW = slices[2] - slices[0]; | |
var centerH = slices[3] - slices[1]; | |
var finalW = 259; // <------------------------------------------------ CHANGE THESE | |
var finalH = 83; // <-------------------- | |
var finalCenterW = finalW - leftW - rightW; | |
var finalCenterH = finalH - topH - botH; | |
var scaleHoriz = finalCenterW / centerW; | |
var scaleVert = finalCenterH / centerH; | |
var mat = new Matrix(); | |
var pt = new Point(); | |
var finalImg = new BitmapData(finalW, finalH, true, 0x0); | |
// TL | |
rect.setTo(0, 0, leftW, topH); | |
pt.setTo(0, 0); | |
finalImg.copyPixels(bmd, rect, pt, null, null, true); | |
// T | |
rect.setTo(leftW, 0, finalCenterW, topH); | |
mat.setTo(scaleHoriz, 0, 0, 1, leftW * (1 - scaleHoriz), 0); | |
finalImg.draw(bmd, mat, null, null, rect); | |
// TR | |
rect.setTo(leftW + centerW, 0, rightW, topH); | |
pt.setTo(finalW - rightW, 0); | |
finalImg.copyPixels(bmd, rect, pt, null, null, true); | |
// L | |
rect.setTo(0, topH, leftW, finalCenterH); | |
mat.setTo(1, 0, 0, scaleVert, 0, topH * (1 - scaleVert)); | |
finalImg.draw(bmd, mat, null, null, rect); | |
// C | |
rect.setTo(leftW, topH, finalCenterW, finalCenterH); | |
mat.setTo(scaleHoriz, 0, 0, scaleVert, leftW * (1 - scaleHoriz), topH * (1 - scaleVert)); | |
finalImg.draw(bmd, mat, null, null, rect); | |
// R | |
rect.setTo(leftW + finalCenterW, topH, rightW, finalCenterH); | |
mat.setTo(1, 0, 0, scaleVert, finalCenterW - centerW, topH * (1 - scaleVert)); | |
finalImg.draw(bmd, mat, null, null, rect); | |
// BL | |
rect.setTo(0, topH + centerH, leftW, botH); | |
pt.setTo(0, topH + finalCenterH); | |
finalImg.copyPixels(bmd, rect, pt, null, null, true); | |
// B | |
rect.setTo(leftW, topH + finalCenterH, finalCenterW, botH); | |
mat.setTo(scaleHoriz, 0, 0, 1, leftW * (1 - scaleHoriz), finalCenterH - centerH); | |
finalImg.draw(bmd, mat, null, null, rect); | |
// BR | |
rect.setTo(leftW + centerW, topH + centerH, rightW, botH); | |
pt.setTo(leftW + finalCenterW, topH + finalCenterH); | |
finalImg.copyPixels(bmd, rect, pt, null, null, true); | |
// render | |
sprite.pixels = finalImg; | |
sprite.dirty = true; | |
} | |
} |
Yo, I'm using this gist for some 9-slice stuff but I have a few changes to make. Yours is correct as far as I can tell, but it can be expanded a bit.
Also, are you sure that the Yes, it is neededleftW * (1 - scaleHoriz)
parts are correct? Should it just be -leftW * scaleHoriz
?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Niceeeeeeeeee