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

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



גבול[עריכה]

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

Gmaker tetris border.png


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




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

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

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

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

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

Gmaker if free dialog.png

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

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


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




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

נחיתה[עריכה]

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


Gmaker test save.png הביאו את הצורה עד למטה ותראו מה קורה.




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

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

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

Gmaker tetris down.png

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


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




הנחתה[עריכה]

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

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

Gmaker contact dialog.png

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

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

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


Gmaker test save.png לחיצה על רווח אמורה להנחית את הצורה.




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

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

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

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