Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Подгузка/выгрузка видимы/не видимых частей клипа (http://www.flasher.ru/forum/showthread.php?t=99499)

ARTur2 07.08.2007 15:35

Подгузка/выгрузка видимы/не видимых частей клипа
 
Может кто-нибудь знает, как можно реализовать следущее. Есть основной клип. Размерами допустим 1000 на 1000. И есть окошко (маска) размером 300 на 300. Как сделать так, чтобы после драга та часть основного клипа, которая попадает в зону вне маски выгружалась, а та которая видима подгружалась? Реально ли вообще такое реализовать?

etc 07.08.2007 15:38

Реально. Что именно не получается? Определить, какие объекты вышли за пределы сцены?

ARTur2 07.08.2007 15:46

Честно говоря вообще не могу придумать алгоритм этой самой проверки. Изначально я делал вот как. Брал тот самый основной клип, резал его на 100 мелких. И хотел проверять попадает ли конкретный мелкий клип под маску, если нет, то выгружать его...
Но есть два "НО"!
Первое, то что я придумал по коду(именно с проверкой попадания. нарезка получилась) почему-то не прокатывало и второе - мне кажеться, что это будет слишком напряжно для процессора проверять "попадание" каждого клипика в эту самую зону + если у них очень большая детализация...
Поэтому, если не трудно дайте, пожалуйста, примерный алгоритм, как это можно сделать с "цельным" клипом
З.Ы. Почему-то не могу исходник прикрепить...

etc 07.08.2007 15:52

С каким цельным клипом? Все куски должны быть отдельно.

ARTur2 07.08.2007 15:57

Тогда я Вам покажу код "нарезки"
Код:

//Порезка основного клипа
MovieClip.prototype.divide = function(nx, ny, link_id) {
        var x = this.getBounds(this).xMin, y = this.getBounds(this).yMin;
        // положение относительно точки регистрации
        var wi = this._width/nx, hi = this._height/ny;
        // размер фрагментов
        var x0 = this._x, y0 = this._y;
        var clip = this._parent.createEmptyMovieClip(this._name, this.getDepth());
        // подменяем пустым, в котором все и создаем ..
        with (clip) {
                _x=x0, _y=y0;
        }
        this.length = nx*ny;
        for (var i = this.length; i--; ) {
                var c = container.clip.createEmptyMovieClip(i, i);
                // создаем nx*ny пустых контейнеров
                var b = c.attachMovie(link_id, 'b', this.getNextHighestDepth(), {_x:-x-(0.5+i%nx)*wi, _y:-y-(0.5+Math.floor(i/nx))*hi});
                // аттачим (со сдвигом) в каждый каритнку
                with (c) {
                        _x=x+(0.5+i%nx)*wi, _y=y+(0.5+Math.floor(i/nx))*hi;
                }
                // сдвигаем сам контейнер в другую сторону
                var m = c.createEmptyMovieClip('m', 1);
                // рисуем маску
                with (m) {
                        beginFill(0), lineTo(wi, 0), lineTo(wi, hi), lineTo(0, hi), lineTo(0, 0), endFill();
                        _x=-wi/2, _y=-hi/2;
                }
                b.setMask(m);
        }
};
//Создание маски
var mask = this.createEmptyMovieClip("mask", this.getNextHighestDepth());
//Создаём основную маску
mask._x = 100;
mask._y = 100;
with (mask) {
        beginFill(0x00FF00), lineTo(0, 300), lineTo(300, 300), lineTo(300, 0), endFill();
}
var container = this.createEmptyMovieClip("container", this.getNextHighestDepth());
//Создаём контейнер и туда загружаем основной клип, на который вешается основная маска
container.createEmptyMovieClip("container", this.getNextHighestDepth());
container.attachMovie("clip", "clip", this.getNextHighestDepth());
container.setMask(mask);
container.clip.divide(10, 10, 'clip');

он работает отлично!
а вот как я проверял видимость/не видимость после перетаскивания:
Код:

container.clip.onPress = startDrag;
container.clip.onRelease = container.clip.onReleaseOutside=stopDrag;
//
container.clip.startDrag = function() {
        for (var i = container.clip.length; i--; ) {
                if (mask.hitTest(container.clip[i])) {
                        container.clip[i]._visible = true;
                } else {
                        container.clip[i]._visible = false;
                }
        }
};

она и не срабатывает...

silin 07.08.2007 16:48

я, правда, так и не понял чего ты добиваешься вообще и переопределением startDrag в частности..
глянь такой код, может чего прояснится:
Код:

function checkMask(){
        for (var i = container.clip.length,s="out: "; i--; ) {
                var hit=mask.hitTest(container.clip[i].m);//смотрим хиттест маски куска с маской контейнера
                if(!hit)s+=i+", ";
        }
        trace(s);
}
container.clip.onPress = function(){
        this.startDrag();
        this.onEnterFrame=checkMask;
}
container.clip.onRelease = container.clip.onReleaseOutside=function(){
        stopDrag();
        this.onEnterFrame=null;
}


screamge 07.08.2007 16:54

Если речь идёт о нарезки цельного клипа, т.е. клипу 1000 на 1000 зделать crop до 300 на 300, то это не возможно, за исключением отрисовки нужного фрагмента в BitmapData и удаления оригинального клипа.

Kikasso 07.08.2007 17:04

Цитата:

Сообщение от screamge
Если речь идёт о нарезки цельного клипа, т.е. клипу 1000 на 1000 зделать crop до 300 на 300, то это не возможно, за исключением отрисовки нужного фрагмента в BitmapData и удаления оригинального клипа.

Ну есть такое свойство, scrollRect

screamge 07.08.2007 17:10

Насколько я понял речь идёт об удалении всего того что не попадает под маску, при условии что под маской один большой клип. Если это так, как я понял, то я не понял как scrollRect может этому помочь. :)

ARTur2 08.08.2007 13:13

Цитата:

Сообщение от screamge
Насколько я понял речь идёт об удалении всего того что не попадает под маску, при условии что под маской один большой клип

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

2 silin: код я Ваш посмотрел. Он правильно определяет те самые "куски", которые не попадают под основную маску. Но возник сейчас ещё один вопрос. Если эти куски выгрузить, то как можно будет их загрузить назад. Не "потеряются" ли они после выгрузки?


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

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