PDA

Просмотр полной версии : лоадер, который загружает лоадер, котороый загружает лоадер


teion
12.04.2011, 11:33
вобщем, такой вопрос.. Есть 3 swf файла, каждый из них загружает предыдущий swf. Иерархия такая:
main_class <- block1 <- messag
в классе messag создается объект box и помещается в контейнер bo
package {

import flash.display.MovieClip;


public class messag extends MovieClip {

var bo:MovieClip = new box();
public function messag() {
bo.x = 50;
bo.y = 50;
addChild(bo);
}
}

}
в классе block1 подгружается messag.swf. Далее в этом классе я пытаюсь реализовать таскание этого загружаемого messag.swf за объект bo
package {

import flash.display.MovieClip;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.MouseEvent;
import flash.events.Event;

public class block1 extends MovieClip {

var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("messag.swf");
var cont:MovieClip;
public function block1() {
// constructor code
loader.load(url);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, initt);
}
public function initt (e:Event) {
addChild(loader);
var cont = loader.content;
cont as MovieClip;
cont.bo.addEventListener(MouseEvent.MOUSE_DOWN,mdown);
}


public function mdown (e:MouseEvent){
addEventListener (MouseEvent.MOUSE_MOVE, mmove);
addEventListener (MouseEvent.MOUSE_UP, mup);
function mmove (e:MouseEvent) {
//cont.x = this.localX;
trace(this.stageX);
}
function mup (e:MouseEvent) {
removeEventListener (MouseEvent.MOUSE_MOVE, mmove);
removeEventListener (MouseEvent.MOUSE_UP, mup);
}
}

}

}
ну и соответственно в классе main_class должен подгружаться block1.swf, в котором весь предыдущий функционал должен работать.
вопрос в том, что мне нужно передать контейнеру cont координаты мышки, но фраза даже trace(this.stageX); выдает undefined
всю голову уже сломал

bav
12.04.2011, 12:26
1) Форматируйте код. Читать трудно.

2) в классе messag создается объект box и помещается в контейнер bo

public class messag extends MovieClip
{
var bo:MovieClip = new box();
public function messag()
{
bo.x = 50;
bo.y = 50;
addChild(bo);
}
}

Неправда. Здесь новый объект box становиться ребенком объекта messag.

3) В функции initt, что вы хотели сказать этой строчкой?

cont as MovieClip;

Возможно вы хотели сказать:

// Используем поле класса, а не локальную переменную.
cont = loader.content as MovieClip;


4) Попробуйте дождаться появления stage.

5) Избавьтесь от вложенных функций:

private function mdown (e:MouseEvent):void{
(e.target as EventDispatcher).addEventListener(MouseEvent.MOUSE_MOVE, mmove);
(e.target as EventDispatcher).addEventListener(MouseEvent.MOUSE_UP, mup);
}

private function mmove (e:MouseEvent):void {
trace(this.stageX);
}

private function mup (e:MouseEvent):void {
(e.target as EventDispatcher).removeEventListener(MouseEvent.MOUSE_MOVE, mmove);
(e.target as EventDispatcher).removeEventListener(MouseEvent.MOUSE_UP, mup);
}



6) А может быть:

private function mmove (e:MouseEvent):void {
trace(e.stageX);
}

Потому что MouseEvent.stageX (http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/flash/events/MouseEvent.html#stageX). И потому что ни у класса block1, ни у MovieClip'a свойства stageX не наблюдается.

ZZZubec
12.04.2011, 12:35
поробуй не this.stageX, а trace( e )
как то всё странно у тебя...
function mdown(e:MouseEven)
{
trace(e); //даст все нужные координаты
//[MouseEvent type="click" bubbles=true cancelable=false eventPhase=3 localX=24 localY=14 stageX=224 stageY=24 relatedObject=null ctrlKey=false altKey=false shiftKey=false buttonDown=false delta=0]
}Есть ли смысл их передавать, если каждый мувик наверняка имеет и сам доступ к ним.

teion
12.04.2011, 12:36
спасибо! До EventDispatcher я еще не дошел, но буду стараться )

bav
12.04.2011, 12:41
EventDispatcher это просто класс, в котором определены публичные методы addEventListener и removeEventListener, и наследником которого является MovieClip. e.target можно приводить и к MovieClip, по-моему разницы, в данном контексте, нет (спроси у гуру).

teion
12.04.2011, 14:47
еще такой вопрос - как определить высоту верхнего края у мувиклипа, если он не отцентрирован в левый верхний угол, вот код на данный момент
package {

import flash.display.MovieClip;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.events.EventDispatcher;

public class block1 extends MovieClip {

var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("messag.swf");
var cont:MovieClip; //контейнер для лоадера
var dispx:Number; //переменные для коррекции места начала сдвига
var dispy:Number;
public function block1() {
// constructor code
loader.load(url);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, initt);
}
public function initt (e:Event) {
loader.y = 100;
addChild(loader);
var cont = loader.content as MovieClip;//используем содержимое как мувиклип, что бы добраться до его экземпляров
cont.bo.addEventListener(MouseEvent.MOUSE_DOWN,mdown);
cont.bo.addEventListener(MouseEvent.ROLL_OUT,mrollout);

}


private function mdown (e:MouseEvent):void{
dispx = e.localX;//присваивание коррекции
dispy = e.localY;
(e.target as EventDispatcher).addEventListener(MouseEvent.MOUSE_MOVE, mmove);
(e.target as EventDispatcher).addEventListener(MouseEvent.MOUSE_UP, mup);
}
function mmove (e:MouseEvent) {
loader.x = e.stageX-dispx;//сдвиг по Х работает нормально
loader.y = e.stageY-dispy;//сдвиг по У работает не корректно из за того, что cont.bo не отцентрирован по верхнему краю
trace(e);
}
private function mup (e:MouseEvent):void {
(e.target as EventDispatcher).removeEventListener(MouseEvent.MOUSE_MOVE, mmove);
(e.target as EventDispatcher).removeEventListener(MouseEvent.MOUSE_UP, mup);
}
private function mrollout (e:MouseEvent):void {
(e.target as EventDispatcher).removeEventListener(MouseEvent.MOUSE_MOVE, mmove);
(e.target as EventDispatcher).removeEventListener(MouseEvent.MOUSE_UP, mup);
}

}

}