תכנות לילדים באמצעות Game Maker/פונג/צעד 5: הכדור

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


כדור[עריכה]

המחבט מוכן, ועכשיו דרוש כדור שנוכל לחבוט בו. את ההתחלה כבר בטח ברור לך איך לעשות:

  1. ליצור אובייקט חדש Gmaker add object.png
  2. לתת לו שם משמעותי, למשל ball (בּוֹל) - כדור.
  3. ליצור לו דמות מתאימה - אפשר לצייר לבד ואפשר לטעון דמות מוכנה (יש כדורים מתאימים בין הדמויות בתיקיה breakout שבה מצאנו את דמות המחבט). דמות הכדור עגולה ולא מלבנית, אז צריך להשאיר את הסימון בתיבת הסימון Transparentשמסמנת שיש בתמונה חלקים שקופים.
  4. להוסיף את אובייקט הכדור לחדר, איפשהו באמצע.
  5. להפעיל את המשחק כדי לבדוק שהכדור מופיע כמצופה.
  6. לשמור את המשחק.

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

ארוע יצירה[עריכה]

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

  1. להקליק על הכפתור להוספת ארוע שבחלון תכונות האובייקט של הכדור.
  2. לבחור את ארוע היצירה Create. Gmaker create.png
  3. להוסיף פעולת תנועה Gmaker red move button.png. כדאי שמהירות התנועה תהיה קטנה ממהירות התנועה של המחבט, כדי שהמשתמש יצליח לחבוט בכדור (למשל, מהירות 3 או 5). ובאיזה כיוון תהיה התנועה? אפשר ללחוץ על יותר מחץ אחד, ואז הכדור יבחר אחד מהכיוונים האלה באופן אקראי. ככה בכל פעם שנשחק הכדור יזוז בכיוון אחר ובלתי צפוי. כדאי לבחור את ארבעת החצים האלכסוניים - תנועה ישר היא משעממת יחסית.



Gmaker test save.png עכשיו כדאי להפעיל את המשחק כדי לבדוק אם הכדור באמת זז, ואם כן - לשמור את המשחק.



אם הכדור באמת זז, אז הוא בורח החוצה מהמסך! צריך לעצור אותו, ולהחזיר אותו חזרה.

פעולת ניתור[עריכה]

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

אז עכשיו צריך לעשות שני דברים:

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

Gmaker room with border.png

הפעם אנחנו לא רוצים שהכדור סתם יעצור כשהוא מתנגש בגבול, אלא שינתר ממנו חזרה וימשיך לנוע. למרבה המזל, אנחנו לא צריכים להגיד מראש באיזה כיוון ומהירות לנתר חזרה, כי ל-Game Makerיש פעולה מיוחדת לניתור מאובייקטים שמתנגשים בהם: Bounce (בּאוּנְס) - ניתור. Gmaker bounce button.png

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


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



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

Gmaker bounce dialog.png

precise (פֵּרְסַייס) - מדוייק, האם הניתור צריך לפי הצורה המדוייקת של הדמות שמתנגשים בה, או שמספיק לחשב את כיוון הניתור כאילו האובייקט התנגש בקיר ישר. הפעם לא מתאים לנו לנתר כאילו המחבט הוא ישר, כי נרצה שכשהכדור פוגע בקצוות המעוגלים של המחבט הוא ינתר בזווית שונה. לכן צריך לשנות את הערך של השדה הזה ל-precisely (פֵּרְסַייסְלִי) - בדיוק.

