PDA

Volledige versie bekijken : andere class benaderen


slickshots
%Europe/Berlin %056 %2008, 02:21
Hi guys,

sorry ben ik nog een keer :# P)

Ik heb een mediaspeler gemaakt die data ophaalt uit een xml file, mr black had me perfect geholpen om de data goed te verwerken :)

Nu heb ik een Mediacontrol class, en een Videoplayer class.
de Videoplayer class extend ik in de Mediacontrol class.
Dus ik kan nu gewoon de functie(s) van de Videoplayer class aanroepen in de Mediacontrol.
Ik heb als test, achter elke (video control) functie een Pause gezet, dat moet natuurlijk altijd werken. Maar dat doet het niet... wat zie ik over het hoofd?

hij komt iig goed naar de funktie toe, hij traced prima de "PAUSE".
Maar hij lijkt het verkeerde videoplayer object aan te spreken...


package pack{

import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Mediacontrol extends Videoplayer {

public var playbutton : Playbutton;
public var stopbutton : Stopbutton;
public var mutebutton : Mutebutton;
public var videoplayer : Videoplayer;
private var xAs : uint;

public function Mediacontrol() {
playbutton = new Playbutton();
stopbutton = new Stopbutton();
mutebutton = new Mutebutton();
addChild(playbutton);
addChild(stopbutton);
addChild(mutebutton);
xAs = 83;
playbutton.addEventListener(MouseEvent.CLICK, mediaPlay);
playbutton.x = 20;
playbutton.y = xAs;
stopbutton.addEventListener(MouseEvent.CLICK, mediaStop);
stopbutton.x = 57;
stopbutton.y = xAs;
mutebutton.addEventListener(MouseEvent.CLICK, mediaMute);
mutebutton.x = 91;
mutebutton.y = xAs;
//videoplayer = new Videoplayer();
//this.addChild(videoplayer);
}

public function mediaPlay(Event:MouseEvent) {
doPause();
}

public function mediaStop(Event:MouseEvent) {
doPause();
}

public function mediaMute(Event:MouseEvent) {
doPause();
}

}

}



package pack{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.media.SoundTransform;
import flash.media.Video;

public class Videoplayer extends MovieClip {

public var nc : NetConnection;
public var ns : NetStream;
public var st : SoundTransform;
public var vid : Video;
static var vstate : Boolean = true;
private var netClient : Object;
public var vplay : String;

public function Videoplayer() {
nc = new NetConnection();
nc.connect(null);
ns = new NetStream(nc);
st = new SoundTransform();
var vid:Video = new Video();
this.addChild(vid);
vid.attachNetStream(ns);
//ns.play("../media/space.cowboy.flv");
vid.x = 10;
vid.y = 115;
vid.width = 320;
vid.height = 240;
ns.addEventListener(NetStatusEvent.NET_STATUS, getMeta);
ns.addEventListener(NetStatusEvent.NET_STATUS, isStopped);
}
public function doPlaying(vplay) {
ns.play("media/" + vplay);
}

public function doStop() {
trace("STOP");
ns.seek(0);
}

public function doPause() {
trace("PAUSE");
ns.togglePause();
}

private function getMeta(event:NetStatusEvent):void {
trace(event.info.code);
netClient = new Object();
netClient.onMetaData = function(meta:Object) {
trace(meta.duration);
};
ns.client = netClient;
}


private function isStopped(event:NetStatusEvent) {
//trace(event.info.code);
switch (event.info.code) {
case "NetStream.Buffer.Empty" :
trace("Buffer empty");
break;
case "NetStream.Buffer.Full" :
trace("Buffer full");
break;
case "NetStream.Play.Start" :
trace("Playing");
break;
case "NetStream.Play.Stop" :
trace("Stopped");
break;
case "NetStream.Play.Start" :
trace("GESTART");
break;
default :
trace("Unlisted event.");
}
}
}
}


oja.. kleinigheidje... zijn die TextField in flash nou zo buggy?
zoals je in de download kunt zien, worden alle textelementen gestyled met een textformat, alleen pakt hij niet alles .... [V]

je mag hem ook downloaden als volledig werkend voorbeeld:
http://www.slickshots.nl/mediaplay.zip

Dauntless
%Europe/Berlin %408 %2008, 10:48
Hier zit je denk ik fout met je gedacht over wat inheritance doet.

De MediaController extends de VideoPlayer. Je maakt dan een instantie aan van de MediaController en van de VideoPlayer, maar deze instances hebben niets met elkaar te maken! Het enige wat ze gemeenschappelijk hebben is een hoop methodes, maar de methodes die de MediaController intance oproepen worden op die mediaController instance opgeroepen en die van de VideoPlayer op de videoplayer.

Wat je hier nodig hebt is composition, niet inheritance. Dat wil dus zeggen dat je de videoplayer instance meegeeft als argument aan de MediaController instance en dat hij daar dan de methodes op oproept. De mediacontroller class moet dus ook niet de VideoPlayer class extenden (maar wel de MovieClip class)

En wat is het vreemde gedrag van de textfields ?

slickshots
%Europe/Berlin %431 %2008, 11:20
dankje dauntless :) wat betreft inheritance, dat ga ik nog eens goed doornemen

het vreemde van de textfields is dat ik die een style mee geef (textformat) maar deze niet wordt uitgevoerd. Zie: "now playing..." en "Category: .......".

De tracks die bovenaan staan, doen het wel.

Dauntless
%Europe/Berlin %444 %2008, 11:39
Bij now playing en categorie is het juist met mooie bold en italics delen terwijl de tracklisting normaal, zonder opmaak is .... ?

slickshots
%Europe/Berlin %559 %2008, 14:26
bij die 2 textdelen is d text gewoon arial, terwijl ik verdana 0xFFFFFF opgeef.
dat is t vreemde...

TheDutch
%Europe/Berlin %775 %2008, 19:36
Krijg je wel de trace te zien van pauze?

TheDutch
%Europe/Berlin %781 %2008, 19:45
------------

TheDutch
%Europe/Berlin %791 %2008, 20:00
Ik zie je probleem omtrend dat pauze, of eigenlijk alle knoppen. Het lijkt erop dat NetStream van een superclass niet reageert op een aanroep vanuit een subclasses. Niet alleen de functies doen het niet maar ook het property "time" blijft 0 geven. Wanneer ik in dezelfde scope (de Videoplayer) een timer zet die doPause() aanroept werkt het wel. Dat laat mij zien dat er een scoping probleem ontstaan voor NetStream. Waarschijnlijk maakt hij op één of andere manier twee instanties aan voor zowel de super- als de subclass. Een oplossing heb ik niet kunnen vinden voor de code zoals je die nu hebt staan :).

Dauntless
%Europe/Berlin %813 %2008, 20:31
Maar hij máákt toch ook zelf 2 instances aan (1 van de subclass en 1 van de superclass) ?

TheDutch
%Europe/Berlin %820 %2008, 20:40
Maar hij máákt toch ook zelf 2 instances aan (1 van de subclass en 1 van de superclass) ?
Een instantie van NetStream wordt enkel in Videoplayer aangemaakt. Echter wordt Videoplayer dubbel geinstantieerd via Mediacontrol en Videoplayer zelf, beide in Mediaplayer. Die laatste is helemaal niet nodig omdat Videoplayer al overerft wordt door Mediacontrol, daarom heb ik die instantie direct uit Mediaplayer gehaalt. Dus eindigen we met een enkele instantie :).

Dauntless
%Europe/Berlin %877 %2008, 22:03
Ik had het over de Mediacontrol en de VideoPlayer class waarbij de Mediacontrol class de VideoPlayer class extend. Van beiden werd een instance aangemaakt en hij verwachte dat de instantie van de subclass de methodes van de (geinstantieerde) superclass zou oproepen... Daar lag het probleem toch? Of ben je niet meer aan het antwoorden op de hoofdvraag ?

