PDA

Просмотр полной версии : не работают функции прописанные внутри цикла


Andy_go
19.04.2012, 19:32
Вот такой код:

function onComplete(event:Event):void {
var recivedData = loader.data;
var recivedDataArray:Array = JSON.decode(recivedData);

//вычисляем длинну полученного массива
var handLength = recivedDataArray.length;
//создаен переменные для использования внутри цикла
var xCHCoor = 100;
var yCHCoor = 600;
var xCHOutlineCoor = 98;
var yCHOutlineCoor = 598;
var parametr = 0;
//создаем массивы для того чтобы использовать их в цикеле для сериализации переменных
var cardInHand:Array=[];
var сardInHandOutline:Array=[];
for(var iOne: int = 0; iOne < handLength; iOne++){

//переводим текст полученный с сервера в название класса объекта
var cardInHandClass:Class = getDefinitionByName(recivedDataArray[iOne]) as Class;

//отображаем "карты на руках"
cardInHand[iOne] = new cardInHandClass();
cardInHand[iOne].x = xCHCoor;
cardInHand[iOne].y = yCHCoor;
addChild(cardInHand[iOne]);
xCHCoor = xCHCoor + 80;

//добавляем картинки "подсветки" карт
сardInHandOutline[iOne] = new outlineForCardsInHandGreen();
сardInHandOutline[iOne].x = xCHOutlineCoor;
сardInHandOutline[iOne].y = yCHOutlineCoor;
addChild(сardInHandOutline[iOne]);
xCHOutlineCoor = xCHOutlineCoor +80;
сardInHandOutline[iOne].visible = false;

//активируем подсветку при наведении
cardInHand[iOne].addEventListener(MouseEvent.MOUSE_OVER, function (e:MouseEvent):void{
сardInHandOutline[iOne].visible = true;
});
cardInHand[iOne].addEventListener(MouseEvent.MOUSE_OUT, function (e:MouseEvent):void{
сardInHandOutline[iOne].visible = false;
});
}
}


Все отображается как должно, НО при наведении курсора на любой из объектов серии cardInHand[iOne], вместо выполнения приписанной ему функции выскакивает ошибка: TypeError: Error #1010: Термин не определен и не имеет свойств. at MethodInfo-235()

Где ошибка?
Что я не так написал?

54321go
19.04.2012, 19:41
Сделайте лучше отдельной функцией. а в ней вместо сardInHandOutline[iOne].visible = true; сделаейтеe.currentTarget.visible = true;

Andy_go
19.04.2012, 19:50
Там по задумке появляется и исчезает рамочка вокруг основного объекта, а то что вы предложили приводит к исчезновению самого объекта:)

bublic_bicubic
19.04.2012, 19:58
особенности областей видимости.
Функции работают, но во время выполнения iOne = handLength, то есть сardInHandOutline[iOne] = undefined
Всю эту конструкцию можно обернуть в вызов функции (Javascript-way):
//активируем подсветку при наведении
( function ( card:InteractiveObject, outline:DisplayObject ):void {
card.addEventListener( MouseEvent.MOUSE_OVER, function ( e:MouseEvent ):void {
outline.visible = true;
} );
card.addEventListener( MouseEvent.MOUSE_OUT, function ( e:MouseEvent ):void {
outline.visible = false;
} );
} )( cardInHand[ iOne ], сardInHandOutline[ iOne ] );
Но я бы рекомендовал написать отдельный класс для карты:
class CardInHand extends Sprite {
private var body:InteractiveObject;
private var outline:DisplayObject;
public function CardInHand( bodyClass:Class, outlineClass:Class ) {
body = new bodyClass();
outline = new outlineClass();
addChild( body );
addChild( outline );
outline.visible = false;
addEventListener( MouseEvent.ROLL_OVER, onRollOver );
addEventListener( MouseEvent.ROLL_OUT, onRollOut );
}
private function onRollOver( e:MouseEvent ):void {
outline.visible = true;
}
private function onRollOut( e:MouseEvent ):void {
outline.visible = false;
}
}

54321go
19.04.2012, 21:10
Ага не заметил можно передать в переменную сardInHand[iOne].clip=new MovieClip();
сardInHand[iOne].clip=сardInHandOutline
[iOne]
а потом вызывать
e.currentTarget.clip.visible = true;
как-то так

Andy_go
19.04.2012, 22:25
Спасибо за ответы.
54321go: ваш новый вариант выдает ошибку: 1120: Обращение несуществующего свойства сardInHand.

bublic_bicubic: этот вариант я сегодня уже не осилю(глаза в кучу под конец дня), завтра попробую и отпишу что получилось.

Добавлено через 19 часов 10 минут
bublic_bicubic: никак в толк не возьму как с классами, в том числе и с этим работать. Вот написал я его, а дальше с ним что делать? как его прикрутить к моему конкретному коду?
Не судите строго, я только начал разбираться в АS...