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

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



קוביות שאלה[עריכה]

בין המשטחים שמריו מקפץ עליהם יש קוביות עם סימן שאלה. ניצור להן אובייקט בשם q_block שיורש מהמשטח. אפשר להשתמש בדמות מהרצועה של העצמים. (לא לשכוח לסמן את תיבת solid).



Gmaker test save.png כדאי להוסיף לחדר כמה קוביות שאלה כדי לבדוק אותן.




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

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

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

  1. Gmaker collision.png להוסיף לקוביה ארוע התנגשות במריו. (למה לקוביה ולא למריו? כי למריו יש כבר ארוע התנגשות במשטח, ואם נוסיף לו ארוע התנגשות בקוביה אז זה יסתיר את ההתנגשות במשטח ואז מריו לא יוכל לנחות על קוביות - נסו ותראו!)
  2. Gmaker if collision object.png לבדוק אם קיים אובייקט מריו במיקום יחסי y=32 ותסמנו relative .
  3. Gmaker block button.png להוסיף בלוק אחרי הבדיקה, כדי שיהיה אפשר לבצע את כל הפעולות שקורות בנגיחה.
  4. Gmaker sound button.png בינתיים נסתפק בהשמעת צליל כשיש נגיחה, רק כדי לבדוק שהיא באמת קורית מתי שצריך.



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




עכשיו אפשר להפוך את הקוביה לריקה כשיש נגיחה:

  1. ליצור אובייקט empty_block שיורש מהמשטח. (אפשר למצוא דמות מתאימה ברצועת העצמים.)
  2. Gmaker change instance.png כשמריו נוגח בקוביית שאלה, להפוך אותה לקוביה ריקה.



Gmaker test save.png כשמריו נוגח בקוביית שאלה היא צריכה להפוך לריקה.




הקפצה[עריכה]

הקוביה הריקה צריכה לקפוץ כשיש נגיחה, כלומר: כשהיא נוצרת. לכן צריך:

  1. Gmaker create.png להוסיף לה ארוע יצירה.
  2. Gmaker set vspeed.png בארוע הזה לקבוע לה מהירות כלפי מעלה, למשל -5.
  3. Gmaker gravity button.png להפעיל עליה כבידה כלפי מטה.



Gmaker test save.png הקוביה קופצת, אבל לא עוצרת.




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



לכן צריך:

  1. Gmaker clock button.png בארוע היצירה של הקוביה הריקה, לכוון שעון שיצלצל עוד 2*speed/gravity צעדים.
  2. Gmaker alarm.png להוסיף ארוע צלצול של השעון הזה.
  3. Gmaker set vspeed.png בארוע הזה לאפס את המהירות של הקוביה כדי לעצור אותה.
  4. Gmaker gravity button.png ולאפס גם את הכבידה שלה כדי שהיא לא תמשיך ליפול.
  5. Gmaker jump to start.png להחזיר את הקוביה למיקום ההתחלתי במדויק, למקרה שיש סטיות קטנות כתוצאה מעיגול שברים.



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




קוביות לבנים[עריכה]

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



Gmaker test save.png שימו כמה קוביות לבנים בחדר כדי לבדוק אותן.




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

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

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

תכנות פונקציות[עריכה]

Gmaker scripts.png

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

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

ב-Game Maker הפונקציות שאנחנו מתכנתים הן משאב מסוג תסריט script. כדי ליצור פונקציה חדשה צריך להקליק על הכפתור ליצירת תסריט בסרגל הכלים: Gmaker add script.png.

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

Gmaker bounce actions.png

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

vspeed = -5;
gravity = 2;
gravity_direction = 270;
alarm[0] = 2*speed/gravity;

השורה הראשונה קובעת שהמהירות האנכית תהיה -5.
השורה השניה קובעת שהכבידה תהיה 2.
השורה השלישית קובעת שהכיוון של הכבידה יהיה למטה (270).
השורה הרביעית קובעת ששעון מספר 0 יצלצל בעוד 2*speed/gravity צעדים. (המשתנה alarm הוא מערך שכל אבר בו קובע מתי יצלצל השעון המעורר המתאים.)
(אפשר לשנות את ערכי המהירות האנכית והכבידה למה שנראה לך טוב.)

עכשיו אפשר להשתמש בתסריט הזה כפונקציה:

  1. Gmaker create.png ללכת לארוע ההיצירה של הקוביה הריקה.
  2. Gmaker block button.png למחוק את הפעולות שבו.
  3. Gmaker script button.png במקומן להוסיף את הפעולה להפעלת תסריט שנמצאת בלשונית control.
  4. בחלון אפשרויות הפעולה לכתוב bounce בשדה script.



Gmaker test save.png מריו מקפיץ את קוביות השאלה כמו קודם.




עכשיו צריך לעשות אותו הדבר לנחיתה חזרה של הקוביה בסוף ההקפצה:

  1. Gmaker add script.png ליצור תסריט בשם land
  2. לכתוב בו את הקוד הבא:
    speed = 0;
    gravity = 0;
    x = xstart;
    y = ystart;
    
    שתי השורות הראשונות עוצרות את הקוביה, ושתי השורות האחרונות מחזירות אותה למיקום ההתחלתי.
  3. Gmaker script button.png למחוק את הפעולות בארוע צלצול השעון של הקובייה הריקה, ובמקומן להפעיל את התסריט land.

Gmaker test save.png מריו מקפיץ את קוביות השאלה כמו קודם.




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


עכשיו תורכם:

לתכנת את קוביית הלבנים לקפוץ ולנחות כשמריו נוגח בה.


כדאי לדעת:

מתי להשתמש בירושה ומתי בתסריטים?

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

תסריט מתאים כשאובייקט צריך רק כמה פעולות מאובייקט אחר אבל לא ארועים שלמים.

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


- קוביות -