תכנות לילדים באמצעות Game Maker/מריו/קוביות
קוביות שאלה
[עריכה]בין המשטחים שמריו מקפץ עליהם יש קוביות עם סימן שאלה. ניצור להן אובייקט בשם q_block שיורש מהמשטח. אפשר להשתמש בדמות מהרצועה של העצמים. (לא לשכוח לסמן את תיבת solid).
כדאי להוסיף לחדר כמה קוביות שאלה כדי לבדוק אותן.
מריו יכול לקפוץ מתחת קוביית שאלה ולנגוח בה, ואז צריכים לקרות שלושה דברים:
- הקוביה מאבדת את סימן השאלה והופכת להיות קוביה ריקה שכבר לא מגיבה יותר לנגיחות.
- הקוביה קופצת קצת למעלה וחוזרת למקום.
- מתוך הקוביה יוצא בונוס - מטבע, פטריה, פרח.
דבר ראשון שצריך לעשות זה לזהות מתי מריו נוגח בקוביה. ברור שזה קורה בארוע התנגשות בינהם, אבל לא בכל ארוע התנגשות אלא רק אם מריו מתנגש בקוביה מלמטה. איך יודעים אם ההתנגשות היא מלמטה? בודקים אם מריו נמצא במיקום של כמה פיקסלים מתחת לקוביה. כלומר, צריך:
- להוסיף לקוביה ארוע התנגשות במריו. (למה לקוביה ולא למריו? כי למריו יש כבר ארוע התנגשות במשטח, ואם נוסיף לו ארוע התנגשות בקוביה אז זה יסתיר את ההתנגשות במשטח ואז מריו לא יוכל לנחות על קוביות - נסו ותראו!)
- לבדוק אם קיים אובייקט מריו במיקום יחסי y=32 ותסמנו relative .
- להוסיף בלוק אחרי הבדיקה, כדי שיהיה אפשר לבצע את כל הפעולות שקורות בנגיחה.
- בינתיים נסתפק בהשמעת צליל כשיש נגיחה, רק כדי לבדוק שהיא באמת קורית מתי שצריך.
נסו להתנגש בקוביה מכיוונים שונים כדי לוודא שהצליל נשמע רק כשנוגחים בה מלמטה.
עכשיו אפשר להפוך את הקוביה לריקה כשיש נגיחה:
- ליצור אובייקט empty_block שיורש מהמשטח. (אפשר למצוא דמות מתאימה ברצועת העצמים.)
- כשמריו נוגח בקוביית שאלה, להפוך אותה לקוביה ריקה.
כשמריו נוגח בקוביית שאלה היא צריכה להפוך לריקה.
הקפצה
[עריכה]הקוביה הריקה צריכה לקפוץ כשיש נגיחה, כלומר: כשהיא נוצרת. לכן צריך:
כדי לעצור את הקוביה צריך לכוון שעון שיצלצל כשהיא נופלת חזרה למקום. כמה צעדים לוקח לקוביה ליפול חזרה למקום?
הקוביה מתחילה לעלות במהירות speed, מאיטה ומאיטה עד שהיא נעצרת, ואז מתחילה ליפול למטה.
המהירות של הקוביה קטנה בכל צעד ב-gravity פיקסלים לצעד. ככה שאחרי 2 צעדים המהירות קטנה ב-2*gravity פיקסלים, וכן הלאה. כמה צעדים לוקח עד שהמהירות קטנה לאפס והקוביה נעצרת? זה לוקח speed/gravity צעדים, כי אז המהירות משתנה ב-speed/gravity כפול gravity, שזה בדיוק speed.
כלומר, אחרי speed/gravity צעדים הקוביה מגיעה לשיא הגובה ונעצרת. אחרי speed/gravity צעדים נוספים היא חוזרת בדיוק למקומה ההתחלתי.
לכן צריך לכוון את השעון לצלצל עוד 2*speed/gravity צעדים.
לכן צריך:
- בארוע היצירה של הקוביה הריקה, לכוון שעון שיצלצל עוד 2*speed/gravity צעדים.
- להוסיף ארוע צלצול של השעון הזה.
- בארוע הזה לאפס את המהירות של הקוביה כדי לעצור אותה.
- ולאפס גם את הכבידה שלה כדי שהיא לא תמשיך ליפול.
- להחזיר את הקוביה למיקום ההתחלתי במדויק, למקרה שיש סטיות קטנות כתוצאה מעיגול שברים.
הקוביה קופצת ונעצרת במקום. אפשר לשנות את המהירות ההתחלתית שלה ואת הכבידה עד שמגיעים לקפיצה שנראית טוב.
קוביות לבנים
[עריכה]בואו נשאיר רגע בצד את הבונוסים שצריכים לצאת מקוביות השאלה, וניצור קוביית לבנים brick_block (אפשר למצוא דמות מתאימה ברצועת העצמים). כמובן שגם קוביית הלבנים צריכה לרשת מהמשטח.
שימו כמה קוביות לבנים בחדר כדי לבדוק אותן.
אם מריו נוגח בקוביית לבנים כשהוא עדיין קטן, הוא צריך להקפיץ אותה, בדיוק כמו הקפיצה של הקוביה הריקה. אבל בשונה ממנה, אם מריו נוגח בקוביית לבנים כשהוא סופר-מריו אז היא צריכה להישבר.
כלומר, גם לקוביה הריקה וגם לקובית הלבנים יש התנהגות משותפת: הקפצה. אבל דברים זהים צריכים להופיע רק פעם אחת בתוכנית, אז אולי כדאי שאחת מהקוביות תירש מהשניה? במקרה הזה זה לא יתאים, כי כל אחת מהקוביות צריכה לקפוץ בארוע אחר.
אז מה עושים? יש כמה דרכים לגשת לפתרון, והדרך שבחרתי להראות כאן היא להפוך את ההקפצה לפונקציה.
תכנות פונקציות
[עריכה]השתמשנו כבר בכמה וכמה פונקציות, גם כאלה שמחשבות דברים (כמו random) וגם כאלה שעושות פעולות (כמו instance_create). עכשיו כשאנחנו במצב המתקדם של Game Maker אנחנו יכולים לתכנת בעצמנו פונקציות, ולהפעיל את הפונקציות האלה בכל אובייקט שנרצה.
נתכנת שתי פונקציות: פונקציה אחת תקפיץ את המופע שיפעיל אותה, ופונקציה שניה תעצור אותו. ואז נפעיל את הפונקציה המקפיצה כשהקוביה צריכה לקפוץ, ואת הפונקציה העוצרת כשהקוביה חוזרת למקום.
ב-Game Maker הפונקציות שאנחנו מתכנתים הן משאב מסוג תסריט script. כדי ליצור פונקציה חדשה צריך להקליק על הכפתור ליצירת תסריט בסרגל הכלים: .
חלון תכונות התסריט דומה לחלון הקוד של פעולת קוד. ובאמת התסריט הוא פשוט פעולת קוד שיש לה שם, ככה שאפשר להפעיל אותה מאובייקטים וארועים שונים בלי לכתוב שוב ושוב את אותו הקוד. בצד ימין למעלה אפשר לקבוע את שם התסריט; נכתוב שם bounce.
הקוד שנכתוב צריך לעשות בדיוק אותו הדבר כמו הפעולות שמקפיצות קוביה. לכן נכתוב:
vspeed = -5; gravity = 2; gravity_direction = 270; alarm[0] = 2*speed/gravity;
השורה הראשונה קובעת שהמהירות האנכית תהיה -5.
השורה השניה קובעת שהכבידה תהיה 2.
השורה השלישית קובעת שהכיוון של הכבידה יהיה למטה (270).
השורה הרביעית קובעת ששעון מספר 0 יצלצל בעוד 2*speed/gravity צעדים. (המשתנה alarm הוא מערך שכל אבר בו קובע מתי יצלצל השעון המעורר המתאים.)
(אפשר לשנות את ערכי המהירות האנכית והכבידה למה שנראה לך טוב.)
עכשיו אפשר להשתמש בתסריט הזה כפונקציה:
- ללכת לארוע ההיצירה של הקוביה הריקה.
- למחוק את הפעולות שבו.
- במקומן להוסיף את הפעולה להפעלת תסריט שנמצאת בלשונית control.
- בחלון אפשרויות הפעולה לכתוב bounce בשדה script.
מריו מקפיץ את קוביות השאלה כמו קודם.
עכשיו צריך לעשות אותו הדבר לנחיתה חזרה של הקוביה בסוף ההקפצה:
- ליצור תסריט בשם land
- לכתוב בו את הקוד הבא:
speed = 0; gravity = 0; x = xstart; y = ystart;
- למחוק את הפעולות בארוע צלצול השעון של הקובייה הריקה, ובמקומן להפעיל את התסריט land.
מריו מקפיץ את קוביות השאלה כמו קודם.
עכשיו כשגמרנו לעשות להקפצה refactoring לתסריטים, אפשר להשתמש בתסריטים האלה גם באובייקטים אחרים.
עכשיו תורכם: לתכנת את קוביית הלבנים לקפוץ ולנחות כשמריו נוגח בה. |
כדאי לדעת: מתי להשתמש בירושה ומתי בתסריטים?ירושה עדיפה כשאובייקט אחד צריך להשתמש בכל הפעולות והארועים של אובייקט אחר. תסריט מתאים כשאובייקט צריך רק כמה פעולות מאובייקט אחר אבל לא ארועים שלמים. תסריט מתאים גם כשארועים שונים באותו אובייקט צריכים להשתמש באותו רצף פעולות, אם כי למקרה כזה אפשר להשתמש גם בארוע משתמש. |
- | קוביות | - |