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



גבול עריכה

את האזור שבו הצורות יכולות לזוז נתחום בעזרת אובייקט גבול: אובייקט יציב (Solid) בשם border עם דמות של ריבוע בגודל 16 פיקסלים, לא שקופה (Transparent). נציב אובייקטים כאלה בחדר ככה שייווצר אזור מתאים למשחק, כמו שרואים בתמונה למטה. בדרך כלל רוחב אזור המשחק בטטריס הוא 10 או 12 משבצות, והגובה 18 או 20 משבצות מהתחתית של הצורה.

 


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




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

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

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

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

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

 

בחלון אפשרויות הפעולה צריך לכתוב 16 בשדה x (או -16 אם התנועה היא שמאלה) ו-0 בשדה y. ככה הפעולה תבדוק אם המקום שמימין (או משמאל) פנוי. (כמובן שצריך לסמן Relative.)

את השדה objects אפשר להשאיר על Solid only.


  נסו להזיז את הצורה ימינה ושמאלה עד הגבול.




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

נחיתה עריכה

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


  הביאו את הצורה עד למטה ותראו מה קורה.




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

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

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

 

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


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




הנחתה עריכה

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

בלשונית move יש פעולה שעושה בדיוק את זה: פעולת התזוזה עד לנקודת מגע  . הפעולה הזאת מזיזה את האובייקט עד שהוא מגיע לנקודה בה הוא נתקל באובייקט אחר.

 

בחלון אפשרויות הפעולה יש שלושה שדות:

  • direction הוא הכיוון שאליו מזיזים את האובייקט. אנחנו רוצים להזיז אותו למטה, לכן נכתוב שם 270.
  • maximum אומר עד כמה רחוק להזיז את האובייקט, במקרה שלא נתקלים בשום אובייקט בדרך. -1 מסמן שאין מגבלה על המרחק של התזוזה, לכן נשאיר את השדה הזה בערך -1.
  • against אומר מול איזה מין אובייקטים לבדוק התנגשות - כל האובייקטים או רק היציבים. אנחנו יכולים להסתפק באובייקטים היציבים, לכן נשאיר את השדה הזה על solid objects.

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


  לחיצה על רווח אמורה להנחית את הצורה.




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

בואו נראה איפה אנחנו עובדים ברשימת העבודה:

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

הגיע הזמן להחליף את ההערה "צריך: להפוך לערימה" בפעולות המתאימות - צעד 3: הערימה