תכנות לילדים באמצעות Game Maker/מריו/כיבוי מופעים

נסו ליצור חדר גדול, עם הרבה אויבים, פלטפורמות ומסועים. הריצו את המשחק.


המשחק רץ לאט מאוד.



הסיבה לכך שהמשחק רץ לאט היא שכל המסועים וכל האויבים מחשבים לאן לזוז, ואפילו הפלטפורמות בודקות כל הזמן אם משהו מתנגש בהן. אפילו זה שהאובייקטים מציירים את עצמם גוזל הרבה כוח חישוב וגורם למשחק להאט. אמנם השתמשנו בדוגמה קיצונית אבל רוב משחקי הפלטפורמות משתמשים בשלבים גדולים למדי, עם די הרבה אובייקטים. אז מה אפשר לעשות? ובכן, גיים מייקר מכיל אפשרות שנקראת כיבוי מופעים - כשמופע מכובה, מבחינת הגיים מייקר הוא לא קיים. הוא לא זז, לא מצייר את עצמו ולא בודק התנגשויות. הדבר היחיד שאפשר לעשות עם מופע מכובה זה להדליק אותו. בכיבוי והדלקת מופעים שולטים בעזרת קוד. יש פונקציה לכיבוי כל המופעים (instance_deactivate_all), פונקציה לכיבוי כל המופעים בתוך או מחוץ לאזור מסוים (instance_deactivate_region) ופונקציה לכיבוי אובייקט ספציפי (instance_deactivate_object). יש גם פונקציות דומות להדלקה, עם המילה activate במקום deactivate. אז מה אנחנו צריכים לעשות? אנחנו רוצים שכל המופעים שמחוץ לתצוגה יהיו מכובים. לכן בכל צעד אנחנו צריכים להדליק את כל המופעים (למקרה שמופע חדש נכנס לתצוגה) ואז לכבות את כל המופעים שמחוץ לתצוגה. כלומר זה הקוד שאנחנו צריכים לכתוב באירוע הצעד של מריו:

instance_activate_all();
  instance_deactivate_region(view_xview[0],view_yview[0],
                        view_wview[0],view_hview[0],false,true);

השורה הראשונה לא דורשת הרבה הסבר - זאת בסך הכל הפונקציה שמפעילה את כל המופעים. השורה השנייה דורשת יותר הסבר. כפי שאמרנו הפונקציה הזאת מכבה את כל המופעים שבתוך או מחוץ לאיזור מסוים. אז ארבעת הפרמטרים הראשונים קובעים את האיזור - מיקום ה-x, מיקום ה-y, הרוחב והגובה. אנחנו שמנו בהם את המשתנים המתאימים של התצוגה. הפרמטר החמישי קובע אם לכבות את המופעים שבתוך האזור (true), או מחוץ אליו (false). אנחנו בחרנו כמובן false. הפרמטר האחרון קובע אם מותר שהמופע שקרא לפונקציה יכובה (false) או שאסור (true). במקרה שלנו זה לא כל כך משנה כי מריו לא יכול לצאת מהתצוגה אבל עדיף להשאיר true לכל מקרה. נסו את המשחק עכשיו.


המשחק רץ יותר מהר אבל רואים בקלות שאובייקטים שיוצאים מהתצוגה לא זזים ואובייקטים שנכנסים לתצוגה משמאל מופיעים בבת אחת



איך פותרים את הבעיה הזאת? אין בעיה - מגדילים את האזור! ככה אובייקטים יחסית קרובים עדיין יזוזו רגיל ויפיעו רגיל ורק אובייקטים רחוקים יכובו. כדי להגדיל את האזור ב -100 פיקסלים לכל כיוון, מה שאנחנו צריכים לעשות זה להוריד 100 למיקום ה- x של האזור ולרוחב להוסיף 200.


עכשיו לא שמים לב לכיבוי והוא עדיין גורם למשחק להיות מהיר יותר.