PDA

Volledige versie bekijken : Class/Component, een Stream en een onStatus


Par
%Europe/Berlin %820 %2005, 20:42
Ik zit al enige tijd vast met een probleem. Situatie is als volgt:

Ik heb een component/class geschreven als soundControl object. Deze class maakt dus eigen variabelen aan in de trant van this.myStream = new Stream. No problem, maar nu wil ik de OnStatus gaan gebruiken, dus

this.myStream.onStatus = this.myStreamOnStatusHandler;

en die doet iets van:

this.myStreamOnStatusHandler = function ()
{
// doe iets nuttigs
}

"normaal" gesproken, als je niet in een class zit, zou je zoiets kunnen doen van:

this.Handler = function() { helloWorld(); }

Waarbij de functie helloWorld in je frame1 van je stage staat ofzo. Maar ik zit in een class, en de functie helloWorld zou ik moeten aanroepen met this.helloWorld.
Maaar... als ik in de onStatus handler zit, is this het netStream object, en niet mijn classobject. Ik krijg het dus op geen enkele manier voor elkaar om vanuit de onStatus een functie aan te roepen uit mijn class....

misschien denk ik veels te moeilijk, misschien kan het niet op deze manier, of misschien is het allemaal heel simpel.

Wie het weet mag het zeggen :)

Dauntless
%Europe/Berlin %822 %2005, 20:44
's een veel voorkomend probleem.

Oplossing:
De delegate class

Hier wat uitleg (http://www.senocular.com/?id=0.163)

Par
%Europe/Berlin %842 %2005, 21:12
spring kruip vlieg ren struikel boink huppel touwtjespring verspring hoogspring, yay

oftewel: Dauntless, thanks! :)

Ik vond het uitermate vreemd dat ik niet via Google of #flash/efnet dit antwoord kon vinden, want het leek mij ook dat iedereen die met classes werkt hier mee te maken krijgt. De referentie die je gaf loste een probleem waar ik de hele dag al mee bezig ben in een paar minuten op. Uiteraard zit dit nu in m'n bookmarks.

Wat eventueel handig kan zijn om te weten is: geef niet je hele class door. Bij mij had dit in ieder geval tot gevolg dat Flash ging "hangen" voor een paar seconden (not responding) en dan weer bij was; misschien is de hele class doorgeven beetje overdreven, ook omdat ik maar 1 functie van m'n class wil aanroepen.

Uiteindelijk is mijn code dus iets van:
this.netStream = new NetStream(this.netConn);
this.netStream.setBufferTime(10);
this.netStream['myAction'] = this.stopAudio;
this.netStream.onStatus = this.netStreamOnStatus;

en in de this.netStreamOnStatus functie die ik: this.myAction();

En dat werkt als een trein!

Nogmaals, enorm bedankt voor je razendsnelle en zeer waardevolle reactie!

Dauntless
%Europe/Berlin %844 %2005, 21:16
Zo kan je het inderdaad ook doen... Maar ik meen me te herineren dat de Delegate Class sneller is...

En graag gedaan hoor :)

Par
%Europe/Berlin %846 %2005, 21:18
Oops..

iets te snelle reactie want het werkt nog nie :P maar ben op de goeie weg...

Dauntless
%Europe/Berlin %849 %2005, 21:23
Oops..

iets te snelle reactie want het werkt nog nie :P maar ben op de goeie weg...

Hehe, ok, als je vragen hebt zet je ze hier maar :)


import mx.utils.Delegate;
class ...
this.netStream = new NetStream(this.netConn);
this.netStream.setBufferTime(10);
this.netStream.onStatus = Delegate.create(this, netStreamOnStatus);
function netStreamOnStatus(){
myAction();
}

Zorg wel dat je geupdate hebt naar 7.2

Par
%Europe/Berlin %894 %2005, 22:27
Het is even wennen met objectjes, componentjes en classes.. het idee van
function person()
{
this.name = "";
}
dat kende ik wel... maar we wilden wat meer dus zijn we gaan stoeien met componenten.. voor dit specifieke ding, is een component helemaal niet handig (maar was wel leerzaam), veel this. verwijzingen etc, leuk.

Nu dus maar eens gaan stoeien met de classes.. Eerst flink chagarijnig over hoe classes nou werken in flash (this mag niet, waar ze moeten staan, naampje van het beestje etcetcetc).

Hoe dan ook, ik heb nu dus een class gebouwd (jaja!), en het werkt ook nog, dwz, een beknopte versie van wat ik wil.

