loadClip in Klasse funktioniert nicht

inctube

Erfahrenes Mitglied
Hallo,

ich bin gerade dabei mir meine erste Klasse zu schreiben. Bis jetzt funktioniert alles ganz gut, ich habe momentan nur ein Problem und auch keine Ahnung an warum es nicht geht.
Ich habe folgenden code:
PHP:
import MovieClip.*;
import MovieClipLoader.*;
import Stage.*;

......

public var imageLoader:MovieClipLoader;
.......
//Der trace(window_path["functions"+window_id]["menu_bar"+window_id]) liefert mir auch den Pfad, also daran kann nicht liegen. Die Grafik ist auch vorhanden und wird korrekt übergeben. 
imageLoader.loadClip(menu_bar_img, window_path["functions"+window_id]["menu_bar"+window_id]);

Ich hoffe jemand kann mir helfen.
thx inctube
 
Hi,

1. Hast Du den Loader mit imageLoader = new MovieClipLoader() auch korrekt deklariert?

2. Liefert menu_bar_img eine gültige Referenz auf einen MovieClip?

Gruß
.
 
Ha super...
Man sollte manche Dinge einfach nicht vergessen :)

Gleich noch eine zweite Frage:
Hab mir ein Rechteck zeichnen lassen und zwar so:
PHP:
clipHolder.createEmptyMovieClip("window"+window_id, getNextHighestDepth());
		clipHolder["window"+window_id].beginFill(windowColor, windowAlpha);
		clipHolder["window"+window_id].lineStyle(lineSize, lineColor, lineAlpha);
		clipHolder["window"+window_id].moveTo(0, 0);
		clipHolder["window"+window_id].lineTo(window_width, 0);
		clipHolder["window"+window_id].lineTo(window_width, window_height);
		clipHolder["window"+window_id].lineTo(0, window_height);
		clipHolder["window"+window_id].lineTo(0, 0);
		clipHolder["window"+window_id].endFill();
geht auch.
Dann leg ich mir eine Menuleiste rein so:
PHP:
window_path.createEmptyMovieClip("functions", getNextHighestDepth());
window_path.functions.createEmptyMovieClip("menu_bar", getNextHighestDepth());
imageLoader.loadClip(menu_bar_img, window_path.functions.menu_bar);

Dann übergeb ich das ganze an eine 2.Funktion:
PHP:
		var menu_bar_path:MovieClip = window_path.functions.menu_bar;
		posMid(window_path, window_width, window_height);

	private function posMid(window:MovieClip, window_width:Number, window_height:Number) {
		window._x = ((Stage.width)-(window_width))/2;
		window._y = ((Stage.height)-(window_height))/2;
		window.functions.menu_bar.onPress = function() {
			startDrag(window, false, 0, 0, Stage.width-window._xscale, Stage.height-window._yscale);
		};
	}

Warum geht das Dragging nicht?

thx inctube
 
Hi,

dieser Codeschnipsel funktioniert (die entsprechenden MovieClip-Instanzen vorausgesetzt) bei mir problemlos. Um das Ding wirklich zu debuggen (Du hast ja ziemlich viele, zum Teil dynamisch erstellte, Clips verschachtelt), müsste ich die komplette Film- und Klassenstruktur kennen - poste bitte einmal die beteiligten Dateien.

Ich vermute ein Problem mit der Referenzierung bzw. ungültige Referenzen.

Gruß
.
 
Hi,

  • mit
Code:
imageLoader.loadClip(menu_bar_img, window_path.functions.menu_bar);
lädst Du ein Bild in den MC "window_path.functions.menu_bar". Dadurch wird dieser MC (und alle auf ihm erstellten Variablen, Methoden und Handler) überschrieben. Das Laden eines Bildes dauert allerdings (auch offline) immer länger als die Zeitspanne zwischen zwei (oder auch mehreren) AS-Zeilen, so dass die Methode "posMid" ausgeführt wird, bevor das Bild wirklich in den Clip geladen wird. Dadurch wird Dein onPress-Handler kurz nach dem Erstellen wieder überschrieben (nämlich genau dann, wenn das Bild komplett geladen ist).

Du musst also a) entweder warten, bis die loadClip-Methode abgeschlossen ist, bevor Du die Funktion "posMid" ausführst (schau dazu unter den Listenern für die MovieClipLoader-Klasse nach), oder Du erstellst noch einen leeren MC in "window_path.functions.menu_bar", in den Du das eigentliche Bild lädst - dann bleiben Deine Maushandler von der loadClip-Aktion unbeeinflusst:
Code:
window_path.functions.createEmptyMovieClip("menu_bar", 1);
window_path.functions.menu_bar.createEmptyMovieClip("img", 1);
imageLoader.loadClip(menu_bar_img, window_path.functions.menu_bar.img);


  • getNextHighestDepth()macht an den Stellen, an denen Du es einsetzt, auch keinen Sinn, da Du damit bestenfalls die nächste freie Tiefe auf der Hauptzeitleiste bekommst - Du erstellst aber MovieClip innerhalb anderer MovieClips, die jeweils über eigene Zeitleisten verfügen; daher kannst Du eigentlich in fast allen Fällen eine feste Tiefe (z.B. 1) angeben.

  • Du solltest startDrag als Memberfunktion des MovieClip-Objektes verwenden und einen Pfad angeben, der sich relativ zum Objekt, auf dem der Maushandler ausgeführt wird, bedindet:
