בשלב זה אתה יכול להבין שאתה כבר מגדיר פונקצייה פרטית בכל זמן שאתה רוצה להנפיש את התוכנית שלך פונקציית הציור (draw function). להזכירך, זו תוכנית המכונית המונפשת שלנו שוב. יש לה המשתנה הזה ששמו הוא x, הוא מתחיל ב-11. ואז בתוך פונקציית draw, הוא מצייר את המכונית במשתנה x זה ואז היא מוסיפה 3 למשתנה x זה כל פעם ואלו התוצאות במכונית שנעה 3 פיקסלים על המסך ברציפות. אז, כך זה עובד. אבל עכשיו כשלמדת איך להכין פונקציה בעצמך, ייתכן שאתה תוהה, מה לגבי פונקציית draw? למה היא תמיד נקראת 'draw'? האם היא פונקציה מותאמת אישית? ואלו הן שאלות מאוד טובות. אתה רואה, בספריית "ProcessingJS", הפונקציה 'draw' היא אחת מתוך כמה פונקציות מוגדרות מראש מה שנותן לתוכניות שלנו יותר שליטה על מה שקורה עם הקנבס. פונקציה מוגדרת מראש היא פונקציה שכבר הוגדרה על ידי ספריית ה-ProcessingJS. אבל לעיתים קרובות זה מתחיל בהגדרה ריקה (של הפונקציה). למשל, בספריית ה-ProcessingJS, יש קוד שנראה כמו זה: {} () var draw = function ואז הקוד רק ריק. ריק לחלוטין. עכשיו, אנחנו טוענים את ספריית ה-ProcessingJS לתוך כל תוכנית פה באקדמיית קהאן. אז את הקוד הזה מעולם לא ראית. אבל תאמין לי, הוא קיים. עכשיו אני אעיר שהקוד יצא מפני ש-ProcessingJS כבר עושה לנו את זה. עכשיו כשאתה מגדיר שוב 'draw' בתוכנית הפרטית שלך, ההגדרה החדשה "דורסת" את ההגדרה הישנה הריקה. ועכשיו הפונקציה 'draw' עושה למעשה דברים מרגשים, כמו לצייר מכונית. עכשיו השאלה היא, למה הפונקציה 'draw' נקראת שוב ושוב? טוב, בספריית ה-ProcessingJS יש רק קוד שמגדיר לדפדפן לעשות זאת ולחזור ולחזור, שוב ושוב ושוב. אנחנו צריכים לשנות לפונקציה 'draw' את שמה, כי זה השם של הפונקציה ש-ProcessingJS קוראת לו שוב. אם נשנה את שמה, כמו שנשנה את זה ל 'drawCar'. ובהתחלה נקבל שגיאה 'ללא הגדרה', אז אנחנו צריכים לומר 'var drawCar'. תוכל לראות, אם משנים שם ל-drawCar, אנחנו לא יכולים לראות אנימציה כלשהי. וזה כך מפני שהפונקציה לא נקראת עוד כי היא לא נקראת 'draw'. אז אנו צריכים לשים את הקוד שאנו רוצים לקרוא לו בתוך פונקציה שתהיה מאויתת 'draw' בדיוק. אז אני רק אעשה זאת שוב, ואני רק אקרא ל-'drawCar' מכאן. אהה! קיבלנו את זה בחזרה. בסדר, אז זה צריך להיות בשם 'draw', וזה גם אומר שאתה חייב לקרוא לפונקציה המותאמת אישית בשם 'draw', אלא אם כן אתה רוצה לטפל בהם באופן מיוחד, ולקרוא להם שוב ושוב. וגם תזכור, אתה לא יכול ליצור פונקציות רבות בשם 'draw'. רק ההגדרה האחרונה תיחשב. אם יש לנו 'rect' פה בפנים-- אז עכשיו אנו יכולים לראות שהמכונית שלנו נראית שוב ושוב, ורק ה'rect' נראה, כי רק ההגדרה האחרונה נחשבת. אז בואו ניפטר מזה. עכשיו הפונקציה 'draw' היא לא רק פונקציה מוגדרת מראש שיש לה פעולות מיוחדות כאלו. יש גם אוסף של פונקציות כדי להגיב לאינטרקציות עכבר ולחיצות במקלדת. בואו נאמר שאנחנו רוצים שתהיה לנו תוכנית שתצייר אליפסה צבועה בכל מקום שהמשתמש מעביר את העכבר... אז אנו יכולים לעשות זאת עם פונקציה כמו זו. [הקלדה] בסדר, או, נפלא. עכשיו, הפונקציה הזאת נקראת שוב ושוב, גם כשהמשתמש לא מזיז את העכבר, כמו עכשיו. והתוכנית הזאת, היא עובדת, היא עושה מה שאנו רוצים שתעשה היא מציירת את האליפסות היפות האלה בכל רחבי המסך. אבל כפי שמתברר, יש דרך טובה יותר לעשות את אותו הדבר. זה יעיל יותר. אז אנחנו יכולים לשנות את 'draw' ל-mouseMoved. וזה עדיין עובד. אתה רואה, הסביבה שלנו בודקת תוכניות כדי לראות אם יש להן פונקציה מוגדרת mouseMoved ואם כך, הסביבה קוראת לפונקציה הזאת בכל הזזת עכבר. אבל היא לעולם לא תיקרא אם המשתמש לא מזיז את העכבר. אז לפני זה קראנו את הקוד שבפונקציית 'draw' כשאנחנו לא צריכים זאת, שוב ושוב ועכשיו, אנחנו קוראים את הקוד של mouseMoved רק כשהערכים של mouseX או mouseY משתנים. אז התוכנית שלנו היא יותר יעילה, וזה דבר טוב. באופן כללי, אם אתה רק רוצה לשנות את פלט התוכנית שלך כשהמשתמש מזיז את העכבר, אז זה יותר טוב לשים את הקוד בתוך פונקציית 'mouseMoved'. ויש עוד אוסף של פונקציות מוגדרות מראש כמו זאת, ואתה יכול לראות דוגמאות נוספות ב-Documentation. כמו mousePressed, mouseReleasedm keyPressed, ועוד. אז תזכור, אם אתה רוצה להשתמש בפונקציה מיוחדת מוגדרת מראש, כמו mouseMoved או draw, איית אותה נכון, והשתמש בה נכון. אם לא, תוודא שאתה מביא לפונקציות המותאמות אישית שלך שם חדש, ייחודי. בהצלחה!