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


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

ראינו שאפשר להחליף דמות באמצעות הצבה   למשתנה sprite_index. אנחנו רוצים להגריל באופן אקראי אחת משבע הדמויות של הצורות. אבל אנחנו מכירים את הדמויות האלה רק בשמות שלהן: O, I, T וכן הלאה. אם נגריל מספר אקראי באמצעות הפונקציה random() זה לא יעזור לנו לקבל שם של דמות.

מה עושים?

אפשרות אחת היא להשתמש שוב בפקודת switch, ולבחור דמות לפי התוצאה של הפונקציה random().

אבל יש דרך פשוטה יותר. ב-Game Maker יש פונקציה שמגרילה באופן אקראי אחד מהפרמטרים שלה: הפונקציה choose() (צ'וּז) - בחר. למשל, אם נכתוב choose(1, 17, 42) אז נקבל אחד מהמספרים 1, 17 או 42, באופן אקראי.

לכן, מה שצריך לעשות זה:

  1.   ללכת לנחיתה של אובייקט הצורה (בארוע השעון המעורר). ברשימת הפעולות שם, ללכת לפעולה שבה מזיזים את הצורה חזרה לנקודת ההתחלה. מיד אחריה צריך לשנות לצורה את הדמות.
  2.   להוסיף פעולת הצבה ובה להציב במשתנה sprite_index את הערך choose(O, I, T, L, J, S, Z) כדי לקבל אחת מדמויות הצורה באופן אקראי.
  3.   להעתיק את פעולת ההצבה הזאת גם לארוע היצירה של אובייקט הצורה, כדי שגם לצורה הראשונה תהיה דמות אקראית.

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




סידור מחדש של הנחיתה עריכה

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

 

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

  1. להקליק על Add event ומבין סוגי הארועים לבחור בסוג ארוע Other  .
  2. בתפריט שצץ לבחור ב-User defined ובתת-תפריט לבחור בפריט הראשון: ארוע משתמש מספר 0. עכשיו נוצר ארוע משלנו, ואפשר לשים בו פעולות כמו בכל ארוע אחר.
  3. ללכת חזרה לארוע השעון המעורר   ולבחור את כל הפעולות שבתוך הבלוק של פעולת בדיקת ההפך  .
  4. לקחת אותן משם באמצעות הקשה על Control+X.
  5. ללכת לארוע המשתמש שלנו, להקליק עם העכבר ברשימת הפעולות שלו, ולהקיש Control+V כדי להדביק את כל הפעולות שלקחנו.
  6. כדאי להסביר מה בדיוק הארוע הזה: לפני כל הפעולות שהדבקנו, להוסיף פעולת הערה   ובה לכתוב "ארוע: נחיתת צורה".

העברנו את הפעולות לארוע שלנו, אבל איך Game Maker ידע מתי הארוע שלנו קורה וצריך לבצע את הפעולות האלה? צריך להגיד לו:

  1. לחזור לארוע השעון המעורר   ולפעולת בדיקת ההפך  .
  2. את הבלוק שאחרי הפעולה הזו אפשר למחוק, כי נצטרך רק פעולה אחת במקרה שהצורה נוחתת: להגיד ל-Game Maker שקרה הארוע שלנו.
  3. במקום הבלוק, להוסיף פעולת קוד  .
  4. בחלון הקוד לכתוב event_user(0);. הפונקציה event_user אומרת ל-Game Maker שעכשיו קורה ארוע שלנו, ושצריך לבצע את הפעולות בארוע הזה. להבדיל מפונקציות כמו random() או choose(), הפונקציה event_user() לא מחזירה ערך אלא מבצעת פעולה.

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




עשינו refactoring - לא שינינו את ההתנהגות של התוכנה, אבל סידרנו אותה בצורה יותר ברורה. עכשיו יהיה לנו נוח יותר להמשיך להוסיף לה דברים.

הצורה הבאה עריכה

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

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

בארוע היצירה של הצורה הבאה, צריך לתת לה אחת מהדמויות של הצורות באופן אקראי. (אפשר פשוט להעתיק את פעולת ההצבה   מארוע היצירה של אובייקט הצורה.)


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




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

  1. ללכת לנחיתה של אובייקט הצורה (בארוע המשתמש  ). ברשימת הפעולות שם, ללכת לפעולת ההצבה   שבה מגרילים דמות חדשה לצורה.
  2. לפתוח את חלון אפשרויות הפעולה באמצעות הקלקה-כפולה על הפעולה. שם לשנות את המופע שהפעולה מתייחסת אליו (Applies to): לבחור ב-object ושם לבחור באובייקט הצורה הבאה. ככה במקום לשנות את הדמות של הצורה הנופלת, הפעולה תשנה את הדמות של הצורה הבאה.
  3. לפני פעולת ההצבה הזאת, להכניס פעולת הצבה נוספת   ובה להציב אל המשתנה sprite_index את הערך next_shape.sprite_index. ככה הצורה הנופלת תקבל את הדמות של הצורה הבאה.

  עכשיו הצורה שליד אזור המשחק מראה מה תהיה הצורה הבאה שתיפול.




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

הנה רשימת העבודה המעודכנת:

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

בואו ניתן למשתמש לסובב את הצורות שנופלות - צעד 8: סיבוב דמות