תכנות לילדים באמצעות Game Maker/טטריס/צעד 11: העלמת שורה


העלמת השורה עריכה

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

בשביל זה צריך לעבור על כל מופעי הערימה ולבדוק את הגובה של כל אחד מהם: אם הוא גבוה מהשורה צריך להנמיך אותו במשבצת, ואם הוא בגובה השורה בדיוק אז צריך למחוק אותו. כלומר, צריך לולאה שעוברת על כל מופעי הערימה. בשפת GML יש לולאה מתאימה.

לולאת with עריכה

כשרוצים לחזור על פקודות מסויימות עבור כל המופעים של אובייקט מסוים, משתמשים בלולאת with. למשל:

with (pile)
{
    y = y + 16;
}

מה שזה אומר:

  • with היא מילת מפתח שמסמנת פקודה ללולאה שחוזרת עבור כל אחד מהמופעים של אובייקט מסוים.
  • הביטוי בסוגריים (pile) שאחרי המלה with מסמן את האובייקט שעל המופעים שלו הלולאה תעבור.
  • סימני הצומדיים { ו-} מסמנים תחילת וסוף בלוק.
  • y = y + 16; היא פקודת הצבה, שמגדילה ב-16 את y של המופע שעליו חוזרת הלולאה. כלומר, כל פעם מדובר ב-y של מופע ערימה אחר. זה לא y של המופע שבו מבצעים את פעולת הקוד.

בעברית אפשר לנסח את הקוד הזה ככה: "עם כל אחד מהמופעים של אובייקט הערימה, תגדיל את y ב-16." בואו נראה איך זה עובד: נוסיף פעולת קוד   עם הקוד הזה, לארוע סוף ההנפשה של השורה  .


  מה קורה כשמתמלאת שורה שלמה?




משתנים בתוך לולאת with עריכה

הורדנו את כל מופעי הערימה, אבל צריך להוריד רק את אלה שמעל השורה. כלומר, צריך להכניס פקודת if (אם-אז) לפני פקודת ההצבה, כדי שההצבה תתבצע רק אם המופע בלולאת with גבוה מהשורה.

איך כותבים את זה בקוד?
הגובה של מופע הערימה שבלולאה הוא y. צריך לבדוק שהוא קטן יותר מ-y של השורה (כי אז זה אומר שמופע הערימה גבוה יותר מהשורה). אבל אם כותבים y בתוך לולאת with זה אומר y של מופע הערימה שעליו חוזרים, אז איך נכתוב y של השורה שבה מתבצעת פעולת הקוד?

בתוך לולאת with, אפשר לכתוב other.y כדי לקבל את y של המופע שבו מתבצעת פעולת הקוד. לכן במקרה שלנו, other.y יתן לנו את y של השורה. לכן נשנה את הקוד:

with (pile)
{
    if ( y < other.y )
        y = y + 16;
}

עכשיו פקודת ההצבה תתבצע רק למופעי הערימה שגבוהים מהשורה.


  נסו למלא שורה שלמה ולראות מה קורה עכשיו.




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

מחיקת מופע בקוד עריכה

כמו שיש פעולה למחיקת מופע  , יש גם פונקציה שמוחקת מופע: instance_destroy(). הפונקציה instance_destroy פשוט מוחקת את המופע הנוכחי. בתוך לולאת with היא מוחקת את המופע שהלולאה עוברת עליו כרגע.

אנחנו רוצים למחוק רק מופעי ערימה שבאותו גובה כמו השורה, לכן נוסיף בתוך הלולאה את הקוד המודגש:

with (pile)
{
    if ( y == other.y )
        instance_destroy();
    if ( y < other.y )
        y = y + 16;
}

הקוד המודגש אומר: אם y של המופע שהלולאה עוברת עליו כרגע שווה ל-y של השורה, אז תמחק את המופע הזה.


  עכשיו השורה תעלים את כל מופעי הערימה שבה.




המשך העבודה עריכה

השלמנו את כל רשימת העבודה. המשחק עובד ואפשר לשחק בו. מה שנשאר זה להציג לוח ניקוד יפה, רקע מתאים, ואריזה גרפית כמו שעשינו במשחק חייזרים. כדאי גם לעשות את המשחק מאתגר יותר: להאיץ את מהירות הנפילה של הצורות, כל פעם קצת.

לכן רשימת העבודה החדשה תהיה:

  • לוח ניקוד
  • האצת מהירות הנפילה
  • רקע
  • אריזה

נתחיל בפריט הראשון - צעד 12: ניקוד