March 14, 2006

?האמנם,as3-נעדר ב OnReleaseOutside

הפתעות לא חסרות. תוך כדי פיתוח אתה או את (נכון... גם בחורות מפתחות) נתקלים בכל מיני מכשולים קלים עד לחומות מבטון מזוין, הגורמים לך לתהות אם באמת בחרת את המקצוע הנכון.
כך גם הפעם, כשאני כולי ערוך ומוכן לבצע את אחד הדברים היותר בסיסיים בתכנות מונחה אירועים (נקראר לזה, לצורך העניין). אובייקטים יכולים להאזין לאירועים שנזרקים מפעולות אינטרקטיביות איתם, כמו למשל – click (אם נפסיק לרגע לשגול בשכל ונקרא לעכבר בשמו). יש די הרבה אירועים שכאלה בכל שפת תכנות, ולאחרונה אפילו נוספו עוד כמה ל-as3. זה לא העניין...
יש איזה אירוע שנקרא onReleaseOutside שבקצרה עונה על הסנאריו הבא: הקלקת על אובייקט, יצאת ממנו בעודך לוחץ ושחררת הקלקה. כמובן שב-as3 החליטו שהדרך הפשוטה שבה כתבנו את האזנה לאירוע הזה לא יעילה יותר והחליטו לסבך מעט את העניינים – ייתכן מאוד שהשורה הראשונה בשאיפה אל עבר ECMA-4 היא "ככל שיותר מסובך, כך יותר שפת-על".
אז בכדי לחסוך לכם את הזמן שאני ביליתי בחיפוש אחר הדרך להשגת אותו אפקט, הא לכם קוד:



protected function init ():void {
var my_shape:Shape = new Shape();
graphics.beginFill (0x0000FF, 100);
graphics.drawCircle (150, 150, 40);
// -----
this.addEventListener (MouseEvent.MOUSE_DOWN, onMouseDown);
this.addEventListener (MouseEvent.MOUSE_UP, onMouseUp);
}
protected function onMouseDown (event:MouseEvent):void {
event.target.setCapture ();
trace ("onMouseDown")
}
protected function onMouseUp (event:MouseEvent):void {
event.target.releaseCapture ();
trace ("onMouseUp")
}


בקצרה – יש לנו אובייקט מסוג Sprite. ציירנו עיגולאד, הצמדנו לו האזנות לשני אירועים: mouse_up ו-mouse_down. ברגע שיש לחיצה, אנחנו משתמשים במתודה של interactiveObject הנקראת setCapture, שהיא למעשה תופסת את האובייקט עליו נעשתה האינטרקטיביות ו"שומרת" אותו בזכרון. כך שאירוע ה-mouse_up ידע להתייחס לאותו אובייקט, גם אם אנחנו כבר לא עליו.
די פשוט, למען האמת. ומה שכן... נראה שהאופציה הזו של setCapture טומנת בחובה אופציות רחבות יותר של אינטרקטיביות מבלי להמציא את הגלגלים מחדש, או לעשות סלטות צ'וקארה מסובכות.
בילוי נעים.

No comments: