Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   заполнение области квадратиками (http://www.flasher.ru/forum/showthread.php?t=73885)

ichor 06.01.2006 01:47

заполнение области квадратиками
 
Вложений: 1
Люди добрые, нужна ваша помощь! Подскажите как сделать так, чтобы определенная область флеша случайным образом заполнялась квадратиками, но с проверкой перекрытия(тобишь надо чтоб в одном месте мог находиться только один квадратик, не больше(см.рис). Дублирование реализовать мне удалось, но вот с проверкой проблемы. Я использовал сл. скрипт:
s++;
if(i !== p[i] && j !== p[i][j]){
box._x = 4*i;
box._y = 4*j;
_root.box.duplicateMovieClip(box[i+j],s);
i=Math.round(464*Math.random()/4);
j=Math.round(56*Math.random()/4);
}else{
do{
i=Math.round(464*Math.random()/4);
j=Math.round(56*Math.random()/4);}while(i == p[i] && j == p[i][j]);
}
Ошибку найти не могу. Явно не хватает опыта и знаний. Буду очень благодарен за помощь! Заранее спасибо!

mr.N 06.01.2006 02:51

Ну, ты бы хотя бы прокомментировал свой код, а то так непонятно.
И надо пользоваться специальным тэгом для кода, а то так он плохо читается.

valvika 06.01.2006 06:05

Спроси Sh@man'а. Он в прошлом году заполнял случайным образом картинками прямоугольную область.
Задача на самом деле не так проста, как видится при первом прочтении.

opoek 06.01.2006 10:53

Вложений: 1
Простое решение "в лоб".

Double 06.01.2006 12:20

Вложений: 1
я вот так вот это делаю...

silin 06.01.2006 13:26

как вариант: разбиваем область на прямоугольники (сколько там надо..), а в них уже в случайные координаты аттачим квадратики..

Код:

import flash.geom.*;
/*
where - в каком мувике создаем
from - lincage Id квадратика в библиотеке
nx,ny - на сколько делим по x и y
r - область которую запоняем
*/
function randFill(where:MovieClip,from:String,nx:Number,ny:Number,r:Rectangle){
        var mc=where.createEmptyMovieClip('fill',where.getNextHighestDepth())
        mc._x=r.x;
        mc._y=r.y;
        var tmp=mc.attachMovie(from,'tmp',0);
        var w=r.width/nx-tmp._width, h=r.height/ny-tmp._height;
        var d=0;
        for(var i=nx;i--;)        for(var j=ny;j--;) mc.attachMovie(from,d++,d,{_x:i*r.width/nx+w*Math.random(),_y:j*r.height/ny+h*Math.random()});
       
}
randFill(_root,'box',10,16,new Rectangle(120,80,200,200));


Double 06.01.2006 14:06

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

box._x = 4*i;
box._y = 4*j;

silin представил вариант последовательного заполнения всех ячеек со случайными координатами в пределах ячейки. opoek сделал случайное число квадратиков и случайные координаты :) я ж теперь спать не буду, чего автору-то надо было?!

ichor 08.01.2006 15:37

Вложений: 1
Цитата:

Сообщение от Double
я ж теперь спать не буду, чего автору-то надо было?!

:)По сути, надо было реализовать полное заполнение площади квадратиками (4х4) (поэтому и box._x = 4*i; таким образом я получал случайную ячейку) со случайными координатами. Буду очень Вам благодарен, если разъясните в чем проблема. Не получается подключить ваш скрипт. :confused:

Double 09.01.2006 20:28

ichor, необходимо удалить в Вашем файле слой с квадратиком и второй фрейм. Они не нужны. Добавление квадратиков происходит в функции Randomize. Параметром ей передаётся кол-во оставшихся свободных мест (это если вдруг захочется процент заполнения сделать = 10, то при вызове пишите Randomize(iPlaces*0.1)). Квадратик добавляется на каждом onEnterFrame (код выдран из другого проекта, поэтому сделал так. уменьшив фрейм-рейт ролика, можно уменьшить скорость добавления квадратов. это же просто пример), после полного заполнения, функция onEnterFrame удаляется.

MOHCTEP 10.01.2006 00:25

Код:

var mc=this.createEmptyMovieClip("blabla",0);
mc._x=25;
mc._y=50;
var size=10;//Square size
var area_width=500;
var area_height=300;
var arr:Array=[];
s = function (a, b) {
var r;
Math.floor (Math.random () * 2) == 0 ? r = 1 : r = -1;
return r;
};

var n=0;
for(var i=0;i<area_width/size*area_height/size;i++){
arr.push(i);
}
if(arr.sort(s)){
paint();
}

function square(){
var y=Math.floor(arr[n]/(area_width/size))*size;
var x=arr[n]%(area_width/size)*size;
mc.lineStyle(1,0x009090,100);
mc.beginFill(0xD00060,100);
mc.moveTo(x,y);
mc.lineTo(x+size,y);
mc.lineTo(x+size,y+size);
mc.lineTo(x,y+size);
mc.lineTo(x,y);
mc.endFill();
}
function paint(){
this.onEnterFrame=function(){
for(i=0;i<20;i++){
square();
n++;
if(n==arr.length){
delete this.onEnterFrame();
trace('End');
}
}
}
}



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

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