check the current frame of a movieclip

Λύσεις προβλημάτων για το δημοφιλές πρόγραμμα κατασκευής παρουσιάσεων στο διαδίκτυο.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 12:02

Καλημέρα παιδιά,

έχω το εξής πρόβλημα. Έχω ένα κουμπί και όταν πατάω σ'αυτό θέλω πρώτα να τρέξει ένα Movieclip και αφού ολοκληρωθεί και φτάσει στο τελευταίο του frame θέλω να φορτώσω ένα external movieclip.

Πως μπορώ να το κάνω αυτό;

Απλά να πω ότι χρησιμοποίησα το εξής και τίποτα.
ιf(content_scroller._currentframe==17){
loadSection("test.swf"');
}

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από HeRu » 30 Απρ 2010 12:46

Για να λειτουργήσει με το τρόπο που χρησιμοποίησες, θα πρέπει τον έλεγχο να το κάνεις συνέχεια, δηλαδή να βάλεις ένα enter frame listener ή με κάποιον timer. πχ.

Κώδικας: Επιλογή όλων

this.addEventLisener(Event.ENTER_FRAME, enterFrameHandler);

function enterFrameHandler(event:Event):void
{
if(content_scroller._currentframe==17){
this.removeEventLisener(Event.ENTER_FRAME, enterFrameHandler);
loadSection("test.swf"');
}
}
Εναλλακτικά μπορείς επίσης να κάνεις dispatch ένα event στο τελευταίο frame. πχ.
Βάζεις στο τελευταίο frame του content_scroller:

Κώδικας: Επιλογή όλων

dispatchEvent(new Event(Event.COMPLETE));
και να έχεις έναν listener:

Κώδικας: Επιλογή όλων

content_scroller.addEventListener(Event.COMPLETE, contentCompleteHandler);

function contentCompleteHandler(event:Event):void
{
content_scroller.removeEventListener(Event.COMPLETE, contentCompleteHandler);
loadSection("test.swf"');
}

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 12:57

την πρώτη εναλλακτική που λες θα τη δοκιμάσω σε λίγο.

όσο για τη δεύτερη αυτό προσπαθώ να κάνω αλλά έχω κάποια προβληματάκια γιατί το external swf που φορτώνω το παίρνω δυναμικά, ανάλογα με το κουμπί στο οποίο έγινε κλικ.

Συγκεκριμένα σε έναν clickHandler έχω προσθέσει το εξής:
CONTAINER.CONTENT_SCROLLER.addEventListener("IM_FI NISHED",loadSection((event.currentTarget as MovieClip).whatToLoad));

και παίρνω το παρακάτω λάθος:

Parameter listener must be non-null.
at flash.events::EventDispatcher/addEventListener()
at Main/::clickHandler()

Να πω ότι στο τελευταίο frame του CONTENT_SCROLLER MovieClip έβαλα τον κώδικα dispatchEvent(new Event("IM_FINISHED"));

Το πρόβλημα φαντάζομαι είναι στο πως και που καλώ την LoadSection.

Λίγο που έψαξα στο internet είδα για centralised event management αλλά μου φαίνεται αρκετά προχωρημένο για το επίπεδό μου.

Μπορείς να μου προτείνεις κάτι;

Θα δοκιμάσω τώρα και την πρώτη εναλλακτική αλλά θα με ενδιέφερε να μάθω πως μπορεί να γίνει με τη δεύτερη.

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από HeRu » 30 Απρ 2010 13:07

Το πρόβλημα, όπως λέει και το error είναι ότι δεν υπάρχει η listening function.

Εδώ δηλαδή:
CONTAINER.CONTENT_SCROLLER.addEventListener("IM_FI NISHED",loadSection((event.currentTarget as MovieClip).whatToLoad));

Επισης έχεις το όνομα του event με ένα κενό "IM_FI NISHED", γιαυτό είναι καλύτερα να χρησιμοποιείς static variables για event types.

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 13:18

Το κενό δεν υπάρχει στον κώδικα.

Δεν καταλαβαίνω τι εννοεί ότι δεν υπάρχει η listening function.

Έχω κάποια κουμπιά στον κώδικά μου που στο κάθε ένα έχω δώσει μια property whatToLoad (που είναι το swf που θα φορτωθεί) και έχω προσθέσει έναν ClickHandler

private function clickHandler(event:MouseEvent){

//gia na fainetai to koumpi patimeno
event.target.gotoAndStop(1);

//paizei to animation
CONTAINER.CONTENT_SCROLLER.visible=true;
CONTAINER.CONTENT_SCROLLER.gotoAndPlay(2);

event.target.removeEventListener(MouseEvent.ROLL_OUT, outHandler);
event.target.removeEventListener(MouseEvent.ROLL_OVER, overHandler);

CONTAINER.CONTENT_SCROLLER.addEventListener("IM_FINISHED",loadSection((event.currentTarget as MovieClip).whatToLoad));

SWFAddress.setValue(event.currentTarget.name);


}

και μετά η loadSection

private function loadSection(whatSection){

//trace(whatSection);
l=new Loader();

l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress, false, 0, true);
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete, false, 0, true);


request=new URLRequest(whatSection);
l.load(request);

}

Νομίζω ότι εκεί που καλώ την LoadSection (μέσα από listener) κανονικά δεν πρέπει να έχει παραμέτρους (κάπου το έχω διαβάσει αυτό νομίζω αλλά μπορεί και να μην κατάλαβα καλά) αλλά εγώ εδώ θέλω να στείλω παράμετρο το whatToLoad.

Πως μπορώ να το κάνω;

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από HeRu » 30 Απρ 2010 13:22

Ρίξε μια ματιά εδώ:
http://www.freestuff.gr/forums/viewtopic.php?t=44205

Για να περάσεις μια παράμετρο, θα πρέπει να φτιάξεις ένα custom event.

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 13:33

αυτό που βλέπω και δω όταν ορίζει έναν Listener

myButton.addEventListener(MouseEvent.CLICK, onMyButtonClick);

το onMyButtonClick, η function δηλαδή που καλεί δεν έχει παραμέτρους.

Η ερώτησή μου είναι η εξής: αυτό είναι κανόνας ή μπορώ αν θέλω να στείλω παραμέτρους;

Γιατί στη δική μου περίπτωση στο listener που βάζω στο movieclip καλώ μια function τη loadSection που χρειάζεται παράμετρο.

Αν κάνω με αυτό το σκεπτικό το εξής:

private function clickHandler(event:MouseEvent){

//gia na fainetai to koumpi patimeno
event.target.gotoAndStop(1);

//paizei to animation
CONTAINER.CONTENT_SCROLLER.visible=true;
CONTAINER.CONTENT_SCROLLER.gotoAndPlay(2);

event.target.removeEventListener(MouseEvent.ROLL_OUT, outHandler);
event.target.removeEventListener(MouseEvent.ROLL_OVER, overHandler);

CONTAINER.CONTENT_SCROLLER.addEventListener("IM_FINISHED",loadSection);

SWFAddress.setValue(event.currentTarget.name);


}

private function loadSection(e:MouseEvent){
trace((e.currentTarget as MovieClip).whatToLoad);
//trace(whatSection);
l=new Loader();

l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress, false, 0, true);
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete, false, 0, true);


