Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 14-05-2011, 23:39   #1 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Stehe auf dem Schlauch: Klasseninterne Variablen funzen nicht :-(

Liebes Forum,

ich bin verzweifelt: Ich möchte Videos abspielen und habe das Problem, dass wenn ich in meinem Menü vom Video wieder zurück zum Kapitelmenü gehe und wieder zum Video, der Film zweimal abgespielt wird. Ich erreiche aber diesen verflixten Player nicht, um ihn beim Wechesl komplett auszuradieren.

Ich habe beim "adden" des Players das Objekt in einer Varialen "this.AddedChild" gespeichert. In der Funktion "onChildAdded()" ist diese Variable aber bereits wieder null. Ich habe auch versucht, dem Objekt "AddedChild" den eindeutigen Namen "E3_content" zu geben um das Objekt über den Namen anzusprechen. Klappt aber nicht:

Code:
public class cl_E3 extends MovieClip {
	
	private var _videoclip:String;
	public var AddedChild:DisplayObject;
	public var player:FLVPlayback;
	
	public function cl_E3() {
		stage.addEventListener(CustomEvent.CUSTOM, onCallE3);
		this.addEventListener(Event.ADDED, onChildAdded);
		this.addEventListener(Event.REMOVED_FROM_STAGE, onUnload);
		stage.addEventListener(CustomEvent.CUSTOM, onKillPlayer);
		}

public function onCallE3(evt:CustomEvent = null):void {
		if (evt.methode == "Aktualisieren" && evt.zielebene == 3) {
			this._videoclip = undefined;
			if (!imgObj) var imgObj:DisplayObject = undefined;
			var nameArray:Array = evt.argument.split("_"); //Wenn ein Videoinhalt übergeben wird, ist der Name durch zwei "_" getrennt"
			if (nameArray.length == 1) {
				imgObj = getDisplayObject("lib_" + nameArray[0]););
			} else {
				this._videoclip = evt.argument;
				var player = new FLVPlayback();
				player.activeVideoPlayerIndex = 0;
				player.autoPlay = true;
				player.width =  1080;
				player.x = 200;
				player.height = 810;
				player.y = 107;
				player.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
				player.align = VideoAlign.CENTER;
				player.source = "./videos/"+this._videoclip+".f4v"
				imgObj = player; 
			}
		}
		trace("onCallE3: " + imgObj);
		try { this.AddedChild = this.addChildAt(imgObj, 0); }
		catch (e:RangeError) { trace("onCallE3:addChildAt " + e); }
				
		trace("Child is: " + this.AddedChild);
		AddedChild.name = "E3_content";
		trace("Child's name is: " + this.AddedChild.name); //Soweit klappts
	}

}

private function onChildAdded() {
	arguments; 
	trace("cl_E3:onChildAdded "+AddedChild.name); //Hier ists dann null
	try { stage.dispatchEvent(new CustomEvent(CustomEvent.CUSTOM, "StagePlay"));  }
	catch(e:Error) { trace("onCallE3:onChildAdded:stage.dispatchEvent: "+e); }
}
		
private function onKillPlayer(evt:CustomEvent) {
	if (evt.methode == "StageBack") {
		trace("onCallE3:onKillPlayer: Player stoppt"+this.name);
		this.E3_content.stop(); //Auch das klappt nicht :(
	}
}

function getDisplayObject(linkage:String):DisplayObject {
	var clazz:Class = getDefinitionByName(linkage) as Class;
	return new clazz();
}
		
function onUnload () {
	arguments;
	trace("E3 UnLoad " + this.name + " " + this.AddedChild);
	stage.removeEventListener(CustomEvent.CUSTOM, onCallE3);
	this.removeEventListener(Event.ADDED, onChildAdded);
	this.removeEventListener(Event.REMOVED_FROM_STAGE, onUnload);
	stage.removeEventListener(CustomEvent.CUSTOM, onKillPlayer);
	this.removeChild(this.E3_content); //Aufräumen klappt auch nicht 
}
Hat jemand eine Idee, wie ich beim Wechseln von der Videoanzeige zum Menü den Player so zurückgesetzt bekomme, dass er keine neuen Instanzen aufmachen resp. die alte beim Verlassen löscht?

Danke und viele Grüße
Seebold
Seebold ist offline   Mit Zitat antworten
Alt 16-05-2011, 23:55   #2 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Immer noch unklares Verhalten bei FLV-Player und Instanzierung

Hallo liebes Forum,

tja, da konnte mir keinen helfen, darum habe ich meinen Ansatz geändert/vereinfacht. Ich starte einen Videoplayer zu Beginn des Projektes und möchte dann die Source anpassen und play sagen. Das ganze soll ganz unten auf root laufen. Nur kann ich zwar nach der Instanzierung aus einer anderen Funktion heraus die Playerinstanz abfragen (Objektreferenz, Name oder x-position), nicht aber FLV-Playback-spezifische Eigenschaften wie "source" oder Methoden wie play() erreichen.

Hier ein bisschen Code; alles im Main.as (Dokumentenklasse):

<b>Im Konstruktor der Dokumentenklasse Main:</b>
Code:
addVideoplayer();
stage.addEventListener(CustomEvent.CUSTOM, onVideoPlay); //Wenn Event "VideoPlay" dispatcht wird
<b>Funktion zum Erstellen des Videoplayers:</b>
Code:
private var videoplayer:DisplayObject;
private function addVideoplayer() {
	var player = new FLVPlayback();
	player.activeVideoPlayerIndex = 0;
	player.autoPlay = true;
	player.width =  108.0;
	player.x = 200;
	player.height = 81.0;
	player.y = 107;
	player.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
	player.align = VideoAlign.CENTER;
	player.source = "./videos/kap2.f4v"
		
	this.videoplayer = this.addChildAt(player,0);
	this.videoplayer.name = "mc_videoplayer";
	}
}
Und nun die Play-Funktion, die ebenfalls in Main.as liegt:

Code:
public var mc_videoplayer:MovieClip; //muss das?
private function onVideoPlay(evt:CustomEvent) {
	if (evt.methode == "VideoPlay") {
		trace(this.videoplayer.x+" "+this.videoplayer.name); //funktionert
		trace(this.videoplayer.align); //funktioniert nicht:1119: Zugriff auf eine möglicherweise nicht definierte Eigenschaft align über einen Verweis mit statischem Typ flash.display:DisplayObject
		this.videoplayer.stop(); //funktioniert nicht 

		trace(getChildByName("mc_videoplayer")); //Gibt Objektreferent [object FLVPlayback] zurück

		trace(getChildByName("mc_videoplayer").align); //funktioniert nicht:1119: Zugriff auf eine möglicherweise nicht definierte Eigenschaft align über einen Verweis mit statischem Typ flash.display:DisplayObject
		trace(MovieClip(root).mc_videoplayer.align); //Funzt auch nicht
	}
}
Kann mir jemand verraten, wie ich aus einer Funktionen diese FLVPlayback-Instanz erreiche?

Danke und liebe Grüße
Seebold
Seebold ist offline   Mit Zitat antworten
Alt 17-05-2011, 00:10   #3 (permalink)
i ate pixels
 
Benutzerbild von pixelslave
 
Registriert seit: Mar 2004
Ort: Augsburg
Beiträge: 527
Hallo Seebold,

woher soll dein DisplayObject denn wissen was es mit der Eigenschaft align anfangen soll?

Zitat:
trace(getChildByName("mc_videoplayer").align); //funktioniert nicht:1119: Zugriff auf eine möglicherweise nicht definierte Eigenschaft align über einen Verweis mit statischem Typ flash.displayisplayObject
Genau das sagt dir diese Meldung.

Eine andere Frage, die ich mir stelle ist:
Wieso erstellst du eine lokale instanz der player variable mit dem Typ FlvPlayback und weisst diese Instanz dann einer Klassenvariable mit dem Typ DisplayObject zu !?

probier doch mal folgendes:

ActionScript:
  1. private var player:FLVPlayback;
  2. private function addVideoplayer() {
  3.     player = new FLVPlayback();
  4.     player.activeVideoPlayerIndex = 0;
  5.     player.autoPlay = true;
  6.     player.width108.0;
  7.     player.x = 200;
  8.     player.height = 81.0;
  9.     player.y = 107;
  10.     player.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
  11.     player.align = VideoAlign.CENTER;
  12.     player.source = "./videos/kap2.f4v"
  13.        
  14.     }
  15. }
  16.  
  17. private function onVideoPlay(evt:CustomEvent) {
  18.     if (evt.methode == "VideoPlay") {
  19.         this.player.stop();
  20.     }
  21. }

