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

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



מסוע[עריכה]

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

Gmaker mario objects.png

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

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

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



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




פניה[עריכה]

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

Gmaker turn room.png

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

Gmaker angles.png

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

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



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




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

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

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

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

Gmaker inheritance.png

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



Gmaker test save.png עכשיו מריו יכול לנחות גם על מסוע.




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

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

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

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

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

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

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

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

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

כלומר, צריך:

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

other[עריכה]

Gmaker other var.png

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



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




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

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

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

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



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




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

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

Gmaker collision solid.png

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

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

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

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

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



Gmaker test save.png מריו מסתובב עם המסוע בלי להחליק.




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