//request=new URLRequest((e.currentTarget as MovieClip).whatToLoad);
l.load(request);

}

παίρνω το εξής λάθος:

1067: Implicit coercion of a value of type String to an unrelated type flash.events:MouseEvent.

Δεν ξέρω που είναι το λάθος.

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από HeRu » 30 Απρ 2010 13:45

Αυτό σου το βγάζει επειδή καλείς κάπου αλλού αυτήν την μέθοδο και περνάς ένα String (loadSection("test.swf"')), όπως λέει και το error.

Άσε την loadSection όπως την είχες(να δέχεται Sting σαν παράμετρο), και φτιάξε μια καινούργια function για listener, όπου θα κάνεις αυτό που ήθελες πιο πάνω.

Κώδικας: Επιλογή όλων

function finishedHandler(event:Event):void
{
loadSection((event.currentTarget as MovieClip).whatToLoad)
}

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 13:57

το έκανα όπως λες,

τώρα όμως μου βγάζει το εξής λάθος:

TypeError: Error #2007: Parameter url must be non-null.
at flash.display::Loader/_load()
at flash.display::Loader/load()
at Main/loadSection()
at Main/finishedHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at Main_fla::content_scroller_20/frame16()

που μου φαίνεται λογικό γιατί το whatToLoad δεν περνιέται στην finishedHandler μια και προέρχεται από την ClickHandler.

Πρόκειται για 3 διαφορετικά πράγματα που πρέπει να επικοινωνήσουν. Το πάτημα του κουμπιού που στέλνει το whatToLoad, μετά μέσα στο clickHandler ξεκινάει το animation, και όταν τελειώσει καλεί την finishedHandler στην οποία πλέον δεν έχει περαστεί η whatToLoad.

Νομίζω δηλαδή ότι δε μπορεί να γίνει με αυτό τον τρόπο. Ή δεν ταχω καταλάβει καλά;

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 14:00

μήπως να ακολουθήσω άλλη προσέγγιση;

δηλαδή από τη στιγμή που έχω 5 κουμπιά και όταν τα πατάω φορτώνουν τα 5 διαφορετικά swf, το μικρό animation που συμβαίνει να το έχω μέσα σε κάθε swf και όχι στην κεντρική σκηνή;

Είναι πολύ μπακάλικος αυτός ο τρόπος και μεγαλώνει το μέγεθος του αρχείου;

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από HeRu » 30 Απρ 2010 14:08

Αυτό το "whatToLoad" πως το έχεις αποθηκεύσει μέσα στα MovieClips ?

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 14:17

έχω για παράδειγμα 5 κουμπιά στην οθόνη μου και στην κλάση μου Main.as εκεί που τους προσθέτω τους Listeners κάνω για παράδειγμα και το εξής:

projects.whatToLoad="projects.swf";

όπου projects το instance name του κουμπιού projects.

Τώρα δεν ξέρω αν επιτρέπεται να παραθέσω το παρακάτω που μου πρότειναν σε ξένο forum:

Here you go, try this class. She's a beaut!

http://www.odbo.co.uk/com.rar

Fire her up with a listener

var yourEvent = ModelEventCentral.getInstance().addEventListener('ProjectEvent.DATA_EVENT',yourFunction);

Twat off the event with as many variables as you want

ModelEventCentral.getInstance().dispatchEvent(new ProjectEvent('ProjectEvent.DATA_EVENT',{data1:data1, data2:data2}));

and slap another function to pick it up

public
function initController(eventrojectEvent):void

{
data1 = event.params.data1;

};

That's it, centralised event management with variables. She's good to go.

Πες μου αν είναι να το βγάλω. Το rar όμως που έχουν επισυνάψει είναι άδειο και δεν μπορώ να το δω στην πράξη.

Γνωρίζεις εσύ κάτι γι'αυτή την προσέγγιση;

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 14:26

Λοιπόν δημιούρησα μία μεταβλητή στην κλάση μου what και στην clickHandler έκανα:

what=(event.currentTarget as MovieClip).whatToLoad;


Οπότε μετά στην finishedHandler έκανα

private function finishedHandler(event:Event):void
{

loadSection(what);
}

και λειτούργησε. Τώρα βέβαια έχω πρόβλημα στο unload θα το κοιτάξω όμως και αν χρειαστώ κάτι θα πω.

mgiota
Δημοσιεύσεις: 190
Εγγραφή: 15 Σεπ 2009 13:11
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από mgiota » 30 Απρ 2010 14:37

οκ λειτούργησαν όλα μια χαρά.

σ'ευχαριστώ πολύ για τη βοήθεια!

βέβαια τώρα έχω ένα άλλο πρόβλημα. Όταν πατάω ένα κουμπί στον clickHandler έχω τον εξής κώδικα event.target.gotoAndStop(1); που στην ουσία πηγαίνει το MovieClip στην κατάσταση που είναι πατημένο.

Όταν πατάω όμως ένα άλλο κουμπί παραμένει και το προηγούμενο πατημένο. Λογικό αφού δεν έχω ενσωματώσει ακόμα κάτι στον κώδικα.

Θα πρέπει να χρησιμοποιήσω κάποια μεταβλητή που να λέει ποιο movieclip είναι πατημένο;

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

check the current frame of a movieclip

Δημοσίευση από HeRu » 30 Απρ 2010 15:14

Ναι μπορείς να το κάνεις και έτσι ή εναλλακτικά μπορείς να τα κάνεις όλα reset και να βάζεις μετά το πατημένο button.

Απάντηση

Επιστροφή στο “Flash γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες