|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
|
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
вот решение без запихивания в массив, но можно и в массив положить
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; } } } } Итого получаем 16 тайлов, и соответственно если класть в массив будет 16 элементов, а не 256 как вы многократно твердили Последний раз редактировалось Isfet; 12.01.2014 в 09:45. |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Ребят, всем большое спасибо за помощь, очень интересные решения.
silin, udaff, это реально гениально, вместо того, чтобы увеличивать количество тайлов - наоборот уменьшить да еще и затайлить их самих, никогда бы не догадался), по настоящему изящные решения. Isfet, извиняюсь и признаю, что был не прав. Мне почему-то проблематично визуально представить все возможные виды тайлов. Могли бы вы, пожалуйста, поделиться картинкой со всеми видами тайлов? Я собираюсь использовать решение silin`а, дописав обводку. Но все равно очень интересно как у вас сделано. |
|
|||||
Isfet, дада не 256, сори
256 это всего возможных, а их в таком раскладе просто нет и твое решение может и поудобнее будет но если придется, например, еще 'внутренние' скругления (в дырках) учесть, то вариантов прибавится.. хотел по-простому вариант с бордюром нарисовать, но по-простому не выходит - надо еще и диагональные клетки анализировать 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); } } } |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
вот виды тайлов на вашем примере
название тайла отображает наличие стен в нем, в порядке, как в margin в html (top/right/bottom/left). вообще это решение - по конкретную задачу, если нужны внутренние скругления и универсальность, тогда уже конечно нужно каждый тайл конструировать программно. |
Часовой пояс GMT +4, время: 11:19. |
|
« Предыдущая тема | Следующая тема » |
|
|