Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тайлинг прямоуголников со скругленными краями (http://www.flasher.ru/forum/showthread.php?t=206073)

udaaff 12.01.2014 03:10

Вложений: 2
Держи пример.
forum.swf   (1.8 Кб)

Isfet 12.01.2014 09:15

Вложений: 1
вот решение без запихивания в массив, но можно и в массив положить

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author Isfet
        */

        public class Main extends Sprite
        {
 
                [Embed(source = '../imgs/0000.png')]        private var Tile0000 :Class;
                [Embed(source = '../imgs/0001.png')]        private var Tile0001 :Class;
                [Embed(source = '../imgs/0010.png')]        private var Tile0010 :Class;
                [Embed(source = '../imgs/0011.png')]        private var Tile0011 :Class;
                [Embed(source = '../imgs/0100.png')]        private var Tile0100 :Class;
                [Embed(source = '../imgs/0101.png')]        private var Tile0101 :Class;
                [Embed(source = '../imgs/0110.png')]        private var Tile0110 :Class;                               
                [Embed(source = '../imgs/0111.png')]        private var Tile0111 :Class;
                [Embed(source = '../imgs/1000.png')]        private var Tile1000 :Class;
                [Embed(source = '../imgs/1001.png')]        private var Tile1001 :Class;
                [Embed(source = '../imgs/1010.png')]        private var Tile1010 :Class;
                [Embed(source = '../imgs/1011.png')]        private var Tile1011 :Class;
                [Embed(source = '../imgs/1100.png')]        private var Tile1100 :Class;
                [Embed(source = '../imgs/1101.png')]        private var Tile1101 :Class;
                [Embed(source = '../imgs/1110.png')]        private var Tile1110 :Class;
                [Embed(source = '../imgs/1111.png')]        private var Tile1111 :Class;
 
                public static const TILE_SIZE:uint = 60;
 
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        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]
                                                        ];
 
                        gridParsing(grid);
 
                }
                private function gridParsing(grid:Array):void {
 
                        var str:String;
                        var columnLen:uint = grid.length;
                        var tile:Bitmap;
 
                        for (var j:int = 0; j < columnLen; j++)
                        {                               
                                var rowLen:uint = grid[j].length;
                                for (var i:int = 0; i < rowLen; i++)
                                {
                                        str = "";
                                        if (grid[j][i]) {
 
                                                str += grid[j - 1] ? getWall(grid[j - 1][i]) : 1;
                                                str += getWall(grid[j][i + 1]);
                                                str += grid[j + 1] ? getWall(grid[j + 1][i]) : 1;
                                                str += getWall(grid[j][i - 1]);
 
                                                tile = new this["Tile"+str] ;
                                                tile.x = TILE_SIZE * i;
                                                tile.y = TILE_SIZE * j;
                                                addChild(tile);
                                        }                                       
                                }
                        }
                }
 
                private function getWall(val:uint):uint {
 
                        if (val) {
 
                                return 0;
                        }
                        else {
                                return 1;
                        }
                }
 
        }
}

Вложение 30356

Итого получаем 16 тайлов, и соответственно если класть в массив будет 16 элементов, а не 256 как вы многократно твердили

Furinax 12.01.2014 15:30

Ребят, всем большое спасибо за помощь, очень интересные решения.

silin, udaff, это реально гениально, вместо того, чтобы увеличивать количество тайлов - наоборот уменьшить да еще и затайлить их самих, никогда бы не догадался), по настоящему изящные решения.

Isfet, извиняюсь и признаю, что был не прав. Мне почему-то проблематично визуально представить все возможные виды тайлов. Могли бы вы, пожалуйста, поделиться картинкой со всеми видами тайлов? Я собираюсь использовать решение silin`а, дописав обводку. Но все равно очень интересно как у вас сделано.

silin 12.01.2014 16:57

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);
 
 
                }
 
        }
 
}


Isfet 12.01.2014 19:48

Вложений: 1
вот виды тайлов на вашем примере

Вложение 30361

название тайла отображает наличие стен в нем, в порядке, как в margin в html (top/right/bottom/left).

вообще это решение - по конкретную задачу, если нужны внутренние скругления и универсальность, тогда уже конечно нужно каждый тайл конструировать программно.


Часовой пояс GMT +4, время: 10:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.