1. Το event-driven µοντέλο



Σχετικά έγγραφα
Φάλουν Ντάφα ιαλέξεις πάνω στον Νόµο του Φο ιαλέξεις στις Ηνωµένες Πολιτείες

Ο Στρατηγικός Ρόλος της Αστυνοµίας στις Σύγχρονες Απαιτήσεις της Ελληνικής Κοινωνίας

ΠΛΑΤΩΝΑΣ. 427 π.χ π.χ.

Η ΦΙΛΙΑ..!!! Η ΑΞΙΑ ΤΗΣ ΦΙΛΙΑΣ

Εισαγωγή: ακαδηµαϊκά αδικήµατα και κυρώσεις

Πού βρίσκεται ο Τάφος του Αλεξάνδρου; Μυαλό χρειάζεται για ν' αποκαλυφθεί. και όχι φτυάρια.

Τα 10 µαργαριτάρια για ένα φιλικό σπίτι

Αντωνία Αθανασοπούλου


Απλές λύσεις για άµεση έξοδο από την κρίση. Μέσα σε λίγες ηµέρες µπορεί να σωθεί η Ελλάδα. Αρκεί να ξυπνήσουν οι Έλληνες και να δουν τι συµβαίνει.

Ευρετήριο πινάκων. Ασκήσεις και υπομνήματα

ΓΙΩΡΓΟΣ ΜΠΛΑΝΑΣ ΓΙΑ ΤΟΝ ΑΝΑΡΧΙΣΜΟ

ΠΡΟΒΛΗΜΑΤΑ ΤΗΣ ΔΗΜΟΣΙΑΣ ΖΩΗΣ, ΜΙΑ ΨΥΧΑΝΑΛΥΤΙΚΗ ΠΡΟΣΕΓΓΙΣΗ

Το σύμπαν μέσα στο οποίο αναδύεστε

ΥΠΟΣΤΗΡΙΞΗ ΑΝΑΣΚΑΦΙΚΟΥ ΕΡΓΟΥ

-*- SPORΤDAY. 2 3 ο Η επόµενη µέρα της ΑΕΚ και του Ντέµη

ΟΜΙΛΙΑ ΠΡΩΘΥΠΟΥΡΓΟΥ ΚΑΙ ΠΡΟΕ ΡΟΥ ΤΟΥ ΠΑΣΟΚ ΓΙΩΡΓΟΥ ΠΑΠΑΝ ΡΕΟΥ. ΣΤΗΝ 11η ΣΥΝΟ Ο ΤΟΥ ΕΘΝΙΚΟΥ ΣΥΜΒΟΥΛΙΟΥ ΤΟΥ ΚΙΝΗΜΑΤΟΣ

ΕΝΑΛΛΑΚΤΙΚΑ ΚΑΥΣΙΜΑ. του κ.θανάση Κουτίνα, χηµικού, καθηγητή Πανεπιστηµίου Πατρών

ΕΛΕΥΘΕΡΟΤΥΠΙΑ - 15/10/2005. Η Αλκη Ζέη για την ιδώ Σωτηρίου: Η θεία µου η ιδώ αγαπηµένη των Τούρκων

περισσότερο από το γεγονός του ότι αυτό δεν ήταν τότε ένα ζήτηµα έγκρισης του ίδιου του κοινοβουλευτισµού αλλά κριτικής στην αστική εξουσία.

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ για το εκπαιδευτικό σενάριο: ΕΚΛΕΙΨΕΙΣ

ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΠΕΡΙΦΕΡΕΙΑ ΣΤΕΡΕΑΣ ΕΛΛΑ ΑΣ ΓΡΑΦΕΙΟ ΠΕΡΙΦΕΡΕΙΑΡΧΗ ΥΨΗΛΑΝΤΗ ΛΑΜΙΑ. Λαµία ΠΡΟΣ: Μ.Μ.Ε.

ΜΗΝΙΑΙΟ ΕΛΤΙΟ ΙΟΥΝΙΟΥ 2007

«ΣΒΒΕ Eurobank βιοµηχανία 2020: Περιφερειακή ανάπτυξη, καινοτοµία και εξωστρέφεια». Αρχική Τοποθέτηση επί της Εισήγησης

Βιβλιοπαρουσίαση: Χτίζοντας ένα δηµοκρατικό και ανθρώπινο σχολείο

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΙΟΙΚΗΣΗΣ ΟΙΚΟΝΟΜΙΑΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

«Το στίγµα του Εφιάλτη»

2. Γιατί η Υπέρυθρη Θέρµανση είναι ο πλέον φυσικός και υγιεινός τρόπος θέρµανσης;

ΠΡΟΣΛΗΨΕΙΣ ΚΑΙ ΕΙΚΟΝΕΣ ΤΗΣ ΕΛΛΑΔΑΣ

ΓΥΝΑΙΚΕΙΟΙ ΑΓΡΟΤΟΥΡΙΣΤΙΚΟΙ ΣΥΝΕΤΑΙΡΙΣΜΟΙ ΣΤΗΝ ΕΛΛΑ Α

Απώλεια και μετασχηματισμοί της τραυματικής εμπειρίας. Παντελής Παπαδόπουλος

Το σημερινό κραχ... η τελευταία ευκαιρία της ανθρωπότητας

Συνωμοσία Πυρήνων της Φωτιάς - Πυρήνας Αντάρτικου Πόλης

5 η Ενότητα Κουλτούρα και στρατηγική

O ΙΕΡΟΚΛΗΣ ΚΑΙ ΤΟ ΘΕΑΡΧΙΚΟ ΣΩΜΑ ΣΤΟΝ ΣΤΡΑΤΕΙΟ ΧΩΡΟ

ΚΕΦΑΛΑΙΟ 3 ο ΤΟ ΜΕΛΛΟΝ ΤΗΣ ΕΥΡΩΠΑΪΚΗΣ ΕΝΩΣΗΣ. 3.1 Εισαγωγή

Κρύων της Μαγνητικής Υπηρεσίας. Πνευματική Ανατομική. Μάθημα 3ο ~ Εργασία με το Κόλον

Σηµειώσεις στις Εµπορικές Εταιρίες

Αφήγηση. Βασικά στοιχεία αφηγηµατικού κειµένου:

Σκοτεινές Ομάδες, Σέκτες, Τάγματα & Αδελφότητες. Συντάχθηκε απο τον/την Νεφέλη

ΘΕΜΑΤΑ ΚΑΝΟΝΙΣΜΩΝ ΒΙΒΛΙΟ ΠΕΡΙΠΤΩΣΕΩΝ ΠΕΡΙΕΧΟΜΕΝΑ

Ομιλία του Υφυπουργού Ανάπτυξης κου Θανάση Σκορδά στο CapitalVision 2012

Αναλυτικές οδηγίες διακοπής καπνίσματος βήμα προς βήμα

ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟΝ ΕΣΩΤΕΡΙΚΟ ΚΑΙ ΕΞΩΤΕΡΙΚΟ ΠΕΛΑΤΗ

Κατερίνα Παναγοπούλου: Δημιουργώντας κοινωνικό κεφάλαιο την εποχή της κρίσης

