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

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



מסוע[עריכה]

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

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

כדי שהמסוע יזוז ימינה ושמאלה צריך:

  1. להוסיף לו ארוע יצירה.
  2. לשים בו את הפעולה לקביעת המהירות האופקית (מהירות 1 או 2 תספיק).



אם מוסיפים מסוע לחדר הוא זז ימינה.




פניה[עריכה]

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

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

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

  1. להוסיף לו ארוע התנגשות בפניה.
  2. להוסיף למשתנה direction שלו 180 מעלות ולסמן Relative כדי שהוא יסתובב וינוע בדיוק בכיוון ההפוך (מה שנקרא פנית פרסה או פניה של 180 מעלות).



המסוע זז ימינה ושמאלה בין שתי הפניות.




עכשיו אפשר להעלות את מריו על המסוע: מה קורה כשמריו נוחת על המסוע? נסו ותראו!

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

ירושה[עריכה]

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

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



עכשיו מריו יכול לנחות גם על מסוע.




נעצור רגע בשביל להבין מה בדיוק עשינו.

סימנו את אובייקט המשטח בתור ההורה של אובייקט המסוע, ואז אירוע ההתנגשות של מריו במשטח הופעל גם כשמריו התנגש במסוע. זה גרם ל-Game Maker להתייחס למסוע כאל סוג של משטח, ככה שכל מה שמוגדר למשטח יעבוד גם על מסוע.

ב-Game Maker אובייקט יורש מההורה שלו שלושה דברים:

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

בקיצור: Game Maker מתייחס לאובייקט ילד כאל סוג של אובייקט ההורה שלו.

נסיעה[עריכה]

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

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

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

כלומר, צריך:

  1. ללכת לארוע ההתנגשות של מריו במשטח.
  2. למחוק את הפעולה לקביעת המהירות האנכית (שעוצרת את הנפילה של מריו).
  3. במקומה להוסיף את פעולת התנועה המדוייקת. כאן צריך לכתוב בשדות speed ו-direction את המהירות והכיוון של מופע המשטח שבו מריו התנגש. אבל איך כותבים משתנים של מופע אחר?

other[עריכה]

בארוע התנגשות, אפשר לכתוב other (אחר) בכל מקום שרוצים להתייחס למופע שבו התנגשנו. ככה שאם נכתוב other.speed נקבל את המהירות של המופע שבו התנגשנו, ואם נכתוב other.direction נקבל את הכיוון של המופע שבו התנגשנו.



מריו נוסע כשהוא עולה על מסוע, ועוצר כשהוא נוחת על משטח רגיל.




סיבוב[עריכה]

מה קורה אם מריו נמצא על המסוע כשהמסוע מסתובב בפניה? (נסו ותראו!)

כדי שמריו יסתובב יחד עם המסוע, צריך:

  1. ללכת לארוע ההתנגשות של המסוע בפניה.
  2. להוסיף את הפעולה לבדיקת התנגשות באובייקט כדי לראות אם מריו נמצא על המסוע, כלומר: אם יש מופע מריו במיקום היחסי y=-1.
  3. אם כן, לשנות את משתנה הכיוון direction של מריו ב-180 מעלות.



מריו מסתובב עם המסוע בפניות, אבל מחליק קצת בסיבוב.




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

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

מה קורה כשהמסוע מתנגש בפניה?

  1. Game Maker מחזיר את שניהם למיקומים שלהם בצעד הקודם. הוא לא מחזיר את מריו (שלא מתנגש בכלום) לכן מריו נמצא צעד אחד קדימה יותר מהמסוע.
  2. Game Maker מבצע את הפעולות של ארוע ההתנגשות, שבהן אנחנו הופכים את כיוון התנועה של המסוע ושל מריו.
  3. Game Maker מנסה שוב להזיז את המסוע והפניה (אבל לא את מריו, כי הוא לא התנגש). לכן הוא מזיז את המסוע צעד אחד בכיוון ההפוך. ככה יוצא שמריו כבר שני צעדים קדימה ביחס למסוע.

מריו מתקדם בכל צעד hspeed פיקסלים, ככה שהוא מתקדם 2 * hspeed פיקסלים יותר מדי.

לכן בשביל לתקן את ההחלקה של מריו בסיבוב צריך:

  1. ללכת לארוע ההתנגשות של המסוע בפניה.
  2. להוסיף בלוק אחרי פעולת הבדיקה (סביב פעולת ההצבה שמסובבת את מריו), כי יהיה צריך לבצע שתי פעולות אם מריו נמצא על המסוע.
  3. אחרי הפעולה שמסובבת את מריו, להוסיף פעולת הצבה שתקדם אותו בשני צעדים: להוסיף למשתנה x את הערך 2 * hspeed (כאשר Applies to מתייחס אל מריו).



מריו מסתובב עם המסוע בלי להחליק.




- מסוע
תרגילים
-