against (אַגֵיינְסְט) - כנגד, האם האובייקט צריך לנתר רק כנגד אובייקטים שהגדרנו אותם יציבים או כנגד כל אובייקט. המחבט שלנו הוא לא יציב, לכן צריך לשנות את הערך של השדה הזה ל-all objects (אוֹל אוֹבְּגֵ'קְטְס) - כל האובייקטים.


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



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

פעולת תנועה מדוייקת[עריכה]

פעולת התנועה שהשתמשנו בה עד עכשיו מאפשרת לתכנת תנועה רק בשמונה כיוונים (למעלה, למטה, לצדדים, ובאלכסונים) אבל לא מאפשרת לתכנת תנועה בכיוונים שביניהם. בשביל זה משתמשים בפעולת התנועה המדוייקת, שהסימן שלה זה חצים כחולים. Gmaker blue move button.png

אז בואו נחליף את התנועה ההתחלתית של הכדור בתנועה מדוייקת:

  1. לבחור את ארוע היצירה של הכדור.
  2. למחוק מרשימת הפעולות שלו את פעולת התנועה עם החצים האדומים (פשוט לבחור אותה וללחוץ על מקש Delete).
  3. במקומה, לגרור לרשימת הפעולות את פעולת התנועה המדוייקת עם החצים הכחולים.
  4. בחלון אפשרויות הפעולה, לכתוב את המהירות כרגיל בשדה המהירות speed.
  5. Gmaker angles.png
    מעל שדה המהירות, יש שדה direction (דַיירֵקְשֵן) - כיוון. שם אפשר להגדיר את הכיוון באמצעות מספר שמציין את הזווית במעלות ביחס לתנועה לצד ימין. כלומר, תנועה ימינה תהיה כיוון 0, תנועה למעלה תהיה כיוון 90, בשביל תנועה שמאלה צריך לכתוב בשדה הכיוון 180, ובשביל תנועה למטה - 270 (או -90). מספרים אחרים יגדירו כיווני ביניים בין הכיוונים האלה. כדאי לנסות לכתוב כאן מספרים שונים ולראות מה יוצא. (למשל: 270, או 300, או 200, או מספרים אחרים.)

Gmaker test save.png הכדור ייפול בזווית שכתבת בשדה direction.




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

Gmaker blue move dialog.png

random[עריכה]

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

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

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


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




ביטויים[עריכה]

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

Gmaker down angle.png

בשביל שהכדור יתקדם באיזשהו כיוון יורד, הכיוון שלו צריך להיות גדול יותר מ-180 (שזה שמאלה) אבל קטן יותר מ-360 (שזה שוב חזרה ימינה). אנחנו גם לא רוצים שזה יהיה יותר מדי אופקי ימינה או שמאלה. הכי טוב יהיה מין נפילה אלכסונית למטה, בזווית בין 225 לבין 315.

הפונקציה random נותנת לנו מספר בין 0 לבין הפרמטר (המספר ששמים אחריה בסוגריים). אבל אנחנו צריכים מספר יותר גדול - מספר בין 225 ל-315. מה עושים? אם נכתוב 20+random(10) אז נקבל 20 ועוד המספר שהפונקציה random תחזיר, שהוא יהיה בין 0 ל-10. כלומר: נקבל מספר בין 20 לבין 30. בואו נשנה קצת את המספרים ככה שבמקום מספר בין 10 ל-20 נקבל מספר בין 225 ל-315. קודם כל, ברור שלמספר האקראי שתחזיר לנו הפונקציה random צריך להוסיף 225, כי הפונקציה יכולה להחזיר לפעמים 0. אז אנחנו צריכים 225+random(?). איזה מספר צריך לבוא במקום הסימן שאלה? מספר מספיק גדול כדי שנוכל להגיע עד 315. מאיפה אנחנו צריכים להגיע ל-315? מ-225. זאת אומרת, אנחנו מחפשים את המספר שמוסיפים ל-225 בשביל להגיע ל-315. המספר הזה הוא ההפרש ביניהם: 90 = 225 - 315 .

לכן נשנה את הכיוון של הפעולה ל-225+random(90).

הערה: בגירסאות החדשות בלנדר יודע לקבל ביטויים כמו random(225-315)

התרגיל שכתבנו בשדה הכיוון נקרא ביטוי. Game Makerיודע לחשב ביטויים כאלה ולהשתמש בתוצאה. בכל מקום שהוא רוצה שנכתוב מספר, הוא יסכים גם שנכתוב ביטוי והוא כבר יחשב את התוצאה של הביטוי וישתמש בה. ככה אפשר לכתוב למשל בשדה המהירות 10/3 או כל ביטוי אחר, במקום מספר.


Gmaker test save.png עכשיו צריך לראות שזה באמת עובד.




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