Wat ik me nog wel afvraag is het "aanroepen" van een functie vanuit een class.. ik heb een netconnectie, en die wil ik eigenlijk openen/aanmaken zodra de class aangeroepen wordt; maar flash zegt dat ik in mijn class niet mijn "eigen" functie aan mag roepen.

Ik heb nu dus zoiets als:


import mx.utils.Delegate;

class soundControllerClass
{
public var myTest = "Robbert";

private var isPlaying = false;
private var wantToPlay = false;
private var myInterval = "";
private var myIntervalTime = 500;
private var netConn;
private var netStream;

//makeNetConnection;
// this object controls the netsreams and sounds
// make a net connection and connect to localhost (null)
//netConn.connect(null);

function makeNetConnection()
{
netConn = new NetConnection();
netConn.connect(null);
trace("Net connection succesful");
}
//etc


maar roep nu van buitenaf aan van: myClass.makeNetConnection;

Kan ik de class dit ook zelf laten doen als het geinstantieerd wordt? Het lijkt me dat als ik variabelen mag declareren ik ook een functie zou mogen aanroepen...

Hoe zit dat? :confused:

Dauntless
%Europe/Berlin %900 %2005, 22:36
Wat je nu zoekt is de 'constructor'.

import mx.utils.Delegate;

class soundControllerClass
{
public var myTest:String = "Robbert";

private var isPlaying:Boolean = false;
private var wantToPlay:Boolean = false;
private var myInterval:String = "";
private var myIntervalTime:Number = 500;
private var netConn:NetConnection;
private var netStream;

//makeNetConnection;
// this object controls the netsreams and sounds
// make a net connection and connect to localhost (null)
//netConn.connect(null);

public function soundControllerClass(){
//deze functie (welke dezelfde naam heeft als de classe)
//zal automatisch worden aangeroepen wanneer er een nieuwe instantie
//van deze classe wordt gemaakt.
}
function makeNetConnection():Void
{
netConn = new NetConnection();
netConn.connect(null);
trace("Net connection succesful");
}
//etc
}

Je zou ook datatyping moeten gebruiken (ik heb ze erbij gezet: " :TYPE " .).

Een goed boek is : Essential Actionscript 2.0 van Collin Moock (O'Reilley).

En kan je je volledige error message geven?

Par
%Europe/Berlin %967 %2005, 00:12
je krijgt morgen even wat meer toelichting.. heb nu een mooi classje gebouwd en die draait eigenlijk wel leuk.. enige rare is dat het soms lijkt alsof de stream.close voor een "hang" zorgt.. (flash locked voor paar seconden maar geen cpu/mem misbruik ofzo)... maar dit gebeurd erg "at random".. weird

naja, kijk ik morgen even naar, en als je interesse hebt plak ik code hier even; wellicht bruikbaar voor anderen?!

nogmaal bedankt voor de hints en tips!

Par
%Europe/Berlin %863 %2005, 21:43
Dauntless,

Indien je tijd en zin hebt, de volgende code is relevant voor het probleem dat ik heb (rest heb ik ff weggesloopt dus logica zal beetje missen):


import mx.utils.Delegate;

class soundControllerClass
{
private var netConn;
private var netStream;

private function makeAudioStream()
{
netStream = new NetStream(netConn);
netStream.setBufferTime(10);
netStream.onStatus = Delegate.create(this, netStreamOnStatus);
// de onStatus zou dus gedelegeerd moeten worden naar this
// (class object lijkt me) en de functie netStreamOnStatus
trace("soundControllerClass:makeAudioStream:Audio stream created");
}

function netStreamOnStatus (infoObject)
{
if (infoObject['code'] == "NetStream.Play.Stop")
{
trace("soundControllerClass: netStreamOnStatus: EOF");
stopAudio();
}
}

function stopAudio()
{
trace("soundControllerClass:stopAudio");
//trace("myInterval in stopAudio = " + myInterval);
if (myInterval)
{
trace("soundControllerClass:stopAudio:wanttoPlay is false - interval removed");
clearInterval(myInterval);
wantToPlay = false;
}
if (isPlaying)
{
netStream.close();
isPlaying = false;
trace("soundControllerClass:stopAudio:audio stopped - stream closed");
}
}


Het geval is nu, wanneer een stream helemaal afgespeeld is en de onStatus wordt gedelegeerd, hangt flash voor pak en beetje 5 seconden. Je muis blijft een handje en als je Flash swf wilt afsluiten vraagt Windows "end program?"... dus dat lijkt me totaal niet goed.
De onStatus roept zelf de stopAudio functie aan, en dit is geen probleem zolang ik geen netStream.close() doe. Ik kan alleen maar gokken wat de reden is dat flash gaat hangen.

Grote vraag is dus: waarom?

thnx