Форум 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)
-   -   Как узнать пустую ячейку. hitTest (http://www.flasher.ru/forum/showthread.php?t=122677)

nOobCrafter 16.03.2009 12:56

Как узнать пустую ячейку. hitTest
 
Вложений: 1
Доброго времени суток. Столкнулся с проблемой не подсильной моему мозгу %) Делаю тесты по английскому, упражнение — есть список слов и из них надо верно составить предложение. Для этого элементы-слова тягаем на определенные места. Если постали слово верно, то место красится в зеленый цвет, если неверно то в красный, если не поставили вобще то место остается серым (все проверяю хиттестом). С последним пунктом и есть проблемы.
Как корректно узнать те елементы на которых нет слов? Вот кусок кода из исходника:
Код AS1/AS2:

///////////////////------------------------------------- Именно эта функция ключевая
function check_btn()  // функция срабатывает по релизу кнопы
{
        for (var i = 0; i < this._parent.l; i++)                              // перебираем элементы-слова
        {
                var mov:MovieClip = this._parent["mov" + i];          // этот обьект мы тягаем (элемент-слово)
                var place_col:Color = new Color(this._parent["place" + i]);
                        place_col.setRGB(0xCCCCCC);                      // перед каждой проверкой цвет области сбрасываем на дефолтный "серый"
 
                for (var j = 0; j < this._parent.l; j++)                  // для каждого элемента-слова делаем проверку на то контачит ли он с какой либо "областью"
                {
                        var place:MovieClip = this._parent["place" + j];  // эти обьекты статичны и на них мы по идее должны навести обьекты "mov"
                        if (mov.hitTest(place))  // если есть контакт
                        {
                                var place_color:Color = new Color(place);
                                if (place.i == mov.i)  // и притом нужное слово навели на нужную область то все ок
                                {  // красим область в зеленый цвет
                                        place_color.setRGB(0x99CC00); // my_mc turns red #CCCCCC - grey, #99CC00 - green, #FF0000 - red
                                        trace("right")
                                        mov._parent.right++
                                        if (mov._parent.right == mov._parent.l) // все кол-во совпадений равно кол-ву элементов то вообще все верно
                                        {
                                                trace("All done")
                                        }
                                        //break;
                                } else {    // если есть наведение, но область не верная
                                        place_color.setRGB(0xFF0000);  // красим область в красный цвет
                                        trace("mistake")
                                        mov._parent.right = 0;
                                }
                        }
                }
        }
}

З.Ы. трейсы отрабатываются просто замечательно.
Вот исхоник и пример:

Волгоградец 16.03.2009 13:54

Ну вы все сделали. Т.е. в этой строке вы проверяете, было ли пересечение слова и места:
Код AS1/AS2:

if (mov.hitTest(place))

Соответственно после этого блока надо поставить условие else:
Код AS1/AS2:

else{
  place_col.setRGB(0xCCCCCC);
}

P.S.: класс Color - устаревший. Лучше юзать ColorTransform.

nOobCrafter 16.03.2009 14:55

неа не все так просто.. я так первый раз и написал, но в результате цвета вообще не меняются..(((

Волгоградец 16.03.2009 17:29

Вообще я бы сделал так:
Код AS1/AS2:

function check_btn(){
        for(var i:Number = 0; i < placesArray.length; i ++){
                for(var j:Number = 0; j < wordsArray.length; j ++){
                        if(placesArray[i].hitTest(wordsArray[j])){
                                placesArray[i].isNotEmpty = true;
                        }
                }
        }
 
        for(var i:Number = 0; i < placesArray.length; i ++){
                if(!placesArray[i].isNotEmpty){
                        trace(placesArray[i])
                }
        }
}

Здесь placesArray - массив мест
wordsArray - массив слов
Ну и проверки надо добавить на то - правильное слово или нет

nOobCrafter 16.03.2009 18:15

итого имеем + 3 "лишних" цикла и конструкция не шибко отличается от той что у меня есть(( Временно нашел выход, добавил к тому что уже написано еще 1 "лишний" цикл, где тупо все сбрасываю:
Код AS1/AS2:

function check_btn()  // функция срабатывает по релизу кнопы
{
        for (var i = 0; i < this._parent.l; i++)
                {
                        var place_col:Color = new Color(this._parent["place" + i]);
                                place_col.setRGB(0xCCCCCC);                      // перед каждой проверкой цвет области сбрасываем на дефолтный "серый"
                }
...........

причем на вид тоже самое что и в примере выше, но работает корректно..(( страно, что там косяки есть, а тут нет. Вообщем пока что вместо "изящных" извращений с условиями, имею вариант лома с доп. циклом. (против лома нет приема..) А хочется чего нить "культурного" (читай изящных извращений с условиями) или более адекватного решения нету??(
Волгоградец так же вариант плох тем что если я: поместил слово на область, нажал кнопу проверки - все ок, убрал слово с области и нажал на проверку - тот же результат, обнуления нигде не происходит.


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

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