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

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
קפיצה לניווט קפיצה לחיפוש


איך להוסיף עוד צורות[עריכה]

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

זה פתרון לא טוב. יש בו שתי בעיות עיקריות:

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

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

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

צורת קו[עריכה]

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


Gmaker test save.png עכשיו נופלים קוים ארוכים אדומים, אבל כשהם נוחתים הם הופכים לערימה של ריבועים תכולים.



יש שני דברים שנצטרך לשנות:

  1. המיקום של מופעי הערימה שנוצרים כשהצורה נוחתת.
  2. הצבע שלהם.

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

מיקום מופעי הערימה[עריכה]

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

יש שני משתנים שיעזרו לנו:

  • sprite_width (סְפְּרַייט וּוִידְס') - רוחב הדמות.
  • sprite_height (סְפְּרַייט הַייט) - גובה הדמות.

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

איך עוברים על דמות הצורה לאורך ולרוחב? נתחיל ברוחב - נלך לנחיתה של הצורה (בארוע צלצול שעון מעורר של אובייקט הצורה), נמחק את ארבע הפעולות שיוצרות מופעי ערימה, ובמקומן נוסיף פעולות אחרות:

Gmaker tetris land row.png
  1. Gmaker set var.png נאתחל ל-0 משתנה בשם pile_x. המשתנה הזה יסמן את קורדינטת x של מופע הערימה שאנחנו יוצרים. כל פעם נגדיל אותו ב-16, עד שנכסה את כל הרוחב של דמות הצורה.
  2. Gmaker repeat button.png נוסיף פעולת חזרה כדי ליצור לולאה שתחזור לכל רוחב הצורה. מספר הפעמים שהלולאה צריכה לחזור הוא כמו מספר מופעי הערימה שנכנסים ברוחב דמות הצורה, כלומר: רוחב הדמות לחלק ל-16. לכן נכתוב בחלון אפשרויות פעולת החזרה sprite_width / 16.
  3. בלולאה יהיו כמה פעולות, לכן נשים אחרי פעולת החזרה את הפעולות לתחילת בלוק ולסיום בלוק.
  4. Gmaker create instance.png בתוך הבלוק נשים את הפעולה ליצירת מופע כדי ליצור מופע של הערימה. בשדה x נכתוב pile_x, ובשדה y נכתוב בינתיים 0. כמובן שנסמן Relative כדי שהערימה תיווצר במקום שבו הצורה.
  5. Gmaker set var.png נגדיל את pile_x ב-16 (לסמן Relative) כדי להתקדם הלאה לרוחב השורה.

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




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

לולאה כפולה[עריכה]

הצלחנו לעבור על שורה אחת של הדמות. בשביל לעבור על כל השורות, נצטרך עוד לולאה: לולאה שתחזור שוב ושוב על כל הלולאה של השורה. איך נעשה את זה?

Gmaker tetris land double.png
  1. Gmaker set var.png לפני כל הפעולות שהוספנו קודם, נאתחל ל-0 משתנה בשם pile_y. המשתנה הזה יסמן את קורדינטת y של מופע הערימה שאנחנו יוצרים. כל פעם נגדיל אותו ב-16, עד שנכסה את כל הגובה של דמות הצורה.
  2. Gmaker repeat button.png נוסיף פעולת חזרה כדי ליצור לולאה שתחזור לכל גובה הצורה. מספר הפעמים שהלולאה צריכה לחזור הוא כמו מספר מופעי הערימה שנכנסים בגובה דמות הצורה, כלומר: גובה הדמות לחלק ל-16. לכן נכתוב בחלון אפשרויות פעולת החזרה sprite_height / 16.
  3. בלולאה יהיו הרבה פעולות, לכן נשים אחרי פעולת החזרה את הפעולה לתחילת בלוק. את הפעולה לסיום בלוק נשים אחרי סוף הבלוק של הלולאה שתכנתנו קודם. ככה הלולאה שעוברת על הדמות לגובה תחזור שוב ושוב על הלולאה שעוברת על שורה אחת לרוחב. כלומר: המעבר על כל השורה יתבצע שוב ושוב, מהשורה העליונה ועד לתחתונה.
  4. Gmaker create instance.png נשנה את הפעולה ליצירת מופע: בשדה y נכתוב pile_y.
  5. Gmaker set var.png אחרי סוף הלולאה שעוברת על שורה, נגדיל את pile_y ב-16 (לסמן Relative) כדי לרדת לשורה הבאה.

Gmaker test save.png כשהצורה נוחתת, נוצרת ערימה שמכסה את כל הצורה בדיוק. כדאי לבדוק את זה גם כשהדמות היא O וגם כשהדמות היא I.




Double loop order.png

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

צורות אחרות[עריכה]

הצלחנו ליצור ערימה מתאימה גם לדמות O וגם I. מה לגבי הדמויות האחרות? בואו נראה: נשנה את הדמות של אובייקט הצורה ל-T.


Gmaker test save.png מה קורה כשהצורה נוחתת?




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

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

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

בארוע הזה צריך לבדוק אם מופע הערימה מתנגש באובייקט צורה. בשביל זה נשתמש בפעולה לבדיקת התנגשות באובייקט, שנמצאת בלשונית control: Gmaker if collision object.png. הפעולה הזאת דומה לפעולה לבדיקת התנגשות, אבל היא בודקת התנגשות רק במופעים של אובייקט מסוים. מאחר שאנחנו רוצים לבדוק התנגשות רק באובייקט הצורה (ולא במופעי ערימה אחרים), הפעולה הזאת מתאימה לנו בדיוק.

Gmaker if collision object dialog.png

בחלון אפשרויות הפעולה נבחר באובייקט הצורה בשדה object. כדי לבדוק התנגשות במיקום הנוכחי של הערימה, נשאיר את השדות x ו-y על 0 ונסמן Relative.

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

NOT מסמן להפוך את התוצאה של פעולת הבדיקה. כלומר, במקום שהפעולה הבאה תתבצע רק אם יש התנגשות, היא תתבצע רק אם אין התנגשות. לכן עכשיו נוכל לשים אחרי פעולת הבדיקה את פעולת המחיקה Gmaker destroy button.png.

Gmaker tetris pile collision.png

מאחר שאנחנו לא רוצים להמשיך לפעולות הבאות, נשים גם את פעולת היציאה מהארוע Gmaker exit.png, ונקיף את שתי הפעולות האלה בבלוק.

הערה: אם יש לכם Game Maker Studio תיכנסו לחלון תכונות הדמות של כל אחת מהדמויות של הצורות שיש להם חלקים שקופים. סמנו את תיבת הסימון Precise collision checking.


Gmaker test save.png מה קורה עכשיו כשהצורה נוחתת? נסו להחליף את דמות אובייקט הצורה גם לשאר הצורות, כדי לבדוק אם הערימה שנוצרת מתאימה לצורה.




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

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

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

הגיע הזמן לבחור במה שמתאים - צעד 5: בחירת דמות