#flash #actionscript-3
#flash #actionscript-3
Вопрос:
Итак, у меня снова возникли проблемы с моим приложением Flash.
У меня есть список из нескольких видеороликов, которые являются «MiniInfos», содержащих некоторые подробности о некоторых «работах». Они добавляются на этап в цикле, и каждый раз мне нужно добавлять eventlistener (MouseEvent.CLICK), чтобы иметь возможность щелкнуть по нему, чтобы показать больше деталей. Проблема в том, что для того, чтобы узнать, какие детали должны появиться следующими, мне нужно получить доступ к текстовому полю, содержащему идентификатор, чтобы иметь возможность передать его следующему видеоролику (назовем его «BigInfo»).
Итак, я знаю, это звучит запутанно, но я попытаюсь подвести итог.
На сцену добавлено несколько миниинфо с текстовыми полями типа «ID: 1, ID: 2, ID: 3» и т.д.
Я хочу иметь возможность щелкнуть по одному, и на сцену будет добавлен другой видеоролик (BigInfo) с более подробной информацией о нем. Чтобы знать, какую информацию я должен получить на PHP, мне нужно знать идентификатор, из которого я нажал MiniInfo.
Моя идея (которая не сработала) была:
//on the cycle
MiniInfo.addEventListener(MouseEvent.CLICK, OpenWorkDetails);
//further down the code
public function OpenWorkDetails(e:MouseEvent):void
{
trace(MiniInfo.IDTrabalhoField.text);
//If I figure this number out, I will change it to addChild
}
Итак, я получаю ошибку 1120: доступ к неопределенному свойству MiniInfo.
Я понимаю, что этот код не совсем лучший, поэтому, если у вас, ребята, есть на примете другое решение, не стесняйтесь поделиться. Я все еще изучаю flash.
Спасибо.
Марко Фокс.
Ответ №1:
Я создал небольшое flash-приложение, чтобы продемонстрировать другой подход, который вы можете использовать:
FLASH
Main.as (класс документа):
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
[SWF(width="275", height="175")]
public class Main extends Sprite
{
private var _phpPath:String = "http://localhost/stackoverflow/minibiginfos/getBigInfo.php";
private var _bigInfo:BigInfo;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var xml:XML = <miniInfos>
<miniInfo id="1" text="Mini Info 1" />
<miniInfo id="2" text="Mini Info 2" />
<miniInfo id="3" text="Mini Info 3" />
</miniInfos>;
for (var i:uint = 0; i < xml.children().length(); i )
{
var miniInfo:MiniInfo = new MiniInfo(xml.miniInfo[i].@id,
xml.miniInfo[i].@text);
miniInfo.x = 25;
miniInfo.y = 25 ((miniInfo.height 25) * i);
addChild(miniInfo);
miniInfo.addEventListener(MouseEvent.CLICK, onMiniInfoClick);
}// end for
}// end function
private function onMiniInfoClick(e:MouseEvent):void
{
loadBigInfo(MiniInfo(e.currentTarget).id);
}// end function
private function loadBigInfo(id:int):void
{
if (!_bigInfo)
{
_bigInfo = new BigInfo();
_bigInfo.x = 150;
_bigInfo.y = 25;
addChild(_bigInfo);
}// end if
var urlVariables:URLVariables = new URLVariables();
urlVariables.miniInfoID = id;
var urlRequest:URLRequest = new URLRequest(_phpPath);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = urlVariables;
var urlLoader:URLLoader = new URLLoader(urlRequest);
urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);
urlLoader.load(urlRequest);
}// end function
private function onURLLoaderComplete(e:Event):void
{
var urlLoader:URLLoader = URLLoader(e.currentTarget);
var urlVariables:URLVariables = new URLVariables(urlLoader.data);
_bigInfo.text = urlVariables.text;
}// end function
}// end class
}// end package
import flash.display.Sprite;
import flash.text.TextField;
internal class MiniInfo extends Sprite
{
private var _id:int;
private var _text:String
private var _width:Number = 100;
private var _height:Number = 25;
override public function get width():Number { return _width }
override public function get height():Number { return _height }
public function get id():int { return _id }
public function get text():String { return _text }
public function MiniInfo(id:int, text:String):void
{
_id = id;
_text = text;
graphics.beginFill(0xE1E1E1);
graphics.drawRect(0, 0, _width, _height);
graphics.endFill();
var textField:TextField = new TextField();
textField.x = textField.y = 5;
textField.text = text;
textField.mouseEnabled = false;
addChild(textField);
}// end function
}// end class
internal class BigInfo extends Sprite
{
private var _width:Number = 100;
private var _height:Number = 125;
private var _textField:TextField;
public function get text():String { return _textField.text }
public function set text(text:String):void { _textField.text = text; }
public function BigInfo()
{
graphics.beginFill(0xE1E1E1);
graphics.drawRect(0, 0, _width, _height);
graphics.endFill();
_textField = new TextField();
_textField.width = 90;
_textField.wordWrap = true;
_textField.x = _textField.y = 5;
_textField.mouseEnabled = false;
addChild(_textField);
}// end function
}// end class
PHP
getBigInfo.php:
<?php
if(!empty($_POST))
{
$bigInfos = array
(
array
(
'miniInfoID' => 1,
'text' => "This is the big info for mini info 1"
),
array
(
'miniInfoID' => 2,
'text' => "This is the big info for mini info 2"
),
array
(
'miniInfoID' => 3,
'text' => "This is the big info for mini info 3"
)
);
$text;
for($i = 0; $i < sizeof($bigInfos); $i )
{
foreach($bigInfos as $item)
{
if($item['miniInfoID'] == (int)$_POST['miniInfoID'])
{
$text = $item['text'];
break;
}
}// end foreach
break;
}// end for
print "text=$text";
}// end if
?>
Ниже приведено изображение запущенного приложения flash:
Ответ №2:
public function OpenWorkDetails(e:MouseEvent):void{
trace((e.currentTarget as MiniInfo).IDTrabalhoField.text);
}
Комментарии:
1. Ошибка: 1119: Доступ к, возможно, неопределенному свойству IDTrabalhoField через ссылку со статическим типом MiniInfo. Нужно ли мне что-то импортировать?
2. @Marco Fox — что такое miniinfo? как там объявляется IDTrabalhoField?
3. IDTrabalhoField — это динамическое текстовое поле (правильно названное IDTrabalhoField, я знаю, что это работает, потому что я использовал его раньше) внутри видеоролика с именем MiniInfo. эта миниИнфо добавляется на этап через addChild внутри цикла while. Все это находится внутри видеоролика «Контейнер». Я знаю, что это сбивает с толку, поэтому я лучше приведу это в таблицу: MainSWF.swf>Container.as >MiniInfo (видеоролик)
4. @Marco Fox — мой пример работает, только если
MiniInfo
это пользовательский класс с общедоступным текстовым полемIDTrabalhoField
. В противном случае (если вы знаете глубину IDTrabalhoField внутри MiniInfo) используйтеtrace(((e.currentTarget as MovieClip).getChildAt(IDTrabalhoField_depth) as TextField).text);
Ответ №3:
Вы уверены, что MainFInfo, ваш MainINfo.addEventListener и OpenWOrkDetails находятся в одном и том же видеоролике?
Ошибка, которую вы получаете, означает, что MainInfo не существует в том же MovieClip. lee
Ответ №4:
Ваша проблема может заключаться в том, что MiniInfo не объявлен в области видимости. Если это экземпляр класса, то это сработало бы, но если MiniInfo объявлен внутри функции, он будет «забыт», как только вы выйдете из этой функции. Вот почему вы должны сделать то, что сделал www0z0k, и использовать свойство currentTarget события.
Комментарии:
1. У MiniInfo нет файла AS, если я создам его для него, начнет ли он работать?