Η Ιστορία του Αγγελιοφόρου Όπως αποκαλύφθηκε στον Μάρσαλ Βιάν Σάμμερς στης 23 Μάιου 2011 στο Μπόλντερ, Κολοράντο, ΗΠΑ

*Ο ΠΑΠΠΟΥΣ ΡΟ ΑΛΟΣ ΚΑΙ Η ΜΑΓΙΚΗ ΣΥΝΤΑΓΗ


ΕΙΣΗΓΗΣΗ ΤΟΥ Δ.Σ. ΣΤΗ ΓΕΝΙΚΗ ΣΥΝΕΛΕΥΣΗ ΤΟΥ ΣΥΝΔΙΚΑΤΟΥ ΟΙΚΟΔΟΜΩΝ ΑΘΗΝΑΣ ΤΗΝ ΚΥΡΙΑΚΗ 25/10/2015

Συνηθισµένα λάθη στη χρήση της Γλώσσας

Οι 21 όροι του Λένιν

ΧΙΙΙ Επιτροπή Εκπαιδευτικής Υπηρεσίας

ΟΜΙΛΙΑ ΕΥΑΓ.ΜΠΑΣΙΑΚΟΥ, ΕΙΔΙΚΟΥ ΕΙΣΗΓΗΤΗ ΝΕΑΣ ΔΗΜΟΚΡΑΤΙΑΣ, ΚΑΤΑ ΤΗ ΣΥΖΗΤΗΣΗ ΣΤΗ ΒΟΥΛΗ ΤΟΥ ΚΡΑΤΙΚΟΥ ΠΡΟΥΠΟΛΟΓΙΣΜΟΥ

Δαλιάνη Δήμητρα Λίζας Δημήτρης Μπακομήτρου Ελευθερία Ντουφεξιάδης Βαγγέλης

AMEA_ENOTHTA_3 2/12/ :48 ÂÏ 1

Ηλεκτρικό φορτίο Ηλεκτρική δύναμη

Συµπεράσµατα από την ανάλυση συχνοτήτων στη Γεωµετρία Α Λυκείου. Για το 1 ο θέµα που αφορά τη θεωρία:

Ο αθλητισμός εμπνέεται από την ειρήνη. Η ειρήνη εμπνέεται από τον αθλητισμό.

Οι Ερασιτεχνικές Ασχολίες

ΤΜΗΜΑ ΛΟΓΙΣΤΙΚΗΣ ΚΑΙ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΗΣ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥ ΩΝ ΣΤΗΝ ΕΦΑΡΜΟΣΜΕΝΗ ΛΟΓΙΣΤΙΚΗ ΚΑΙ ΕΛΕΓΚΤΙΚΗ. ιπλωµατική Εργασία.

Παραμονή Παγκόσμιας Ημέρας Αντικαταναλωτισμού*, 28 Νοεμβρίου 2008

ΣΥΖΗΤΗΣΗ ΣΤΡΟΓΓΥΛΗΣ ΤΡΑΠΕΖΗΣ ΓΙΑ ΤΙΣ ΝΕΕΣ ΕΙ ΙΚΟΤΗΤΕΣ

Θερινά ΔΕΝ 2011 "ακολουθώντας τη ροή" - η ματιά μου

ΠΕΡΙΛΗΨΗ ΣΥΝΕ ΡΙΑΣΗΣ 23 ης /2010

ΑΙΓΛΗ 29 ΜΑΡΤΙΟΥ 2007

ΕΤΗΣΙΑ ΓΕΝΙΚΗ ΣΥΝΕΛΕΥΣΗ ΤΟΥ ΣΕΒ 13/05/2013. ΟΜΙΛΙΑ ΤΟΥ ΠΡΟΕ ΡΟΥ ΤΟΥ ΣΕΒ κ. ΗΜΗΤΡΗ ΑΣΚΑΛΟΠΟΥΛΟΥ ΣΤΗΝ ΑΠΟΓΕΥΜΑΤΙΝΗ ΕΚ ΗΛΩΣΗ

Πανελλαδικό Κάλεσµα για την Προοπτική Δηµιουργίας Αναρχικής Πολιτικής Οργάνωσης

ΑΤΟΜΙΚΗ ΕΡΓΑΣΙΑ: ΧΑΡΤΑΕΤΟΣ. 22/1/2012 4:16 μμ 11o Γυμνάσιο Λάρισας Βλαχοδήμου Ευπραξία

Υγρά και Εμφάνιση δοντιών (Π.Ε. ΧΑΤΖΗΑΛΕΞΑΝΔΡΟΥ)

Όμιλος Λογοτεχνίας. Δράκογλου Αναστασία, Κιννά Πασχαλίνα

Αναπαραστάσεις των φύλων στα παιδικά αναγνώσµατα του νηπιαγωγείου και του δηµοτικού σχολείου

ΣΥΖΗΤΗΣΗ ΝΟΜΟΣΧΕΔΙΟΥ ΥΠ.ΓΕΩΡΓΙΑΣ

Η εξέλιξη της επιστηµονικής σκέψης και του πειραµατισµού στην Ελληνιστική

Φλωρεντία, 10 Δεκεμβρίου 1513 Προς τον: ΦΡΑΓΚΙΣΚΟ ΒΕΤΤΟΡΙ, Πρέσβη της Φλωρεντίας στην Αγία Παπική Έδρα, Ρώμη. Εξοχώτατε Πρέσβη,

ΕΠΙΧΕΙΡΗΣΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΕΡΩΤΗΜΑΤΟΛΟΓΙΟ Η ΤΗΝΟΣ ΠΟΥ ΘΕΛΟΥΜΕ

Το ολοκαύτωμα της Κάσου

Έκθεση της Επιτροπής Κοινωνικής Πρόνοιας της Βουλής των Γερόντων για το. θέµα «Η οικονοµική κρίση, εξάλειψη της φτώχειας και κοινωνικός.

Οι ιοί και οι ιογενείς λοιμώξεις του αναπνευστικού συστήματος στα παιδιά

Ασφάλεια στις εργασίες κοπής μετάλλων

Σηµειώσεις στο ταξινοµούµε

ΚΕΦΑΛΑΙΟ 9 ΑΞΙΟΛΟΓΗΣΗ ΕΦΑΡΜΟΓΗΣ «ΕΝΑ ΟΝΕΙΡΙΚΟ ΤΑΞΙΔΙ ΣΤΗΝ ΚΝΩΣΟ» - ΠΕΡΙΓΡΑΦΗ ΔΙΑΔΙΚΑΣΙΑΣ ΚΑΙ ΑΝΑΛΥΣΗ ΑΠΟΤΕΛΕΣΜΑΤΩΝ

Να µαστε λοιπόν µε καφέ και τσιγάρα στης φίλης µου της Ρίτας,

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΝΑΥΠΗΓΩΝ ΜΗΧ/ΓΩΝ ΜΗΧΑΝΙΚΩΝ. ΘΕΜΑ: Προστασία µε επιµεταλλώσεις. Σκαβάρας Παναγιώτης

ΝΗΣΤΕΙΕΣ. Οι νηστείες, όπως αρχίζουν από την αρχή σχεδόν του χρόνου, είναι οι εξής: 1η: Από την ηµέρα των Χριστουγέννων µέχρι τις 4 Ιανουαρίου

ραστηριότητες για προθέρµανση

ΕΦΑΡΜΟΣΜΕΝΗ ΗΘΙΚΗ. Ενότητα 3: Το παράδειγμα της Τρέισι Λάτιμερ (συνέχεια) Παρούσης Μιχαήλ. Τμήμα Φιλοσοφίας

Το Ταξίδι Απελευθέρωσης

Σαιξπηρικά µοτίβα. Στάθης Λιβαθηνός, σκηνοθέτης, Εθνικό Θέατρο

Εργαστήριο Λόγου και Πολιτισµού του Πανεπιστηµίου Θεσσαλίας

Το πόνημα μου αυτό γράφτηκε σε στιγμές αγανάκτησης γι αυτά που συμβαίνουν στον τόπο μας.

προβλήματα, εγώ θέλω να είμαι συγκεκριμένος. Έχω μπροστά μου και σας την αναφέρω την

Η ΔΙΑΘΕΜΑΤΙΚΗ ΤΗΣ ΔΙΑΘΕΜΑΤΙΚΗΣ

Το Κάλεσμα του Αγγελιοφόρου

ΠΡΩΤΟ ΚΕΦΑΛΑΙΟ. Γενικές πληροφορίες Πού βρίσκομαι;

Βιοπολιτική: Μία Νέα Διάσταση της Έννοιας του Κέρδους

συνήλθε στην Αίθουσα των συνεδριάσεων του Βουλευτηρίου η Βουλή σε ολομέλεια για να συνεδριάσει υπό την προεδρία του Ε Αντιπροέδρου αυτής κ.

Μια «γριά» νέα. Εύα Παπώτη

Οι Πνευματικές Δυνάμεις στο Σύμπαν

ΕΛΕΥΘΕΡΟΤΥΠΙΑ - 12/05/2001. Στοιχεία της Γενικής Γραµµατείας Ισότητας από τα Κέντρα Υποδοχής. Πρωταθλητές οι µορφωµένοι στις κακοποιήσεις γυναικών

ΠΑΝΕΛΛΗΝΙΟ ΣΟΣΙΑΛΙΣΤΙΚΟ ΚΙΝΗΜΑ ΧΑΡ. ΤΡΙΚΟΥΠΗ ΑΘΗΝΑ ΓΡΑΦΕΙΟ ΤΥΠΟΥ TΗΛ. (210) FAX: (210) pressoffice1@pasok.

Transcript:

1. Το event-driven µοντέλο Στην αρχή της χρήσης των ηλεκτρονικών υπολογιστών, αυτοί είχαν κυρίως τον ρόλο εργαλείων που εκτελούσαν µια συγκεκριµένη εργασία. Ο υπολογιστής τροφοδοτείτο µε στοιχεία και ξεκινούσε µια λειτουργία (την εκτέλεση ενός αλγόριθµου) που συνεχιζόταν χωρίς διακοπή µέχρι την ολοκλήρωση (την εµφάνιση της απάντησης). Ήταν (και είναι) µια χρήσιµη λειτουργία που εξοικονοµούσε χρόνο και χρήµα. Ωστόσο, αυτός ο τρόπος χρήσης του υπολογιστή, µόνο µακρινή σχέση έχει µε τη σηµερινή πραγµατικότητα. Στο σύγχρονο περιβάλλον, ακολουθείται η event-driven [Flanagan, 2002 Sommerville, 2004] (πυροδοτούµενη από γεγονότα) προσέγγιση. Το σχήµα είναι απλό - και οικείο σε οποιονδήποτε χρήστη υπολογιστή: ο υπολογιστής "περιµένει" µέχρι ο χρήστης να κάνει "κάτι". Αυτό, µπορεί να είναι η κίνηση του ποντικιού, το πάτηµα ενός πλήκτρου, ή οποιαδήποτε άλλη χρήση συσκευής εισόδου (οθόνες αφής, συσκευές RFID κλπ.). Αν και το event-driven µοντέλο υποτίθεται ότι εµφανίζεται κυρίως στις πολυµεσικές εφαρµογές, στην πραγµατικότητα είναι διάχυτο παντού. Για παράδειγµα, ο επεξεργαστής κειµένου στον οποίο γράφω, περιµένει το πάτηµα ενός πλήκτρου, την επιλογή κάποιου µενού ή κάποια άλλη δική µου ενέργεια, για να ανταποκριθεί. ιαφορετικά δεν κάνει τίποτε 1 (εκτός κι αν κολλήσει µε πρωτοβουλία του, αλλά αυτό είναι άλλο ζήτηµα). Έτσι, έχει σταδιακά διαµορφωθεί µια µεθοδολογία, ακόµη (2005) σε κερµατισµένη µορφή, που χρησιµοποιεί όρους όπως events (γεγονότα), event-handlers ή callback functions (διαχειριστές γεγονότων), triggering (πυροδότηση), listener, κλπ. Σε ένα σύγχρονο περιβάλλον ανάπτυξης πολυµεσικών εφαρµογών για παράδειγµα, υπάρχουν έτοιµοι handlers για τη διαχείριση των πλέον συνηθισµένων ενεργειών ενός χρήστη. Σε ένα movie clip του Macromedia Flash, η διαχείριση της απελευθέρωσης του πλήκτρου του ποντικιού, γίνεται ως εξής (ο κώδικας που ακολουθεί τοποθετείται στο πρώτο frame ενός movieclip): this.onrelease = function () { trace ("mouse released") και το onrelease είναι ένας έτοιµος handler της γλώσσας του Flash (ActionScript). 1 Φυσικά, τα πράγµατα δεν είναι ακριβώς έτσι. Το λογισµικό, κάθε τέτοιο λογισµικό, "περιµένοντας" διατρέχει συνέχεια µε µεγάλη συχνότητα ένα "κύκλο δειγµατοληψίας" όλων των συσκευών εισόδου που µπορεί να εντοπίσει και τις ελέγχει. Η αίσθηση που έχουµε ότι ο υπολογιστής µας αποκρίνεται "αµέσως" µόλις σύρουµε το ποντίκι ή πιέσουµε κάτι, οφείλεται στην µεγάλη ταχύτητα της δειγµατοληψίας. Αν πιέσουµε ένα πλήκτρο, ο υπολογιστής το σηµειώνει στη φάση ελέγχου του πληκτρολογίου, αλλά το εκτελεί αργότερα, όταν ολοκληρωθεί ο κύκλος ελέγχου. Οι χρόνοι όµως είναι τόσο µικροί, που υπάρχει η αίσθηση της άµεσης ανταπόκρισης. Σελίδα 1 από 14

Αντίστοιχα callback functions (ή handlers, ή listeners στην Java και την ECMA-Script 4), συναντώνται σε όλα τα σύγχρονα περιβάλλοντα ανάπτυξης λογισµικού 2. Ο τρόπος αυτός θεώρησης του λογισµικού έχει διαδοθεί τόσο πολύ, που σε κάποιες περιπτώσεις, χάνεται ο κλασικός όρος "function", σε όφελος του όρου "handler" 3. Το event-driven µοντέλο, δηµιουργεί ένα πλαίσιο ασύγχρονης εκτέλεσης του κώδικα 4, και συνακόλουθα µια αντίληψη που θεωρεί τον κώδικα αποσπασµατικά. ηλαδή, οι άνθρωποι που αναπτύσσουν τέτοιο κώδικα, αναγκαστικά βλέπουν κάθε τµήµα σαν αυτόνοµη µονάδα, µε κίνδυνο - αν δεν έχουν µια πρόσληψη του συστήµατος που αναπτύσσουν - να γίνεται φανερή και να βιώνεται 5 αυτή η αποσπασµατικότητα από τους χρήστες του συστήµατός τους. Είναι λοιπόν σηµαντικό, ο προγραµµατιστής που σχεδιάζει ένα σύστηµα, να το αντιλαµβάνεται από την αρχή σαν τέτοιο και να παραµένει προσκολληµένος σ' αυτή την αντίληψη µέχρι τέλους. Έτσι, στο σχεδιασµό της διάδρασης, το event-driven µοντέλο χρησιµοποιείται περιλαµβάνοντας κάθε ενέργεια που θα µπορούσε να κάνει ο άνθρωπος - χρήστης αντιµετωπίζοντάς την σαν event, για το οποίο δυνητικά υπάρχει callback function. 2. Κάνοντας τα πάντα µε movieclips Η οντότητα που εξετάζουµε στην περίπτωση ανάπτυξης λογισµικού µε το Macromedia Flash, είναι το movieclip. εν ασχολούµαστε µε άλλες µορφές οντοτήτων που παρέχει το Flash, όπως είναι τα buttons και τα graphics. Η διακριτική αυτή αντιµετώπιση, γίνεται για τους παρακάτω λόγους [Moock, 2003 Lott, 2003 Webster et al, 2002]: Τα movieclips, δίνουν µια σαφή εικόνα - και έχουν όλα τα χαρακτηριστικά - των οντοτήτων του αντικειµενοστρεφούς προγραµµατισµού (objectness) Έχουν δυναµική συµπεριφορά (µπορεί δηλαδή η συµπεριφορά τους να αλλάζει ανάλογα µε τις ενέργειες του χρήστη) Μπορούν να παράγονται κατά βούληση και δυναµικά (δηλαδή µπορούµε, ανάλογα µε τις ενέργειες του χρήστη να δηµιουργήσουµε επί τόπου ένα movieclip µε όποια χαρακτηριστικά θέλουµε), σε αντίθεση µε τα buttons (που παράγονται µόνο στη διάρκεια του authoring (δηλαδή στο Flash κι όχι στο αρχείο swf) 2 Εδώ βέβαια, πρόκειται για αφαίρεση. Ο προγραµµατιστής - χρήστης αυτών των εργαλείων, δεν χρειάζεται να γράψει τις διαδικασίες κυκλικής δειγµατοληψίας των συσκευών εισόδου κάποιος άλλος (από την οµάδα ανάπτυξης του εργαλείου) τις έχει ήδη γράψει γι' αυτόν (πρβλ. υποσηµείωση 1). 3 H περίπτωση του Μacromedia Director. 4 Πρέπει να τονιστεί ότι η ασύγχρονη εκτέλεση, είναι απλώς µια θεώρηση στην πραγµατικότητα, σε όλα τα µοντέλα, και στον αντικειµενοστρεφή προγραµµατισµό, ισχύουν όλες οι βασικές έννοιες της δοµηµένης ανάλυσης, όπως "γραµµή εντολών", "δείκτης γραµµής εντολών", "στοίβα κλήσης", "είσοδος-έξοδος" κλπ. Και - τελικά - όταν φτάσουµε στον επεξεργαστή του υπολογιστή, οι εντολές εκτελούνται σειριακά (όποια γλώσσα και µέθοδο προγραµµατισµού κι αν χρησιµοποιήσουµε). 5 Είναι η αίσθηση δυσφορίας που δηµιουργεί στον χρήστη η ασαφής οργάνωση περιεχοµένου, ή ο ασαφής τρόπος διάδρασης Σελίδα 2 από 14

Από το Flash MX (Flash 6) και πέρα, όλα τα event handlers (listeners) που υπάρχουν σε ένα button, υπάρχουν επίσης και στα movieclips. Επιπλέον, επειδή τα movieclips µπορούν να δηµιουργούνται δυναµικά, είναι προφανές ότι µπορούµε να παράγουµε κουµπιά µε δυναµικό τρόπο. Είναι δυνατό και εύκολο να καταστραφούν δυναµικά (απελευθερώνοντας έτσι τους πόρους του υπολογιστή). Το βασικότερο: Τα movieclips µπορούν να µετατραπούν σε components, o µειώνοντας έτσι θεαµατικά τον αριθµό των movieclips που χρειάζεται να έχουµε σε ένα library του Flash και, o δηµιουργώντας classes επαναχρησιµοποιήσιµου κώδικα που µπορεί να παραµετροποιείται όσο θέλουµε. Εδώ θα πρέπει να επίσης να σηµειωθεί ότι, σε καµία περίπτωση - από το Flash MX και πέρα - δεν πρέπει να γράφουµε κώδικα πάνω στα αντικείµενα, αλλά µέσα τους (δηλ. σε κάποιο frame του movieclip). Μόνον έτσι διασφαλίζουµε ότι ο κώδικάς µας θα είναι επαναχρησιµοποιήσιµος. Γενικότερα, σήµερα (2005) αποτελεί γενικότερη εκτίµηση ότι η τακτική της γενικής χρήσης movieclips για την ανάπτυξη όλων των λειτουργιών σε µια εφαρµογή Flash, πάντα σε συνδυασµό µε τη χρήση callback handlers τοποθετηµένων στο timeline, µειώνει πολύ την αµφισηµία (ambiguity) στον κώδικα, και άρα µια κατηγορία λαθών που είναι ιδιαίτερα δύσκολο να εντοπιστούν (Καµέας, 2000), παρέχει ευελιξία και επιτρέπει την πληρέστερη κατανόηση και ευκολότερη συντήρησή του 6. Παράλληλα, η χρήση των movieclips ως components, επιτρέπει να χρησιµοποιηθεί το Flash σαν περιβάλλον R.A.D. (Rapid Application Development) για την ταχύτατη ανάπτυξη λογισµικού (agile development process) για το ιαδίκτυο (κι όχι µόνο). Τέλος, η τακτική αυτή επιτρέπει την ευκολότερη διασύνδεση του Flash µε άλλα περιβάλλοντα (όπως είναι το Macromedia Director, η PHP, η JavaScript και η Java), αφήνοντας έτσι ανοικτές διάφορες δυνατότητες, σε όποιο σύστηµα αναπτύσσεται κυρίως ή εν µέρει, σε Flash. 2.1 Κίνηση µε ActionScript (AS) ή κίνηση µε tweening; Επίσης, υπάρχει κι άλλο ένα σοβαρό πλεονέκτηµα στην επιµονή της χρήσης movieclips για όλες τις λειτουργίες η αποφυγή των προβληµάτων που δηµιουργούνται από τη χρήση των µεθόδων tweening για την αναπαράσταση της κίνησης. Τα προβλήµατα αυτά είναι τα εξής: Ο όγκος του αρχείου µεγαλώνει. Όταν κάνουµε export σε swf, το Flash δηµιουργεί µια σειρά από keyframes που επιβαρύνουν το αρχείο. Η επιβάρυνση αυτή µπορεί καταρχήν να είναι αµελητέα, αλλά γρήγορα µεγαλώνει. είτε τα αρχεία motion AS.swf (257 bytes) και motion tweening.swf (1.148 bytes). Στα αρχεία αυτά, παρουσιάζεται το ίδιο ακριβώς αποτέλεσµα, στο µεν πρώτο µε χρήση AS και στο δεύτερο µε motion tweening. Η διαφορά, µπορεί να είναι µικρή (περίπου 900 bytes), αλλά είναι 6 Ο αναγνώστης που ενδιαφέρεται να µάθει τα προβλήµατα που θα αντιµετωπίσει αν υιοθετήσει άλλη τακτική (και υπάρχουν πολλές τέτοιες), µπορεί να συµβουλευθεί το (Moock, 2002), κεφάλαια 10, 11, 12, 13. Σελίδα 3 από 14

επιβάρυνση 350% περίπου. Είναι εύκολα αντιληπτό, ότι µε µια εκτεταµένη χρήση motion tweening, καταλήγουµε µε αρχεία που (προς το παρόν) είναι µεγάλα για τον επισκέπτη µιας ιστοσελίδας. Ωστόσο, πρέπει να είναι κατανοητό ότι εξαιρετικά σύνθετες κινήσεις, αναπαριστώνται εύκολα µε την τεχνική motion tweening, ενώ η δηµιουργία τους µε AS απαιτεί γνώσεις (στοιχειώδεις έστω) Ευκλείδειας Γεωµετρίας, Τριγωνοµετρίας και Άλγεβρας. είτε την ενότητα "Εισαγωγή στα µαθηµατικά της κίνησης" για λεπτοµέρειες και σχετικά παραδείγµατα. εν είναι εύκολο να αναπαραχθούν "φυσικές" συµπεριφορές. Φαινόµενα όπως η τριβή, η βαρύτητα, η ελαστικότητα, η αναπήδηση, η έλξη κλπ. δεν µπορούν (τουλάχιστον µε εύκολο τρόπο) να αναπαρασταθούν µε motion tweening. Αντίθετα, η χρήση AS προσφέρει εύκολες λύσεις για την εξοµοίωση τέτοιων συµπεριφορών. Η προσεκτική χρήση AS κι ένα ισχυρό γνωστικό υπόβαθρο στο πεδίο της τρισδιάστατης απεικόνισης και κίνησης, µπορεί να προσφέρει στο Flash, µια τρισδιάστατη λειτουργικότητα, κάτι το οποίο δεν έχει προβλεφθεί από την ανάπτυξή του. 3. Events και movieclips Στα movieclips, µπορούν να αξιοποιηθούν τα παρακάτω events: Πίνακας 3.1 - Τα events που αντιλαµβάνονται τα movieclips Event handler ondata() ondragout() * ondragover() * onenterframe() onkeydown() Το event δηµιουργείται όταν: Το movieclip φορτώνει κάποιες µεταβλητές - π.χ. µέσω του method LoadVars() ή το µέρος ενός άλλου movieclip - π.χ. η εντολή loadmovie() είναι σε εξέλιξη Το ποντίκι πιέζεται επάνω στο movieclip και στη συνέχεια σύρεται έξω από αυτό, χωρίς να απελευθερωθεί Το ποντίκι πιέζεται επάνω στο movieclip, στη συνέχεια σύρεται έξω από αυτό, και µετά ξανά επάνω του Η κεφαλή στο timeline του movieclip, περνά σε ένα frame (ή έχει σταµατήσει στο ίδιο frame µε την εντολή stop(), αλλά το event συνεχίζει να δηµιουργείται, µε τη συχνότητα fps του movie µας) onkeyup() onkillfocus()* onload()* onmousedown() onmouseup() onmousemove() onpress()* onrelease() Το movieclip φορτώνεται µέσω των εντολών loadmovie, attachmovie Το ποντίκι πιέζεται οπουδήποτε επάνω στο Stage Το ποντίκι πιέζεται και στη συνέχεια απελευθερώνεται οπουδήποτε επάνω στο Stage Το ποντίκι κινείται οπουδήποτε επάνω στο Stage Το ποντίκι πιέζεται επάνω στο movieclip Το ποντίκι πιέζεται επάνω στο movieclip και στη συνέχεια απελευθερώνεται * εν ισχύει στο _root, παρά µόνον στα movieclips Σελίδα 4 από 14

onreleaseoutside()* onrollout()* onrollover()* Το ποντίκι πιέζεται επάνω στο movieclip, κινείται εκτός της περιοχής του και στη συνέχεια απελευθερώνεται Το ποντίκι εξέρχεται από την περιοχή του movieclip και το κουµπί του δεν είναι πιεσµένο Το ποντίκι εισέρχεται στην περιοχή του movieclip onsetfocus()* onunload() Το movieclip φορτώνεται µέσω των εντολών loadmovie, attachmovie, ξεφορτώνεται Ένας event handler, ανατίθεται σε ένα στα movieclip ως εξής (ο κώδικας στο πρώτο frame του movieclip): Ποια οντότητα θα ανταποκρίνεται στο event. Εδώ, η κωδική λέξη this δηλώνει ότι αυτό το ίδιο movieclip (κι όχι κάποιο άλλο) θα ανταποκρίνεται. Σε ποιό event θα υπάρχει ανταπόκριση. Εδώ, στο event onrelease Τι θα συµβεί όταν εντοπιστεί το event. Ορίζεται το "σώµα εντολών". Όλες οι εντολές στο σώµα θα εκτελεστούν διαδοχικά this.onrelease = function () { _root.redclip_mc._visible=1; gotoandplay(10); Σχήµα 3.1 - Ανάθεση ενός event handler (listener) Στο σχήµα 3.1, φαίνεται η µέθοδος ανάθεσης ενός event handler σε ένα movieclip. Στο παράδειγµα αυτό, όταν το ποντίκι πατηθεί επάνω στο movieclip και στη συνέχεια απελευθερωθεί επάνω στο movieclip (onrelease): 1. Ένα άλλο movieclip που βρίσκεται στο _root και ονοµάζεται redclip_mc θα εµφανιστεί 2. Η κεφαλή του movieclip που έδωσε την εντολή, θα µετακινηθεί στο frame 10. Σελίδα 5 από 14

this.onpress = function () { gotoandplay("pressframe"); this.onrelease = function () { gotoandplay(10); this.onrollover = function () { gotoandplay("rolloverframe"); this.onrollout = function () { gotoandplay("normalframe"); this.hitarea = this.blueclip; stop(); Σχήµα 3.2 - Ένα movieclip µε λειτουργικότητα button (callback function) Αναθέτοντας events handlers και χρησιµοποιώντας properties των movieclips, µπορούµε να αναπαράξουµε όλες τις λειτουργίες ενός button, διατηρώντας ταυτόχρονα όλα τα πλεονεκτήµατα του movieclip. Στο σχήµα 3.2 φαίνεται η διαδικασία που ακολουθούµε (προφανώς υπάρχουν κι άλλες πιο σύνθετες και ενδιαφέρουσες διαδικασίες). Ο κώδικας αυτός, εισάγεται στο πρώτο frame του movieclip που θέλουµε να λειτουργεί σαν button. Εύκολα διαπιστώνεται ότι αν αναθέσουµε έναν callback handler για το event onrelease, η λειτουργικότητα πρακτικά είναι η ίδια µε το αν γράφαµε (όχι µέσα το movieclip αλλά πάνω του) το εξής: on (release) { gotoandplay(10); Σχήµα 3.3 - Ένα movieclip µε λειτουργικότητα button (clip event) Ωστόσο, στην τακτική που φαίνεται στο σχήµα 3.3, υπάρχει ένα πρόβληµα: τι συµβαίνει στην - όχι απίθανη - περίπτωση που, όταν ο χρήστης πατήσει για πρώτη φορά το κουµπί θέλουµε να πυροδοτηθεί µια λειτουργία και το κουµπί να δείχνει από κει και πέρα ότι έχει ήδη χρησιµοποιηθεί; ηλαδή, κάτι σαν την κατάσταση visited των hyperlinks, όπου τα URLs που ήδη έχουµε επισκεφθεί αλλάζουν χρώµα; Η σύνταξη που χρησιµοποιείται στο σχήµα 3.2 (callback) µας επιτρέπει να το επιτύχουµε άµεσα. Αντίθετα, η σύνταξη του σχήµατος 3.3 δεν επιτρέπει κάτι τέτοιο 7. Ή, τι θα συνέβαινε αν θέλαµε το κουµπί µας να λειτουργεί την πρώτη φορά έτσι και την δεύτερη αλλιώς; Κι επίσης, τι θα κάνουµε στο εξής (πολύ συνηθισµένο) σενάριο: 7 Θα µπορούσε βέβαια να γίνει µε αλλαγές τιµών σε εξωτερικές µεταβλητές, και τη χρήση if's σε κάθε ClipEvent, αλλά αυτό θα σήµαινε αυξανόµενη πολυπλοκότητα του κώδικα και δηµιουργία συζεύξεων σφραγίδας µεταξύ των οντοτήτων πιο απλά: ένα λάθος, θα µπορούσε να προκαλέσει µια "χιονοστιβάδα" σφαλµάτων (διαδικασία γνωστή σαν ripple effect). Όσο αυξάνεται ο διαµοιρασµός µεταβλητών µεταξύ των οντοτήτων τόσο περισσότερο (µε εκθετική µορφή) αυξάνεται η πιθανότητα ενός ripple effect. Σελίδα 6 από 14

Έχουµε ένα movie (αρχείo swf), έχει 5 keyframes και καθένα από αυτά περιέχει 10 κουµπιά. Όλα λειτουργούν καλά, αλλά ξαφνικά θυµόµαστε ότι πρέπει, όταν καλείται το event onrollover, να ακούγεται ένας ήχος. Η λύση, αν ο κώδικάς µας είναι πάνω στα movieclips (ή αν έχουµε χρησιµοποιήσει buttons οπότε υποχρεωτικά ο κώδικας θα είναι επάνω κι όχι µέσα) είναι να πάµε σε ένα προς ένα τα κουµπιά και να προσθέσουµε τον κώδικα που καλεί τον ήχο (δηλ. σε 5*10=50 κουµπιά). Αν όµως, έχουµε δηµιουργήσει ένα component, θα αλλάξουµε το component στο library µόνο µια φορά, και η αλλαγή απευθείας θα απεικονιστεί σε κάθε instance του (δηλ. και στα 50 movieclips που χρησιµοποιούµε σαν κουµπιά). Ας δούµε προσεκτικά το σχήµα 3.4: this.onrelease = function () { _parent.red.gotoandplay(10); this.onrelease = function () { _parent.gotoandplay(20); Σχήµα 3.4 - Ένας handler, αλλάζει τη λειτουργία του Παρατηρείστε ότι, µια και η ανάθεση callback handlers γίνεται µε τον τελεστή "=", οποιαδήποτε στιγµή µπορεί να γίνει νέα ανάθεση, αλλάζοντας έτσι επί τόπου τη λειτουργία του κουµπιού. Παρακάτω, θα δούµε αυτήν ακριβώς τη λειτουργία, σε µια βελτιωµένη έκδοση του κώδικα του σχήµατος 3.2: Σελίδα 7 από 14

this.onrollover = function () { gotoandplay("rollover"); } ------------------------------------- this.onrollout = function () { gotoandplay("normal"); } ------------------------------------- this.onpress = function () { gotoandplay("press"); _parent.red.dance(); } ------------------------------------- this.onrelease = function () { _parent.red.stopdancing(); this.onrollout = function () { gotoandplay("normal2"); } this.onrollover(); } ------------------------------------- this.ondragout=function () { this.onrelease(); this.onrollout(); } ------------------------------------- stop(); Σχήµα 3.5 - Ένα movieclip µε πλήρη λειτουργικότητα button και µνήµη Τι συµβαίνει εδώ; Όσο το κουµπί µας δεν έχει πατηθεί, όταν ο κέρσορας πάει επάνω του, και µετά αποσυρθεί (event onrollout) εµφανίζεται το frame "normal". Από τη στιγµή που θα πατηθεί το κουµπί, η διαχείριση του onrollout αλλάζει, και πλέον όταν συµβαίνει το onrollout, εµφανίζεται το frame "normal2". είτε το αρχείο "memory button.fla", για µια επίδειξη αυτού ακριβώς του κώδικα. Τι είναι όµως, τελικά ένα movieclip; Καθαρά, ένα movieclip είναι ένα object. Συχνά επισηµαίνεται ότι, αν και το movieclip µοιάζει πολύ µε ένα object, τελικά δεν είναι γιατί δεν µπορεί να δηµιουργηθεί ένα νέο movieclip κατευθείαν στο Stage, µε χρήση του constructor (new MovieClip()). Αυτό είναι αληθές, ωστόσο, µπορεί να δηµιουργηθεί ένα movieclip στο Stage (και χωρίς να προϋπάρχει στο Library) µε την εντολή createemptymovieclip() που κάνει ό,τι θα έκανε κι ο constructor "new()". Έτσι η εκτίµηση ότι το movieclip δεν είναι πράγµατι object, είναι µάλλον θέµα ακαδηµαϊκών διαφωνιών ανάµεσα στους ειδικούς του αντικειµενοστρεφούς προγραµµατισµού, παρά ουσιαστικό ζήτηµα 8. Ούτως ή άλλως, ότι κι αν υποστηρίζει ο καθένας, όλοι παραδέχονται ότι µεταχειρίζονται (κι άρα προσλαµβάνουν) τα movieclips σαν objects [Moock, 2002]. Και, η αντικειµενοστρεφής ανάλυση, αφορά ένα τρόπο πρόσληψης του συστήµατος και τη διασφάλιση συγκεκριµένων λειτουργιών και χαρακτηριστικών, κι όχι τη χρήση συγκεκριµένου λεξιλογίου. Το movieclip, ανταποκρίνεται σ' αυτές τις λειτουργίες κι έχει τα απαιτούµενα χαρακτηριστικά 9. 8 Η διαφωνία τελικά εντοπίζεται στο αν χρησιµοποιείται η κωδική λέξη new ή όχι. 9 Τα χαρακτηριστικά αυτά είναι Σελίδα 8 από 14

Όπως κάθε object, το movieclip διαθέτει ιδιότητες (properties) και µεθόδους (methods). Τα properties, εµφανίζονται στον πίνακα 3.2: Πίνακας 3.2 - Τα properties των movieclips property Τι είναι Πεδίο τιµών Τύπος RW _alpha _currentframe _droptarget Το ποσοστό διαφάνειας του movieclip (και όλων των περιεχοµένων του) Το frame του movieclip στο οποίο βρίσκεται η κεφαλή Το _target path επάνω στο οποίο ένα συρόµενο movieclip βρίσκεται ή έχει αφεθεί Αρχική τιµή (default) 0-100 number RW 100 1- number RO enabled 0-1 Boolean RW 1 string focusenabled 0-1 Boolean RW _focusrect 0-1 Boolean RW _framesloaded Ο αριθµός των frames που έχουν φορτωθεί (ανακτηθεί) RO 1- number RO _height Το ύψος του movieclip σε pixels 0- number RW hitarea _name _parent Η ενεργή περιοχή ενός movieclip που λειτουργεί σαν button Το όνοµα (identifier) ενός movieclip που βρίσκεται στο timeline Αναφορά (reference) στο movieclip που περιέχει το movieclip µας string string MovieClip reference RW RW RO Το ύψος των ορατών περιεχοµένων του clip (µαζί µε τις µεταξύ τους αποστάσεις) Όλα τα ορατά περιεχόµενα του clip _rotation Η περιστροφή του movieclip, σε µοίρες 0-360 number RW 0 tabchildren tabenabled tabindex _target _totalframes Το σύνολο των frames στο timeline 1-.. number RO trackasmenu _url usehandcursor _visible _width Αλλάζει τις συνθήκες υπό τις οποίες ένα movieclip δέχεται το event onrelease Θέση στο δίσκο του υπολογιστή ή στο δίκτυο, που βρίσκεται το αρχείο.swf Αν ο κέρσορας θα γίνεται "χεράκι", σε movieclip που λειτουργεί σαν button Αν το movieclip είναι ορατό (αν δεν είναι, δεν εκτελείται και η actionscript που περιέχει) Το πλάτος των ορατών περιεχοµένων του clip (µαζί µε τις µεταξύ τους αποστάσεις) 0-1 Boolean RW 1 string RO 0-1 Boolean RW 1 0-1 Boolean RW 1 0- number RW Σελίδα 9 από 14

_x _xmouse _xscale _y _ymouse _yscale Η οριζόντια θέση του clip, µε σηµείο 0 το πάνω αριστερό άκρο του _parent του Η οριζόντια θέση του mouse, µε σηµείο 0 το πάνω αριστερό άκρο του clip Το ποσοστό οριζόντιας µεγέθυνσης του movieclip Η κάθετη θέση του clip, µε σηµείο 0 το πάνω αριστερό άκρο του _parent του Η κάθετη θέση του mouse, µε σηµείο 0 το πάνω αριστερό άκρο του clip Το ποσοστό κάθετης µεγέθυνσης του movieclip -n +n number RW -n +n number RO -n +n number RW 100 -n +n number RW -n +n number RO -n +n number RW 100 4. Η επικοινωνία µεταξύ των movieclips 4.1 Παιδιά, γονείς, αδέλφια Πρέπει από την αρχή να είναι κατανοητό, ότι ένα movieclip ανήκει πάντα σε µια οµάδα. Η οµάδα αυτή, είναι το movieclip µέσα στο οποίο περιέχεται. Ο τρόπος αυτός επικοινωνίας, φαίνεται στην εικόνα 4.1: Κάθε movieclip, έχει µια ταυτότητα, που είναι - ας πούµε - το όνοµα της οικογένειάς του. Σύµφωνα µε την τυποποίηση της Macromedia, το movieclip - ρίζα, το βασικό δηλαδή movieclip, που είναι απλώς το movie µας, (µπορούµε να το σκεφτόµαστε σαν "scene 1" ή σαν main timeline), ονοµάζεται _root. Οποιοδήποτε movieclip στείλει µια εντολή στο βασικό µας movie, µπορεί να το κάνει λέγοντας π.χ. : _root.gotoandplay(40); Αν λοιπόν το movieclip που ονοµάζεται clip2_mc θελήσει να Εικόνα 4.1 - Επικοινωνία µεταξύ των movieclips στείλει αυτή την εντολή στο main Τα movieclips, επικοινωνούν µεταξύ τους χρησιµοποιώντας τα ονόµατα που έχουν στο stage και προθέτουν το όνοµα της οµάδας timeline, το κάνει όπως ήδη του movieclip - στόχου δείξαµε. Εναλλακτικά τώρα, επειδή το main timeline περιέχει µέσα του το clip2_mc, κι άρα θεωρείται γονιός του clip2_mc, το τελευταίο, µπορεί να το αποκαλέσει και _parent, λέγοντας π.χ.: _parent.gotoandplay(40); Σελίδα 10 από 14

Το αποτέλεσµα είναι ακριβώς το ίδιο µε την προηγούµενη εντολή. Ωστόσο, το (κίτρινο στην εικόνα 4.1) movieclip που λέγεται clip1_mc και περιέχεται µέσα στο clip2_mc, λέγοντας _parent, προσδιορίζει το clip2_mc, γιατί, στο timeline του clip2_mc περιέχεται κι όχι στο main timeline. Η µεταφορά ενός γενεαλογικού δέντρου, είναι κυριολεκτικά εξόφθαλµη: Το _root, είναι _parent του clip2_mc και _parent._parent του κίτρινου clip1_mc (_parent._parent=παππούς!). Άρα, για να στείλει το κίτρινο movieclip την εντολή που προαναφέραµε, πρέπει να πει: _parent._parent.gotoandplay(40); Εικόνα 4.2 - Αυτόµατη εισαγωγή relative path και, πάντα βέβαια, µπορεί απλούστερα να πει: _root.gotoandplay(40); Στην εικόνα 4.1, φαίνονται δυο movieclips, που έχουν το ίδιο όνοµα: Το ροζ clip1_mc και το κίτρινο clip1_mc. Αυτό, έτσι όπως έχει γίνει, δεν δηµιουργεί πρόβληµα διάκρισης µεταξύ τους. Θυµηθείτε ότι, σηµασία έχει όχι µόνο πως λέγεσαι, αλλά και ποιος είναι ο γονιός σου (αυτό κάνουµε και στην αστυνοµική µας ταυτότητα). Η περίπτωση της συνωνυµίας λύνεται µε αναφορά στο πατρώνυµο, µητρώνυµο κλπ. Κάποιος π.χ. ονοµάζεται ηµήτρης Γεωργιάδης του Αποστόλου κι ο άλλος ηµήτρης Γεωργιάδης του Νικολάου. Στο Flash, ο κανόνας που πρέπει να θυµάστε σχετικά µε την ονοµατοδοσία των movieclips (και στην πραγµατικότητα µιλάµε για τα instances των movieclips, τα ίδια τα movieclips κάθονται ήσυχα µέσα στο library) είναι ότι σε καµιά περίπτωση δεν πρέπει δυο αδέλφια να έχουν το ίδιο όνοµα. Αδέλφια, προφανώς, είναι τα δυο ροζ movieclips Εικόνα 4.3 - Αυτόµατη εισαγωγή absolute path (clip1_mc και clip2_mc) γιατί ανήκουν στο ίδιο timeline. Αν παραβιάσετε αυτόν τον κανόνα, και ονοµάσετε δυο movieclips µε το ίδιο όνοµα, τότε στέλνοντας µια εντολή σε οποιοδήποτε από αυτά, θα ανταποκρίνεται πάντα, µόνο το ένα: αυτό που βρίσκεται σε χαµηλότερο layer. Αν και τα δυο είναι (κακώς) µέσα στο ίδιο layer, θα ανταποκρίνεται πάντα αυτό που τοποθετήθηκε πρώτο. Έτσι λοιπόν, το όνοµα κάθε movieclip, αποτελεί την µοναδική ταυτότητά του (και είδαµε τα προβλήµατα όταν δεν φροντίζουµε η ταυτότητα αυτή να είναι µοναδική). Η ταυτότητα αυτή, στο Flash λέγεται το path του movieclip. Η εισαγωγή του ορθού path, µπορεί να γίνει γρήγορα περίπλοκη υπόθεση. Όσο αυξάνει ο αριθµός των movieclips, τόσο περισσότερο δύσκολο γίνεται. Στην εικόνα 4.2, βλέπουµε ότι το Flash, προσφέρει ένα εργαλείο (αυτό που φαίνεται σαν στόχος στο παράθυρο actions) που βοηθάει στη δηµιουργία του σωστού path. Η εικόνα 4.2 δείχνει πως βρίσκουµε το Σελίδα 11 από 14

relative path, το path δηλαδή προς το movieclip - στόχο: είναι το path, που προσδιορίζει το movieclip - στόχο, σε σχέση µε το timeline του movieclip µέσα στο οποίο βάζουµε τον κώδικα. Προσέξτε ότι έχει επιλεγεί η ρύθµιση "Relative". Το ίδιο εργαλείο, στη εικόνα 4.3, χρησιµοποιείται για το ίδιο movieclip - στόχο, αλλά µε τη ρύθµιση Absolute, που δίνει το path ενός movieclip πάντα σε σχέση µε το _root. Προκύπτει το ερώτηµα: ποιος τρόπος προσδιορισµού path είναι καλύτερος; Απάντηση: εν υπάρχει καλύτερος και χειρότερος τρόπος. Συνήθως, όταν αναφερόµαστε σε movieclips που δηµιουργήθηκαν δυναµικά 10 (µε την εντολή attachmovie(), createemptymovieclip() ή duplicatemovieclip()), χρησιµοποιούµε relative paths. Όταν αναφερόµαστε σε movieclips που τοποθετήθηκαν στο Stage κατά τη διάρκεια του authoring, χρησιµοποιούµε είτε absolute είτε relative. Ωστόσο, δεν υπάρχει δέσµευση εδώ, και ο καλύτερος τρόπος, εξαρτάται από τον προγραµµατιστή κι είναι ο τρόπος που τον κάνει να δουλεύει ταχύτερα και µε όσο το δυνατόν λιγότερα λάθη. Τέλος, πρέπει να σηµειωθεί το εξής: Αν στείλουµε εντολή σε λάθος path, το Flash δεν θα µας προειδοποιήσει κι ούτε θα σταµατήσει να λειτουργεί (αν µπορεί). Άρα, δεν υπάρχει κάποιος έτοιµος διαχειριστής λαθών γι' αυτά τα λάθη, κι όταν διαπιστώσουµε ότι κάτι δεν δουλεύει, θα πρέπει µόνοι µας να ανακαλύψουµε το λάθος. Τα πιο συχνά λάθη είναι, να χρησιµοποιούµε λάθος όνοµα movieclip (το "one_mc" και το "one_mc " είναι διαφορετικά), ή να χρησιµοποιούµε λάθος path (κι είδαµε ήδη πως µπορούµε - µέχρι ένα µόνο σηµείο - να αποφύγουµε κάτι τέτοιο). 4.2 Ιδιότητες, methods και αναφορές σ' αυτά Όπως φαίνεται στον πίνακα 3.2, κάθε movieclip, έχει µια σειρά από properties (ιδιότητες). Οι ιδιότητες αυτές, κληρονοµούνται σε κάθε movieclip, από το MovieClip class του Flash. ηλαδή, υπάρχει στο Flash, ένα έτοιµο σχέδιο ας πούµε, που δείχνει πώς πρέπει να είναι ένα movieclip. Όταν λοιπόν δηµιουργούµε ένα νέο movieclip µε την λειτουργία "Convert to symbol", ή την λειτουργία "Create new symbol", το Flash παράγει ένα instance (εδώ µιλάµε για ταmovieclips που βρίσκονται στο library) του βασικού πρωτότυπου MovieClip class που βρίσκεται αποθηκευµένο µέσα του (στο Flash). Έτσι, ένα movieclip, µε τη γέννησή του, έχει ένα προκαθορισµένο σύνολο properties (ιδιοτήτων) και ένα προκαθορισµένο σύνολο methods (µεθόδων). Τόσο τα properties όσο και τα methods ενός movieclip, µπορούν να εµπλουτιστούν. Πρέπει όµως να πρώτα, να διευκρινίσουµε την υπόστασή τους, για να µπορέσουµε να δηµιουργήσουµε νέα: Τα properties είναι απλώς µεταβλητές, και τα methods, είναι απλώς functions. Στο σχήµα 4.1, φαίνεται ένα movieclip µε κληρονοµηµένα αλλά και επίκτητα properties και methods. Τo property _rotation, είναι κληρονοµηµένο. Το property turning, έχει οριστεί (var turning=0;) αυθαίρετα, και άρα είναι επίκτητο. Tα methods onenterframe() (event handler) και stop(), είναι κληρονοµηµένα. Τα methods startturning() και stopturning() είναι επίκτητα. 10 ηλαδή δηµιουργήθηκαν µε κώδικα. Αλλιώς: δηµιουργήθηκαν µέσα στον Flash Player κι όχι στο Flash Authoring Tool. Σελίδα 12 από 14

var turning=0; this.onenterframe = function () { if (turning) { this._rotation+=1; } this.startturning=function () { turning=1; this.stopturning=function () { stop(); turning=0; Σχήµα 4.1 - Ένα movieclip µε custom properties και methods Overwriting methods and props Εικόνα 4.4 - Αναφορές σε properties και methods των movieclips 4.3 This - αυτοπροσδιορισµός Σελίδα 13 από 14

5. Το depth του movieclip Place code on the frame: http:www.macromedia.com/go/tn_19005 Scenes, do not use them http:www.macromedia.com/go/tn_15703 Using scenes crashes the player http:www.flashmove.com/forum/showthread.php?t=12031 Βιβλιογραφία Moock Colin, 2003, ActionScript for Flash MX - The Definitive Guide, O' Reilly Καµέας Αχιλλέας, 2000, Τεχνικές Προγραµµατισµού, Ε.Α.Π. Sommerville Ian, 2004, Software Engineering 7 th Edition, Addison Wesley Moock Colin, 2004, Essential ActionScript 2, O' Reilly Lott Joey, 2003, ActionScript Cookbook, O' Reilly Webster, Rice, Sutherland et al, 2002, Advanced PHP for Flash, Friends of Ed Σελίδα 14 από 14