Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.01.2014, 03:10
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 21  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Держи пример.
forum.swf   (1.8 Кб)
Вложения
Тип файла: zip forum.zip (9.1 Кб, 5 просмотров)
Тип файла: swf forum.swf (1.8 Кб, 54 просмотров)

Старый 12.01.2014, 09:15
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 22  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
вот решение без запихивания в массив, но можно и в массив положить

Код 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;
			}
		}
 
	}
}
Название: res.jpg
Просмотров: 193

Размер: 24.3 Кб

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


Последний раз редактировалось Isfet; 12.01.2014 в 09:45.
Старый 12.01.2014, 15:30
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 23  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Ребят, всем большое спасибо за помощь, очень интересные решения.

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

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

Старый 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);
 
 
		}
 
	}
 
}

Старый 12.01.2014, 19:48
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 25  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
вот виды тайлов на вашем примере

Название: res.jpg
Просмотров: 192

Размер: 57.7 Кб

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 11:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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