slickshots
%Europe/Berlin %881 %2008, 22:08
ja dat klopt inderdaad.
is dit een bugje... of heb ik dan in het OOP gedeelte iets onjuist gedaan?
als jullie vinden dat bepaalde dingen in mijn code niet goed zijn, of niet goed zijn doordacht, dan hoor ik dat graag :) ben dus wel bezig met OOP gedeelte goed te snappen, en naast het boek, is de praktijk toch nets iets anders, en wil ik zo clean mogelijk werken :)

net zoals de textformat op de andere text objecten... dat werkt ook niet, terwijl ik totaal niet zie wat het probleem er bij is.


------------------------------------------------------
edit: jullie twee, en nog een paar guru's hier op het FF forum, wil ik erg bedanken voor wat ik de afgelopen tijd allemaal heb geleerd. Niet om te slijmen, maar hier leer ik het meest van, en jullie reageren snel en professioneel, keep up the good work guys! :# :P
------------------------------------------------------

Dauntless
%Europe/Berlin %885 %2008, 22:14
Je hebt (wat betreft dat probleem) inderdaad iets mis gedaan in het OO gedeelte ;). Beeld het je zo in: Als je een classe extend, kopiëer je al zijn methodes naar de sub classe zodat je al die methodes (die dus gedefiniëerd staan in de super class) kan gebruiken alsof je ze gewoon in de sub classe gedefiniëerd hebt. Je voert de doPause dus uit op de Mediacontroller instance zelf!

TheDutch
%Europe/Berlin %895 %2008, 22:29
Of ben je niet meer aan het antwoorden op de hoofdvraag ?
Mijn antwoord was inderdaad niet erg duidelijk, ik zal het zo even aanpassen. Waar het mij om ging was dat er uiteindelijk (in mijn test versie) maar één instantie van NetStream actief was en geen twee, dus dat kon het probleem niet zijn.

Daar lag het probleem toch?
Het probleem zit hem in scoping wanneer je vanuit een subclass een NetStream instantie wilt gebruiken die geinstantieerd is in een superclass. Zie post #6 (http://www.flashfocus.nl/forum/showpost.php?p=320266&postcount=6) :).

slickshots
%Europe/Berlin %575 %2008, 14:49
oke, hoe kan ik dit aanpakken? ;)
moet ik dan met super() gaan werken?

TheDutch
%Europe/Berlin %711 %2008, 18:04
Ik heb de oorzaak van je probleem gevonden. Je maakt ook een Videoplayer instantie aan in de Playlist en gebruikt die om video mee af te spelen in plaats van degene die je aanmaakt in Mediaplay.

Playlist.as

private function getMediaData(rootXML:XML):void {
...
videoplayer = new Videoplayer();
addChild(videoplayer);
...
}
}

private function doPlay( event:MouseEvent ):void {
...
videoplayer.doPlaying(item.url);
...
}

Je speelt dus de video af in een andere instantie van Videoplayer dan waar je de controls op uitvoert. Hoe meer ik je code bekijk hoe meer ik me afvraag of je wel begrijpt wat je precies doet. Nu kan ik wel nog meer uren stoppen in het uitleggen wat je allemaal niet goed aanpakt en hoe het wel zou moeten maar daar heb ik eigenlijk geen zin in en een boek kan dat trouwens veel beter wanneer je gewoon even een stap terug zet en het (OO programmeren) rustig gaat leren :).

Ik heb twee voorkeuren voor boeken:

1. Learning ActionScript 3.0 (http://www.nl.bol.com/is-bin/INTERSHOP.enfinity/eCS/Store/nl/-/EUR/BOL_DisplayProductInformation-Start?Section=BOOK_EN&BOL_OWNER_ID=1001004004710697)
2. Essential ActionScript 3.0 (http://www.nl.bol.com/is-bin/INTERSHOP.enfinity/eCS/Store/nl/-/EUR/BOL_DisplayProductInformation-Start?BOL_OWNER_ID=1001004004926767&Section=BOOK_EN)

Koop er één van of nog beter beide, want het zijn alle twee de beste boeken die kunt hebben om ActionScript 3.0 goed te leren. Veel plezier! Je zult er geen spijt van krijgen.