תכנות לילדים באמצעות Game Maker/טטריס/צעד 1: צורה
הצורות
עריכהבטטריס יש מעט מאוד דברים. הדבר העיקרי שיש במשחק זה צורות שנופלות. יש שבע צורות כאלה:
עכשיו תורכם: לשמור את הצורות אצלך במחשב, וליצור להן דמויות במשחק. (עדיין לא ליצור אובייקטים!) כדאי לתת לדמויות שמות משמעותיים; נהוג להשתמש בשמות האותיות באנגלית שצורתן דומה לצורות של טטריס: O, I, T, L, J, Z, S. |
מה הצורות האלה עושות?
- נופלות למטה בקפיצות.
- זזות כשלוחצים על החצים ימינה ושמאלה.
- מסתובבות כשלוחצים על חץ למעלה.
- נערמות אחת על השניה אחרי שהן נופלות.
- נעלמות אם יש בערימה שורה שלמה.
אז זו רשימת העבודה שלנו כרגע.
במקום ליצור מיד 7 אובייקטים כדי שלכל צורה יהיה אובייקט, נתחיל מאובייקט אחד לצורה אחת. ככה לא נצטרך לשנות ולתקן 7 אובייקטים כל פעם, אלא רק אחד. אחרי שנשלים את הצורה הראשונה, יהיה ברור איך לתכנת את האחרות. לכן נוסיף לסוף רשימת העבודה עוד סעיף:
- לתכנת את שאר הצורות.
מאיזו צורה נתחיל?
בדרך כלל עדיף להתחיל במה שנראה הכי פשוט, כדי שקודם כל נצליח ליצור משהו פשוט שעובד; אחר כך נוכל להוסיף לו דברים יותר מורכבים. הצורה הכי פשוטה מבין שבע הצורות היא הריבוע, כי הוא לא מסתובב. לכן רשימת העבודה המעודכנת היא:
- אובייקט לצורת הריבוע.
- נפילה.
- תנועה ימינה ושמאלה כשלוחצים על החצים.
- להערם בסוף הנפילה.
- להעלים שורות שלמות.
- לתכנת את שאר הצורות.
- לסובב את הצורות כשלוחצים על חץ למעלה.
אובייקט צורה נופלת
עריכהקודם כל ניצור אובייקט בשם shape (שֵייפּ) - צורה. ניתן לאובייקט הצורה את דמות הריבוע. ניצור חדר ונשים בו את אובייקט הצורה.
כדאי לוודא שרואים את צורת ההריבוע.
עכשיו צריך לגרום לצורה ליפול. עד עכשיו גרמנו לאובייקטים לזוז באמצעות קביעת המהירות שלהם. אבל בטטריס הצורות לא זזות במהירות קבועה, אלא יורדות מדי פעם בקפיצה. לכן הפעם נטפל בתנועה של הצורות בצורה שונה: נשנה את הקורדינטות של הצורה בכל פעם שהיא צריכה לזוז. איך נדע מתי היא צריכה לזוז? נכוון שעון מעורר:
- נוסיף לאובייקט הצורה ארוע יצירה.
- בארוע זה נשים פעולת כיוון שעון מעורר. נכוון את השעון ל-20 צעדים.
- נוסיף ארוע צלצול שעון.
- בארוע הזה נשנה את הערך של המשתנה y כדי להזיז את הצורה למטה: נוסיף לו 16 (לסמן Relative).
- נוסיף גם לארוע הזה פעולת כיוון שעון מעורר ושוב נכוון את אותו השעון ל-20 צעדים. ככה הצורה תרד שוב ושוב כל 20 צעדים.
עכשיו הצורה אמורה ליפול לאיטה, כל פעם בקפיצה של 16 פיקסלים.
ברוב הגירסאות של טטריס, לחיצה על חץ למטה גורמת לצורה ליפול במהירות גדולה יותר. אצלנו השעון המעורר קובע את מהירות הנפילה, לכן כשלוחצים על חץ למטה צריך לכוון את השעון למספר צעדים קטן:
תנועה לצדדים
עריכהגם את התנועה לצדדים נעשה באמצעות שינוי הקורדינטות:
- נוסיף ארוע לחיצה על חץ ימינה (Right).
- בארוע הזה נשנה את המשתנה x כדי להזיז את הצורה ימינה: נוסיף לו 16 (לסמן Relative). ככה הצורה תזוז ימינה 16 פיקסלים.
- נעשה אותו הדבר לתנועה שמאלה (Left), רק שהפעם נוסיף ל-x את הערך -16 כדי להזיז את הצורה שמאלה.
נסו להזיז את הצורה ימינה ושמאלה בעזרת החצים.
הצורה זזה כשלוחצים על החצים, אבל היא זזה מהר מדי ואז קשה לכוון איפה היא תהיה בדיוק. בטטריס חשובה גם תנועה מהירה (בעיקר כשהמשחק מתקדם ונהיה מהיר) אבל גם הדיוק חשוב, כדי שיהיה אפשר להפיל את הצורות בדיוק למקום הנכון. הדרך הנהוגה להשיג גם דיוק וגם מהירות היא שבהתחלת הלחיצה הצורה תזוז רק פעם אחת, ואם המשתמש ממשיך ללחוץ אז הצורה זזה מהר. כלומר: צריך להפריד בין התזוזה הראשונה לתזוזות הבאות, ככה שתהיה השהיה אחרי התזוזה הראשונה.
הפרדת התזוזה הראשונה
עריכהגם במשחק חייזרים היינו צריכים להפריד בין דברים שקרו מהר מדי: שם הפרדנו בין היריות בעזרת משתנה מצב. גם הפעם נשתמש במשתנה מצב כדי להפריד בין התזוזות. אבל הפעם למשתנה שלנו יש 3 מצבים:
- לפני התזוזה הראשונה - אפשר לזוז.
- אחרי התזוזה הראשונה - לא לזוז עד שנגמרת ההשהיה.
- אחרי ההשהיה - שוב אפשר לזוז.
נקרא למשתנה המצב שלנו move_state. הוא יוכל לקבל אחד משלושה ערכים:
- לפני התזוזה הראשונה הערך שלו יהיה 0.
- בזמן ההשהיה שאחרי התזוזה הראשונה הערך יהיה 1.
- אחרי שנגמרה ההשהיה הערך יהיה 2.
קודם כל נאתחל את המשתנה: נוסיף לארוע היצירה את הפעולה לקביעת ערך של משתנה ושם נקבע את הערך של המשתנה move_state ל-0.
גם כשמפסיקים ללחוץ על החץ, צריך להחזיר את המשתנה move_state לערך 0, כדי שהוא יהיה מאותחל בפעם הבאה שהמשתמש ילחץ על חץ. לכן נוסיף שני ארועי שחרור מקש - אחד עבור חץ ימינה (Right) ואחד עבור חץ שמאלה (Left). בארועים האלה נשים את הפעולה לקביעת ערך של משתנה ונקבע את הערך של המשתנה move_state ל-0.
עכשיו נעבור לתזוזה עצמה: ארוע לחיצה על חץ . מה צריך לעשות בארוע הזה?
- במצב 2 (תזוזה מהירה) צריך פשוט לזוז. כלומר: לשנות את הערך של x.
- במצב 1 (המתנה) צריך לחכות בלי לזוז. כלומר: לא לעשות כלום.
- במצב 0 (תזוזה ראשונה) צריך לזוז, לעבור למצב 1, ולכוון שעון מעורר שיצלצל בסוף ההמתנה.
נתחיל במצב 1, כי אז צריך לא לעשות כלום. לכן נשים בתחילת רשימת הפעולות את הפעולה לבדיקת ערך של משתנה ובה נבדוק אם move_state שווה ל-1. ככה הפעולה הבאה תתבצע רק במצב 1.
אבל הפעולה שצריך לעשות במצב 1 היא לא לעשות כלום! איך לא עושים כלום?
הפסקת ביצוע פעולות
עריכהבלשונית control יש פעולה ליציאה מהארוע: . הפעולה הזאת מפסיקה את ביצוע הפעולות של הארוע. ככה כל הפעולות שמופיעות אחריה ברשימה לא יבוצעו. את הפעולה הזו נשים אחרי פעולת הבדיקה, וככה אם המצב הוא 1 אז לא יבוצעו פעולות נוספות.
עכשיו נוכל לטפל במצבים האחרים. גם במצב 0 וגם במצב 2 צריך להזיז את הצורה, לכן נוכל לשים עכשיו את הפעולה לשינוי המשתנה x . היא תתבצע רק אם פעולת הבדיקה נתנה תוצאה שלילית, כלומר: במצבים 0 ו-2.
במצב 2, זה כל מה שצריך לעשות. לכן אחרי הפעולה שמשנה את x, נשים שוב את הפעולה לבדיקת ערך של משתנה והפעם נבדוק אם move_state שווה ל-2. אם כן, לא צריך לבצע פעולות נוספות. לכן אחרי פעולת הבדיקה נשים את הפעולה ליציאה מהארוע .
כל הפעולות הבאות שנשים יבוצעו רק אם שתי פעולות הבדיקה נתנו תוצאה שלילית, כלומר: אם move_state שווה 0.
מה נשאר לעשות במקרה הזה?
הנה רשימת הפעולות השלמה בארוע הלחיצה על חץ ימינה:
(הפעולות בארוע לחיצה על חץ שמאלה זהות, מלבד הפעולה לשינוי x.)
נשאר עוד דבר אחד: להוסיף ארוע צלצול שעון מעורר עבור השעון החדש, ובו לשנות את הערך של move_state ל-2 כדי לסמן שהסתיימה ההמתנה שאחרי התזוזה הראשונה.
כשלוחצים על חץ ימינה או שמאלה צריכה להיות המתנה בין התזוזה הראשונה לתזוזות הבאות.
הצורה שלנו זזה יפה. עכשיו נגביל את התנועה שלה - צעד 2: אזור המשחק