Форум 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)

Furinax 11.01.2014 15:05

Цитата:

Сообщение от Isfet (Сообщение 1157013)
покажите скрин как должна выглядеть карта по вашей маске[/as3]

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

Цитата:

Сообщение от Isfet (Сообщение 1157013)
а вообще задача абсолютно простая, прочитайте мой пост выше, храните тайлы как я писал выше

Кажется, что простая. Ваш пост выше я прочитал, там не решается что и в какой ситуации отрисовать, а решается как хранить данные, с этим проблем нету.

Цитата:

Сообщение от Isfet (Сообщение 1157013)
роверяете 4 ячейки слева справа сверху и снизу, и составляете строку, допустим если такой вариант:
--0
1 1 1
--0

сверху 0 значит там будет стенка , пишем в строку 1, справа 1 , значит там нет стенки, добавляем в строку "0" , получаем "10" , снизу 0 - > "101" , слева 1 - > "1010",

по полученной строке вытаскиваем тайл из массива
Код AS3:

tile = arr["1010"];


И приходим ровно к тому же решению что у меня сейчас, только вместо сотни if`ов - будет массив с сотней ячеек типа:

Код AS3:

arr["0000"]
arr["0001"];
arr["0011"];
arr["0111"];
arr["1111"];
arr["1000"];
arr["1100"];
arr["1110"];
arr["1110"];
arr["0101"];
...
и так далее


Isfet 11.01.2014 15:15

это не массив всевозможных комбинаций (а их 256), это массив который хранит данные о том, с какой стороны у вашего тайла-картинки - есть стена. допусти левый верхний тайл из вашего изображения должен лежать в ячейке arr["0011"]

Akopalipsis 11.01.2014 15:16

Тут вот про генерацию пазла и внизу пример, может Вам пригодится.

Furinax 11.01.2014 15:27

Цитата:

Сообщение от Isfet (Сообщение 1157019)
это не массив всевозможных комбинаций (а их 256), это массив который хранит данные о том, с какой стороны у вашего тайла-картинки - есть стена. допусти левый верхний тайл из вашего изображения должен лежать в ячейке arr["0011"]

И получается у меня будет ассоциативный массив с 256 ячейками, каждая из которых сответствует какой-то комбнации?
А как мне понять, что, допустим надо в arr["1111"] положить именно FieldTileMM.png, самому предварительно рассмотрев все случаи "на глаз"?

Цитата:

Сообщение от Akopalipsis (Сообщение 1157020)
Тут вот про генерацию пазла и внизу пример, может Вам пригодится.

спасибо, хоть и не совсем то, но тоже очень интересно. Возможно поможет.

Isfet 11.01.2014 15:29

массив будет с вашим количеством тайлом, то есть 12, и класть их туда нужно относительно стен в рисунке тайла

Akopalipsis 11.01.2014 15:29

Цитата:

И получается у меня будет ассоциативный массив с 256 ячейками
Почему вас смущает массив с 256 элементами, но не смущает 256 картинки?
Или Вы как то насчитали, что у Вас элементов будет больше чем картинок??

udaaff 11.01.2014 15:39

Решал похожую задачу, только строил границу отдельно от тайлов, как в этом приложении https://apps.facebook.com/farmheroes. Не совсем то, что тебе надо, но если сгодится опишу как построить. По твоей задаче, я бы разбил каждый из тайлов на четыре участка. Получилось бы всего три разных типа: две линии и уголок. Тип каждого участка зависел бы от наличия соседних с этим участком тайлов. У меня по моей задаче это выглядит как-то так:
Код AS3:

 
                /**
                * @param data Array of Boolean - массив показывающий наличие клеток по сторонам
                *                        0  1  2
                *                        7  X  3
                *                        6  5  4
                */

                public function setBorder(a:Array):void
                {
                        this.setGrid(this._gridTL, a[7], a[0], a[1]); // grid - это мувик с вариантами границы
                        this.setGrid(this._gridTR, a[1], a[2], a[3]); // можно использовать один для всех четырех участков,
                        this.setGrid(this._gridBR, a[3], a[4], a[5]); // повернутый под нужным углом
                        this.setGrid(this._gridBL, a[5], a[6], a[7]);
                }
 
                private function setGrid(grid:MovieClip, a:Boolean, b:Boolean, c:Boolean):void
                {
                        if (a && c)
                                grid.gotoAndStop(1);
                        else if (a)
                                grid.gotoAndStop(2);
                        else if (c)
                                grid.gotoAndStop(4);
                        else if (b)
                                grid.gotoAndStop(3);
                        else
                                grid.gotoAndStop("empty");       
                }


Wolsh 11.01.2014 16:27

Почему не сделать просто восьми(четырех?)мерный массив со ссылками на тайлы? То есть не непонятный какой то arr["1010"] а arr[1][0][1][0]. И никаких if'ов.
А, понял в чем проблема.
Вам же мало знать, что вверху 1. Вам надо знать, какого типа там тайл. Это вообще ТАК не решается.

Furinax 11.01.2014 22:05

Цитата:

Сообщение от udaaff (Сообщение 1157024)
Решал похожую задачу, только строил границу отдельно от тайлов, как в этом приложении https://apps.facebook.com/farmheroes.

Да, нужно именно как там. Там по сути, то же самое что и у меня, только тайлы выглядят по-другому.

silin 11.01.2014 22:23

я бы собирал эти тайлы 'на лету' из 9ти элементов
навскидку попробовал упрощенный вариант,
на самом деле все будет сложнее из-за линий каймы, но всяко проще, чем собирать из готовых, да и многовато их нужно, имхо 256(2^8), ну может за вычетом каких-то нереальных, но никак не 12 же
Код 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();
 
                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(1, 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);
 
 
                        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);
                                        }
                                }
                        }
                }
 
                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);
                        drawSegm(bmd, 1, 0, t);
                        drawSegm(bmd, 2, 0, r || t);
                        drawSegm(bmd, 0, 1, l);
                        drawSegm(bmd, 1, 1, false);
                        drawSegm(bmd, 2, 1, r);
                        drawSegm(bmd, 0, 2, l || b);
                        drawSegm(bmd, 1, 2, b);
                        drawSegm(bmd, 2, 2, b || r);
 
 
                        return new Bitmap(bmd);
 
 
                }
 
                private function drawSegm(bmd:BitmapData, i:int, j:int, corner:Boolean):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);
                }
 
        }
 
}



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

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