ActionScript:
  1. trace(getChildByName("mc_videoplayer").align); //funktioniert nicht:1119: Zugriff auf eine möglicherweise nicht definierte Eigenschaft align über einen Verweis mit statischem Typ flash.display:DisplayObject
  2.         trace(MovieClip(root).mc_videoplayer.align); //Funzt auch nicht
  3. public var mc_videoplayer:MovieClip; //muss das?
  4.  
nein - die Benennung einer Variable hat nichts mit der Eigenschaft "name" einer Objektinstanz zu tun.

ActionScript:
  1. this.videoplayer.stop(); //funktioniert nicht
  2.  
Die Klasse DisplayObject kennt diese Funktion nicht


Grüße

Martin
pixelslave ist gerade online   Mit Zitat antworten
Alt 17-05-2011, 00:31   #4 (permalink)
Neuer User
 
Benutzerbild von andrelehnert
 
Registriert seit: Oct 2007
Ort: Kölle
Beiträge: 1.231
hi,
dein "videoplayer" ist ein Displayobject und somit nur ein Container für
den eigentlichen Player(Deine FLVPlayback-Instanz - somit ein schlechter Name);
Somit kannst Du die Methoden und Eigenschaften der FLVPlayback-Komponente
NICHT auf "videoplayer" sondern nur auf "player" anwenden.
Um in Deinem EventHandler da ran zu kommen sehe ich spontan zwei Möglichkeiten:
1.Du benutzt eine Klassenvariable für die Playbackinstanz:
PHP-Code:
private var player:FLVPlayback = new FLVPlayback();
private var 
videoplayer:Sprite=new Sprite();
addChild(videoplayer);;
private function 
addVideoplayer() {    
    
player.activeVideoPlayerIndex 0;
    
player.autoPlay true;
    
player.width =  108.0;
    
player.200;
    
player.height 81.0;
    
player.107;
    
player.scaleMode VideoScaleMode.MAINTAIN_ASPECT_RATIO;
    
player.align VideoAlign.CENTER;
    
player.source "videos/vid.flv"
    
videoplayer.addChild(player);
    
onVideoPlay();
    }    
private  function 
onVideoPlay(evt:CustomEvent=null) {
    ....
        
player.stop();
        
trace(player.align); 
    ....

2. Du holst Dir im eventHandler die Playbackinstanz aus der Child-List des Displayobjects, ich würde da immer direkt ein Sprite nehmen
PHP-Code:
var videoplayer:Sprite=new Sprite();
addChild(videoplayer);
function 
addVideoplayer() {    
    var 
player:FLVPlayback = new FLVPlayback();
    
player.activeVideoPlayerIndex 0;
    
player.autoPlay true;
    
player.width =  108.0;
    
player.200;
    
player.height 81.0;
    
player.107;
    
player.scaleMode VideoScaleMode.MAINTAIN_ASPECT_RATIO;
    
player.align VideoAlign.CENTER;
    
player.source "videos/vid.flv"
    
videoplayer.addChildAt(player,0);
    
onVideoPlay();
    }    
 function 
onVideoPlay(evt:CustomEvent=null) {
    var 
player videoplayer.getChildAt(0);
    
player.stop();
    
trace(player.align);    
}
addVideoplayer(); 
Mit der Name-Eigenschaft rumzuhantieren ist gar nicht gut.
Schon in AS2 nicht - in AS3 erst recht nicht.

Arbeite besser direkt mit Referenzen.


LG ANdré

[EDIT] JAU, da war pixelslave schneller!
__________________
Die Hoffnung stirbt zuletzt.
Aber sie stirbt.

Geändert von andrelehnert (17-05-2011 um 00:42 Uhr)
andrelehnert ist offline   Mit Zitat antworten
Alt 17-05-2011, 23:16   #5 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Hey, super: Andrés Erklärung war gut und Pixelslaves Skript hat mich auch weiter gebracht. Ich danke Euch, Jungs :-)
Seebold ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
funktion, klasse, übergeben, variabeln

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
stehe mal wieder auf dem schlauch... yuppy Flash Einsteiger 17 07-07-2008 14:16
Pfad, stehe auf dem Schlauch _Admin__ Flash Einsteiger 4 01-08-2007 10:40
Zeitleistenvariable - ich stehe auf dem Schlauch andgar ActionScript 1 2 25-01-2005 09:40
Stehe auf dem Schlauch bei Galerie Tommie_Jay ActionScript 1 2 20-08-2004 13:04
Variablen (ich stehe auf´m schlauch) joga Flash MX 15 09-04-2003 15:26


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele