PDA

Просмотр полной версии : разные данные из xml в одно динамическое поле


Ylik
15.04.2011, 00:13
Здравствуйте всем! Ещё раз обращаюсь сюда за помощью!
Опять никак не могу найти и понять, как решить свою проблему... :(

Мне нужно, чтобы при наведении на разные мувиклипы в одно единственное динамическое текстовое поле выводилась разная информация из xml-файла (типа всплывающей подсказки).
Два мувиклипа: mcA и mcВ. И еще мувиклип с самим текстовым полем - mсTxt.
Наводим на mcA, и в поле выводится "НадписьА". Наводим на mcВ, и в поле выводится "НадписьВ".
Ничего не получается... Помогите, пожалуйста, разобраться... :(

public class Primer extends MovieClip {
public function Primer() {

mсTxt.visible=false; //мувиклип с текстом
mcA.addEventListener(MouseEvent.MOUSE_OVER,over);
mcA.addEventListener(MouseEvent.MOUSE_OUT,out);
mcB.addEventListener(MouseEvent.MOUSE_OVER,over);
mcB.addEventListener(MouseEvent.MOUSE_OUT,out);
function over(e:MouseEvent) {
mсTxt.visible=true;
}
function out(e:MouseEvent) {
mсTxt.visible=false;
}

var xmlPath:String="primerXML.xml";
var loader = new URLLoader();
loader.load(new URLRequest(xmlPath));
loader.addEventListener(Event.COMPLETE, xmlLoaded);
}
private function xmlLoaded(event:Event):void {
var xml = new XML(event.target.data);
if (mcA.rollOver) {
mсTxt.txt1.text = xml.*.text()[1]; //txt1 - это имя текстового поля в мувиклипе mсTxt
}
if (mcB.rollOver) {
mсTxt.txt1.text = xml.*.text()[2];
}
}
}

Не пойму, как правильно сделать условие if (mcA.rollOver)...

tsarapkabel
15.04.2011, 00:41
Убери rollOver :)
В функции over надо проверять условие. Если e.target = mcA, то показать текст A. Если e.target = mcB, то показать текст B.

Ylik
15.04.2011, 00:42
Тааак... сейчас попробую разобраться... Спасибо большое за подсказку!

Добавлено через 8 минут
Что-то я запуталась...

function over(e:MouseEvent) {
mсTxt.visible=true;
if (e.target = mcA) {
mсTxt.txt1.text = xml.*.text()[1];
}
if (e.target = mcB) {
mсTxt.txt1.text = xml.*.text()[2];
}
}

private function xmlLoaded(event:Event):void {
var xml = new XML(event.target.data);
mсTxt.txt1.text = xml.*.text()[1];
}

Так как-то что-ли? :(

Wolsh
15.04.2011, 00:52
Не надо объявлять функции в конструкторе, это очень плохо. Вынесите хендлеры (обработчики) over и out наружу из конструктора в тело Класса, объявите как private function. Не бойтесь, они будут видны всем остальным членам Класса. Запомните на будущее - засовывать функцию внутрь другой функции – нехорошо!))

tsarapkabel
15.04.2011, 00:57
1 засунь XML данные в переменную.
2 проверяй на over, только
== //равенство
= //присвоение

Ylik
15.04.2011, 00:58
Ох... много советов сразу, сейчас попробую понять... :)
Спасибо, что помогаете! :)

Добавлено через 6 минут
А как сделать "засунь XML данные в переменную"?
Помогите, пожалуйста, пока не доходит... :(

Ylik
15.04.2011, 01:15
Сейчас, ещё раз проверю...

tsarapkabel
15.04.2011, 01:18
Это я глупость сказал. XML уже в переменной
var xml = new XML(event.target.data);
В чём теперь проблема, так работает?
if (e.target.name == mcA) {
mсTxt.txt1.text = xml.*.text()[1];
}
else if (e.target.name == mcB) {
mсTxt.txt1.text = xml.*.text()[2];
}

Ylik
15.04.2011, 01:27
Что-то не пойму ничего...
1120: Access of undefined property xml

Добавлено через 6 минут
Пока не работает... :(

tsarapkabel
15.04.2011, 01:41
Потому что переменная xml объявлена только в функции xmlLoaded.

Надо создать глобальную переменную
package {

import ...

public class Main extends MovieClip {

private var xmlVar:XML = new XML();

public function Main() {}
}
}
И уже потом var не писать, а сразуxml = new XML(event.target.data);

Ylik
15.04.2011, 01:42
Сейчас попробую...

Добавлено через 5 минут
Ошибок вроде не выдаёт, но изменений в текстовом поле тоже нет при наведении на разные мувиклипы.

tsarapkabel
15.04.2011, 01:56
Исходник в студию.

Ylik
15.04.2011, 01:58
Вот тут

tsarapkabel
15.04.2011, 02:27
package pr {

import flash.display.*;
import flash.events.*;
import flash.net.*;

public class Primer extends MovieClip {

private var xml:XML = new XML();

public function Primer() {

mсTxt.visible = false;
mcA.addEventListener(MouseEvent.MOUSE_OVER, over);
mcA.addEventListener(MouseEvent.MOUSE_OUT, out);
mcB.addEventListener(MouseEvent.MOUSE_OVER, over);
mcB.addEventListener(MouseEvent.MOUSE_OUT, out);

var xmlPath:String = "primerXML.xml";
var loader = new URLLoader();
loader.load(new URLRequest(xmlPath));
loader.addEventListener(Event.COMPLETE, xmlLoaded);
}


private function xmlLoaded(event:Event):void {
xml = new XML(event.target.data);
}

private function over(e:MouseEvent):void {
mсTxt.visible = true;

if (e.target.name == "mcA") {
mсTxt.txt1.text = xml.*.text()[0];
} else if (e.target.name == "mcB") {
mсTxt.txt1.text = xml.*.text()[1];
}
}

private function out(e:MouseEvent) {
mсTxt.visible = false;
}
}
}

Ylik
15.04.2011, 02:33
О!!! Вы - гений!!! Теперь работает!!! СПА-СИ-БО!!!
Как бы я без вас... :yahoo:

КорДум
15.04.2011, 08:39
tsarapkabel, хотелось бы узнать: а что было-то?

Ylik
15.04.2011, 08:42
А можно ещё поинтересоваться?
Если из мувиклипов сделать массив, как писать вот тут, вместо имени мувиклипа?
if (e.target.name == "oneArray[0]") { //?
mсTxt.txt1.text = xml.*.text()[1];
}

В общем выходит ошибка #1069: Не удалось найти свойство mcA в pr.Primer; отсутствует значение по умолчанию.

tsarapkabel
15.04.2011, 12:51
...а что было-то?Было сравнение:e.target.name == mcAТо есть строка сравнивалась с объектом, условие не выполнялось.


...как писать вот тут...Полагаю, что:(e.target.name == oneArray[0].name).

Ylik
15.04.2011, 23:37
Здравствуйте ещё раз. Спасибо, что помогаете!
Но пока что-то опять не работает...
Может где в другом ошибка... :(
public class Primer extends MovieClip {
private var oneArray:Array = new Array("mcA", "mcB", "mcC");
const number:uint = oneArray.length;

public function Primer() {

for (var i:uint = 0; i <number; i++) {
this[oneArray[i]].addEventListener(MouseEvent.MOUSE_OVER,over);
}
}
private function over(e:MouseEvent) {
if (e.target.name == oneArray[0].name) {
mсTxt.txt1.text = xml.*.text()[1];
}
if (e.target.name == oneArray[1].name) {
mсTxt.txt1.text = xml.*.text()[2];
}
if (e.target.name == oneArray[2].name) {
mсTxt.txt1.text = xml.*.text()[0];
}
}
}

#1069: Не удалось найти свойство mcA в pr.Primer; отсутствует значение по умолчанию. :(

Wolsh
16.04.2011, 03:25
1. if (e.target.name == oneArray[0].name)
oneArray[0] это уже строка, у нее нет свойства name. Вобщем, это уже и есть name. Ваш массив хранит имена, а не ссылки на клипы.
2. Почему this[oneArray[i]] не находит mcA, mcB и mcC - я не знаю. А на чем мы там остановились в начале - класс видел клип, если написать просто mcA, или надо было искать его по имени как getChildByName("mcA") ?

Ylik
16.04.2011, 03:28
Не, если массив не использовать, то всё прекрасно работает (без getChildByName("mcA")).
Или не поняла. В общем, если написать "mcA", то работет.

Wolsh
16.04.2011, 03:44
То есть, если написать
public function Primer() {

this["mcA"].addEventListener(MouseEvent.MOUSE_OVER,over);
this.mcB.addEventListener(MouseEvent.MOUSE_OVER,over);
mcC.addEventListener(MouseEvent.MOUSE_OVER,over);
} то ошибки не будет?

Ylik
16.04.2011, 03:46
Сейчас попробую и скажу :)
Вот третий вариант - точно работает. Вернее mc.mcC

Добавлено через 7 минут
Работает только такой вариант:
mc.mcA.addEventListener(MouseEvent.MOUSE_OVER,over);

if (e.target.name == "mcA")

Wolsh
16.04.2011, 04:13
Ну замечательно)) Стало быть
public class Primer extends MovieClip {
private var oneArray:Array = new Array("mcA", "mcB", "mcC");
const number:uint = oneArray.length;

public function Primer() {

for (var i:uint = 0; i <number; i++) {
mc[oneArray[i]].addEventListener(MouseEvent.MOUSE_OVER,over);
}
}
private function over(e:MouseEvent) {
if (e.target.name == oneArray[0]) {
mсTxt.txt1.text = xml.*.text()[1];
}
if (e.target.name == oneArray[1]) {
mсTxt.txt1.text = xml.*.text()[2];
}
if (e.target.name == oneArray[2]) {
mсTxt.txt1.text = xml.*.text()[0];
}
}
}

Ylik
16.04.2011, 04:15
Сейчас попробую. :)

Добавлено через 2 минуты
О! Походу работаееет!!! :)
Какие же вы молодцы!!! Большооое вам спасибо!!! :)

P.S. Можно ещё один маленький вопросик? Почему swf может не работать правильно в браузере?

Wolsh
16.04.2011, 04:29
У нас тут действует правило - одна тема = один вопрос. Это для удобства всех. Соблюдайте пожалуйста. Тем более что Ваш вопрос совсем не маленький. Если коротко - политики безопасности флэш-плеера и интернет-браузера. Не имеющие смысла, когда Вы тестируете собственный проект в среде разработки и можете "навредить" только сами себе.

Ylik
16.04.2011, 04:31
Хорошо. Спасибо большущее за помощь!!! Я вам ОЧЕНЬ БЛАГОДАРНА!!! :yahoo: