31-07-2006, 11:51
|
|
|
|
חבר מתאריך: 21.09.05
הודעות: 5,321
|
|
לא צריך להילחץ או להתחנן.
אוקיי. נעבור חלק חלק על הקוד עם החלק הסטטי והדינאמי.
תחילה נגדיר את שני ה-MC. אני קראתי לאחד sp, כלומר Static part, ולשני dp, כלומר Dynamic part. כל אחד מהם הוא עיגול, כאשר sp הוא מעט יותר גדול מהשני.
עכשיו נכתוב קוד גרירה ל-dp. אנחנו צריכים לומר למחשב - "אם העכבר לחוץ על dp, התחל לגרור"
קוד:
_root.dp.onPress = function(){
this.startDrag()
}
"אם העכבר היה לחוץ על dp וכעת הוא משוחרר, הפסק לגרור"
קוד:
_root.dp.onRelease = function(){
this.stopDrag()
}
הערה: בשתי הפונקציות האלה השתמשתי במשתנה this. המשתנה הוא משתנה דינאמי מטבעו ומתייחס לאובייקט, או במקרה שלנו ל-MC, שעליו דיברנו. בשני הקודים רשום בתחילה:
ולכן this מוגדר כאן כ-dp. יש לו שימושים יותר שימושיים, אבל כאן זה נועד כדי להקל על הכתיבה.
אוקיי - נחזור לקוד המקורי. עכשיו נגדיר למחשב את הדבר הבא: "אם העכבר זז בדוק האם dp נוגע ב-sp. אם הוא נוגע, קבע את ה-x וה-y של dp כמו של sp, מחק את המווי קליפ sp והפסק לגרור את dp".
השתמשתי בארוע (Event) "כאשר העכבר זז" (onMouseMove) במקום "בכניסת פריים" (onEnterFrame). למה, את שואלת? כדי לחסוך עבודה מהמחשב. ברור לכולנו ש-MC נגרר אחרי העכבר וזז העכבר צריך לזוז. אין לנו טעם לבדוק כל הזמן האם יש נגיעה כי יכול להיות מצב שהעכבר לא זז ולכן אין סיכוי שיהיה hitTest בין המוי קליפים. היגיון פשוט...מקווה שזה מובן.
ככה רושמים את זה:
קוד:
_root.onMouseMove = function(){
עכשיו נשתמש בפקודת ה-hitTest המוכרת לך. הבדיקה היא בין dp ו-sp, ולכן היא תיכתב כך:
קוד:
if (_root.dp.hitTest(_root.sp)){
עכשיו נגדיר בתוך ה-if של ה-hitTest מה יקרה אם מתקיימת הנגיעה:
1. מיקום ה-X של dp יהיה כמו של sp:
קוד:
_root.dp._x = _root.sp._x
2. מיקום ה-Y של dp יהיה כמו של sp:
קוד:
_root.dp._y = _root.sp._y
3. נמחק את המווי קליפ sp מהבמה:
קוד:
_root.sp.unloadMovie()
4. נספיק את הגרירה של dp (הרי אם הזזנו את העכבר אל sp והייתה נגיעה לפני ששיחררנו אותו, dp ימשיך להיגרר אחרי העכבר שלנו. פשוט ניתן פקודה כמו קודם שמורה ל-dp להפסיק להיגרר.
עכשיו נסגור את כל הסוגריים הגדולים, והקוד מוכן. ככה הוא נראה בלי לפרק אותו לחלקים:
קוד:
_root.dp.onPress = function(){
this.startDrag()
}
_root.dp.onRelease = function(){
this.stopDrag()
}
_root.onMouseMove = function(){
if (_root.dp.hitTest(_root.sp)){
_root.dp._x = _root.sp._x
_root.dp._y = _root.sp._y
_root.sp.unloadMovie()
_root.dp.stopDrag()
}
}
אני מצרף קובץ fla וקובץ swf כדי להשוות את התוצאות.
https://2006-uploaded.fresh.co.il/2...31/41133224.fla
https://2006-uploaded.fresh.co.il/2...31/82743620.swf
מקווה שעזרתי נעם.
עריכה: לא ראיתי את הקוד שלך, רועי, לפני ששלחתי. לפחות כל אחד רשם על משהו שונה. ד"א, הייתי ממליץ גם לך להשתמש כאן ב-onMouseMove ולא ב-onEnterFrame כדי לחסוך משאבים.
_____________________________________
בברכה, נעם בריקמן
נערך לאחרונה ע"י noam906 בתאריך 31-07-2006 בשעה 11:53.
|