Форум 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=143552)

dlinnii 19.08.2010 11:34

Закрасить объекты, протащив по ним курсор
 
Вложений: 2
Задача: есть много мувиклипов разной формы, все проименованы от q1 ... q500. По клику они должны закрашиваться в определенный цвет. Чтобы было удобнее, можно зажать конпку мыши протащить курсор по нужным объектам.

Исходник и swf в аттаче.

Я сделал это, но нельзя закрасить все сразу, только по 10 за раз. Жмем пробел, счетчик увеличивается на 10, и мы можем закрасить еще 10 штук. Это ограничение я поставить не могу. Функция работает через onMouseDown, проверяет на hitTest, поэтому декремент срабатывает даже когда я двигаю мышь в пределах одного и того же мувиклипа, и все "заряды" с легкостью уходят на один мувик. Есть идеи как это исправить?



Код AS1/AS2:

numOfSq = 10;
function fillColor()
{
        for (i = 1; i < 87; i++)
        {
                if (_root['q' + i].hitTest(_root._xmouse, _root._ymouse, true) && numOfSq != 0)
                {
                        _root['c' + i].setRGB(color);
                        //numOfSq--;
                }
        }
}
// Вешаем цвета на кнопки
keyer = new Object();
keyer.onKeyDown = function()
{
        if (Key.getAscii() == ord('q'))
        {
                color = 0xff0000;
        }
        if (Key.getAscii() == ord('w'))
        {
                color = 0x00ff00;
        }
        if (Key.getAscii() == ord('e'))
        {
                color = 0x0000ff;
        }
        if (Key.getCode() == Key.SPACE)
        {
                numOfSq+=10;
        }
};
Key.addListener(keyer);
// Создаем переменные вида c_1, c_2... для объектов q_1, q_2...
for (i = 0; i < 87; i++)
{
        this['c' + i] = new Color(this['q' + i]);
}
// Запускаем нашу функцию по клику мышью
onMouseDown = function ()
{
        fillColor();
        onMouseMove = function ()
        {
                fillColor();
        };
};
//Убираем закрашивание, если кнопка мыши отпущена
onMouseUp = function ()
{
        delete onMouseMove;
};


S.Petrov 19.08.2010 16:27

Думаю можно по нажатию на кнопку мыши вызвать setInterval и потом проверять к примеру каждые 100 миллисекунд находится ли курсор над клипом и закрашивать этот клип. По отпусканию кнопки - clearInterval. Не уверен, что это лучшее решение, но можно попробовать.

dlinnii 19.08.2010 22:52

Я не мог определить с каким именно объектом хиттестит мышка, потому что вешаю функцию через цикл сразу на много объектов (с классами толком работать не умею).

Сейчас придумал ввести новую переменную, которая содержит текущий объект, который легко найти по i внутри hitTest - там уже нужный мне, а не 1-86, т.к. хиттестится с одним объектом одновременно. Вот измененная функция, если кому то потребуется похожая:
Код AS1/AS2:

function fillColor() {
        for (i=1; i<87; i++) {
                if (this['q'+i].hitTest(_root._xmouse, _root._ymouse, true) && numOfSq != 0) {
                        _root['c'+i].setRGB(color);
                        if ('q'+i != temp) {
                                numOfSq--;
                        }
                        trace (numOfSq);
                        temp = 'q'+i;
                }
        }
}


shaman4d 20.08.2010 01:35

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


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

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