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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.01.2011, 20:25
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 1  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Post Заполнение прямоугольной области квадратными обьектами по диагонали.

Добрый вечер, коллеги. Есть к вам один вопрос.

Представьте, что у меня есть рабочее поле 1280x720. Мне надо заполнить его квадратами 50x50 пикселей по диагонали от сверху-слева до снизу справа так, чтобы между квадратами была граница в 1 пиксель.

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

Вот мой код:
Код AS1/AS2:
var i:Number = 0;
var j:Number = 0;
//
var coefX:Number = 51;// смещение по оси X
var coefY:Number = 51;// смещение по оси Y
var rowCoef:Number = 1;// число пикселей-квадратов по диагонали
var x0:Number = 0;// начальная координата Х
var y0:Number = 0;// начальная координата Y
var maxX:Number = 0;// максимальная координата по оси Х
var maxY:Number = 0;// максимальная координата по оси Y
var cordXArr:Array = Array();// массив с координатами Х
var cordYArr:Array = Array();// массив с координатами Y
//
function randColor()
{
	if (random(2) == 0)
	{
		randomCol = 0x19398A;
	}
	else
	{
		randomCol = 0x005DAA;
	}
	return randomCol;
}
//
function newRect(coordX, coordY)
{
	d = createEmptyMovieClip("z" + j, this.getNextHighestDepth());
	d.beginFill(randColor(),100);
	d.moveTo(0,0);
	d.lineTo(50,0);
	d.lineTo(50,50);
	d.lineTo(0,50);
	d.lineTo(0,0);
	d.endFill();
	d._x = coordX;
	d._y = coordY;
	j++;
}
while (cordXArr.length < 390)
{
	if (maxX < 1300)
	{
		maxX = x0 + coefX * (rowCoef - 1);
	}
	else
	{
		maxX = 1300;
	}
	if (maxY < 750)
	{
		maxY = y0 + coefY * (rowCoef - 1);
		maxY0 = 0;
	}
	else
	{
		maxY = 750;
		maxY0 += coefY;
	}
	while (maxX >= 0)
	{
		cordXArr.push(maxX);
		maxX -= coefX;
	}
	while (maxY0 <= maxY)
	{
		cordYArr.push(maxY0);
		maxY0 += coefY;
	}
	rowCoef++;
}
//
this.onEnterFrame = function()
{
	if (i < cordXArr.length)
	{
		newRect(cordXArr[i],cordYArr[i]);
		i++;
	}
	else
	{
		delete this.onEnterFrame;
	}
};
Благодаря этому скрипту я заполняю поле только наполовину, дальше все идет плохо. Я понимаю почему это происходит, но не могу сам грамотно расставить ограничения на то, чтобы правильно все работало.

Буду благодарен любым советам.

Старый 30.01.2011, 22:18
RandomUser вне форума Посмотреть профиль Отправить личное сообщение для RandomUser Найти все сообщения от RandomUser
  № 2  
Ответить с цитированием
RandomUser

Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
Как-то так:
Код AS1/AS2:
var i:Number = 0;
//
var stepX:Number = 51;// смещение по оси X
var stepY:Number = 51;// смещение по оси Y
var lastTopX: Number = 0;
var lastTopY: Number = 0;
var cordXArr:Array = Array();// массив с координатами Х
var cordYArr:Array = Array();// массив с координатами Y
//
function randColor()
{
	if (random(2) == 0)
	{
		randomCol = 0x19398A;
	}
	else
	{
		randomCol = 0x005DAA;
	}
	return randomCol;
}
//
function newRect(coordX, coordY)
{
	d = createEmptyMovieClip("z" + j, this.getNextHighestDepth());
	d.beginFill(randColor(),100);
	d.moveTo(0,0);
	d.lineTo(50,0);
	d.lineTo(50,50);
	d.lineTo(0,50);
	d.lineTo(0,0);
	d.endFill();
	d._x = coordX;
	d._y = coordY;
	j++;
}
 
cordXArr.push(0);
cordYArr.push(0);
 
while (cordXArr.length < 390)
{
	calcNextCoords();
}
 
function calcNextCoords()
{
	var cx = cordXArr[cordXArr.length - 1];
	var cy = cordYArr[cordYArr.length - 1];
	var nx = cx - stepX;
	var ny = cy + stepY;
 
	if (nx >= 0 && ny < 720)
	{
		cordXArr.push(nx);
		cordYArr.push(ny);
		return;
	}
 
	nx = lastTopX + stepX;
	ny = lastTopY;
 
	if (nx > 1280)
	{
		nx = lastTopX;
		ny += stepY;
	}
 
	lastTopX = nx;
	lastTopY = ny;
 
	cordXArr.push(nx);
	cordYArr.push(ny);
}
//
this.onEnterFrame = function()
{
	if (i < cordXArr.length)
	{
		newRect(cordXArr[i],cordYArr[i]);
		i++;
	}
	else
	{
		delete this.onEnterFrame;
	}
};
__________________
Не всех война убила - многих покалечила

Старый 30.01.2011, 22:22
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 3  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Вот блин, нет слов, чтобы высказать благодарность. Спасиб - сам уже бьюсь 3-й час над этой задачей ))))

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

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

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


 


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


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