Code:
window.functions.menu_bar.onPress = function(window) {
    this._parent._parent.startDrag(false, 0, 0, Stage.width-this._parent._parent._xscale, Stage.height-this._parent._parent._yscale);
}
Die (lokale) Variable "window" ist nämlich zu dem Zeitpunkt, zu dem der onPress-Handler aufgerufen wird, schon wieder unbekannt.


  • "_xscale" und _"yscale" liefern Dir nicht die tatsächlichen Maße eines Objekts, sondern seine relative Skalierung (z.B. 200 für das doppelte der Originalbreite). Wenn Du Maße zur Begrenzung einer startDrag-Aktion bekommen willst, verwende die ._x und ._y-Eigenschaften.


Gruß
.
 
Also jetzt läufts soweit...
Allerdings würde ich jetzt gerne:
1. eine Maske generieren, dazu habe ich folgendes gemacht:
PHP:
clipHolder.window.createEmptyMovieClip("contentHolder", 2);
		clipHolder.window.contentHolder.createEmptyMovieClip("mask_holder", 3);
		clipHolder.window.contentHolder.mask_holder.createEmptyMovieClip("mask", 3);
		clipHolder.window.contentHolder.mask_holder.mask.beginFill(0x10cc99);
		clipHolder.window.contentHolder.mask_holder.mask.lineStyle();
		clipHolder.window.contentHolder.mask_holder.mask.moveTo(10, 120);
		clipHolder.window.contentHolder.mask_holder.mask.lineTo(window_width-20, 120);
		clipHolder.window.contentHolder.mask_holder.mask.lineTo(window_width-20, window_height-120);
		clipHolder.window.contentHolder.mask_holder.mask.lineTo(10, window_height-120);
		clipHolder.window.contentHolder.mask_holder.mask.lineTo(10, 110);
		clipHolder.window.contentHolder.mask_holder.mask.endFill();
		clipHolder.window.contentHolder.mask_holder.setMask(mask);
2. Dass wenn ich auf ein Fenster klicke das dann in den Vordergrund kommt. Gibt es da eine Methode oder so, die automatisch den MovieClip auf die höchste Ebene bringt?
Ich habe das hier versucht, aber leider geht das nicht.
PHP:
		clipHolder.window.contentHolder.onRollOut = function() {
			outfocusedWindow = this;
		};
		clipHolder.window.contentHolder.onPress = function() {
			trace(outfocusedWindow);
			this._parent._parent.swapDepths(outfocusedWindow);
		};

Des wars soweit mal :) der Rest ist ja in der zip...

thx inctube
 
Hi,

  • clipHolder.window.contentHolder.mask_holder.setMask(mask);
    Es gibt keine gültige Variable mit dem Bezeichner "mask" in Deinem Code.

    Tipp: um nicht jedes Mal endlos lange Pfade tippen zu müssen, verwende die Rückgabewerte, die Dir createEmptyMovieClip zurückgibt:
Code:
var foo = this.createEmptyMovieClip("foo", 1);
var bar = foo.createEmptyMovieClip("bar", 1);

trace(bar); // gibt gültige Referenz auf "foo.bar" zurück
Code:
function bringToFront(mc) {
    mc.swapDepths(mc._parent.getNextHighestDepth());
}

Gruß
.
 
Wow, das mit den Pfadangaben ist ja herrlich:) danke für den Tipp!

So noch eine allerletzte Frage für heute:

Wenn ich nun ein Objekt meiner Klasse erzeugen will.
Mach ich das ja so:
PHP:
var myTestWindow = new WindowClass();
myTestWindow.makeWindow(window_test, 500, 400, "bigimg17.jpg", "menu_bar_img.jpg", 0x333333, 100, 0x000000, 100, 2, "minimize_img.jpg", "close_img.jpg");

Jetzt will ich aber, dass jedesmal wenn ich auf einen Button klicke ein neues Objekt angelegt wird. Dazu hab ich mir folgendes überlegt:
PHP:
btn.onRelease = function() {
	var myTestWindow = new WindowClass();
	i += 1;
	var wWidth:Number;
	var wHeight:Number;
	wWidth = random(800);
	wHeight = random(500);
	_root.createEmptyMovieClip("window_test"+i, i);
	trace(_root["window_test"+i]);
	myTestWindow.makeWindow("window_test"+i, wWidth, wHeight, "bigimg17.jpg", "menu_bar_img.jpg", 0x333333, random(100), 0x000000, 100, 2, "minimize_img.jpg", "close_img.jpg");
};
"i" habe ich natürlich initialisiert ;)
Geht leider so nicht... Hab ich mal wieder was vergessen,

Und noch ne Frage, wie kann ich ein erstelltes Objekt löschen?
Ich hab dann an meinem Fenster z.B. einen close-Button. Dann soll ein Alpha-Fade das Fenster verschwinden lassen und soll dann komplett gelöscht werden. Wie mache ich sowas? mit delete? Wenn ja, delet was

thx inctube
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück