Показать сообщение отдельно
Старый 12.01.2014, 16:57
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 24  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Isfet, дада не 256, сори
256 это всего возможных, а их в таком раскладе просто нет и твое решение может и поудобнее будет
но если придется, например, еще 'внутренние' скругления (в дырках) учесть, то вариантов прибавится..

хотел по-простому вариант с бордюром нарисовать, но по-простому не выходит - надо еще и диагональные клетки анализировать
Код AS3:
package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageScaleMode;
	import flash.geom.Rectangle;
 
	public class Main extends Sprite
	{
		private var size:Number = 30;
 
		private var srcRounded:Sprite = new Sprite();
		private var srcCorner:Sprite = new Sprite();
		private var srcVLine:Sprite = new Sprite();
		private var srcHLine:Sprite = new Sprite();
 
		public function Main():void
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			srcRounded.graphics.beginFill(0xC0C0C0);
			srcRounded.graphics.drawRoundRect(0, 0, size, size, 0.5 * size, 0.5 * size);
			srcRounded.graphics.endFill();
			srcRounded.graphics.lineStyle(2, 0);
			srcRounded.graphics.drawRoundRect(size/6, size/6, 2*size/3, 2*size/3, size/3, size/3);
 
			srcCorner.graphics.beginFill(0xC0C0C0);
			srcCorner.graphics.drawRect(0, 0, size, size);
 
			srcVLine.graphics.lineStyle(2, 0);
			srcVLine.graphics.moveTo(size / 6, 0);
			srcVLine.graphics.lineTo(size / 6, size);
			srcVLine.graphics.moveTo(5 * size / 6, 0);
			srcVLine.graphics.lineTo(5 * size / 6, size);
 
			srcHLine.graphics.lineStyle(2, 0);
			srcHLine.graphics.moveTo(0, size / 6);
			srcHLine.graphics.lineTo(size, size / 6);
			srcHLine.graphics.moveTo(0, 5 * size / 6);
			srcHLine.graphics.lineTo(size, 5 * size / 6);
 
 
 
			var grid:Array = [
				[0, 1, 1, 0, 0, 0, 1, 1, 0], 
				[1, 1, 0, 1, 1, 1, 0, 1, 1], 
				[1, 1, 0, 0, 0, 1, 0, 1, 1], 
				[1, 1, 0, 0, 0, 1, 0, 1, 1], 
				[1, 0, 1, 1, 1, 1, 1, 0, 1], 
				[1, 1, 1, 0, 0, 1, 1, 1, 1], 
				[1, 1, 1, 0, 0, 1, 1, 1, 1], 
				[1, 1, 1, 1, 1, 1, 1, 1, 1], 
				[0, 1, 0, 1, 1, 1, 0, 1, 0]]
 
 
 
			for (var j:int = 0; j < grid.length; j++) 
			{
				var line:Array = grid[j];
				for (var i:int = 0; i < line.length; i++) 
				{
					if (line[i])
					{
						var tile:Bitmap = getTile(
							line[i - 1],
							grid[j - 1] ? grid[j - 1][i] : 0,
							line[i+1],
							grid[j + 1] ? grid[j + 1][i] : 0
						);
						tile.x = size * i;
						tile.y = size * j;
						addChild(tile);
						tile.alpha = 1 - 0.25 * ((j * 9 + i) % 2);
 
					}
				}
			}
		}
 
		private function getTile(l:Boolean,t:Boolean,r:Boolean,b:Boolean):Bitmap
		{
			var bmd:BitmapData = new BitmapData(size, size, true, 0);
 
 
			drawSegm(bmd, 0, 0, l || t, (t && !l), l&&!t);
			drawSegm(bmd, 1, 0, t);
			drawSegm(bmd, 2, 0, r || t, t && !r, r && !t);
			drawSegm(bmd, 0, 1, l);
			drawSegm(bmd, 1, 1, false);
			drawSegm(bmd, 2, 1, r);
			drawSegm(bmd, 0, 2, l || b, b && !l, l && !b);
			drawSegm(bmd, 1, 2, b);
			drawSegm(bmd, 2, 2, b || r, b && !r, r && !b);
 
 
			return new Bitmap(bmd);
 
 
		}
 
		private function drawSegm(bmd:BitmapData, i:int, j:int, corner:Boolean, vLine:Boolean=false,hLine:Boolean=false):void
		{
 
			var s:Number = size / 3;
			var rec:Rectangle = new Rectangle(i * s, j * s, s, s);
			var src:Sprite = corner ? srcCorner : srcRounded;
			bmd.draw(src, null, null, null, rec);
			if (vLine)bmd.draw(srcVLine, null, null, null, rec);
			if (hLine)bmd.draw(srcHLine, null, null, null, rec);
 
 
		}
 
	}
 
}