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

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


כדור[עריכה]

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

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

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

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

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

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



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



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

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

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

כך יראה החדר אחרי שתקיפו אותו בקירות


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

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


כדאי לדעת:

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

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

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


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



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

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

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


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



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

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

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

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

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

הכדור ייפול בזווית שכתבת בשדה direction.




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

קביעת זווית הכדור[עריכה]

random[עריכה]

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

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

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


כדאי לדעת:

הפונקציה "random" תיתן לנו מספר אקראי מאפס עד המספר שבסוגריים, לא כולל את המספר שבסוגריים. למשל, הביטוי random(4) יכול לתת לנו את התוצאות 0, 1, 1.4, 2, 2.3 או 3, אבל לא 4.

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




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

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

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

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

אם נכתוב 20+random(10), נקבל 20 ועוד המספר שהפונקציה random תחזיר, שהוא יהיה בין 0 ל-10. כלומר: נקבל מספר בין 20 לבין 30.

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

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

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

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


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




חלופה: הפונקציה random_range[עריכה]

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

קוראים לפונקציה הזאת random_range (רַנְדוֹם רֵיינְג'), והיא נראית ככה:

random_range(a,b)

המספר הראשון הוא המספר הקטן ביותר שיוכל להתקבל מהפונקציה, והמספר השני - הוא המספר שגדול ב-1 מהמספר הגבוה ביותר.

במקרה שלנו, אנחנו צריכים לכתוב את הפונקציה כך:

random_range(225,315)

התוצאה תהיה כל מספר קטן מ-315, החל מ-225.

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


עכשיו צריך לוודא שוב שזה עובד.




כדאי לדעת:

הפונקציות "random" ו-"random_range" נותנות לנו מספר אקראי שאינו בהכרח שלם.

במקרה שלנו, יכול להיות שהכדור יקבל את הזוית 234.66, למשל.

אם נרצה לקבל דווקא מספר שלם, נבחר בפונקציות דומות, שנוספה בחילתן האות "i":

"irandom" ו-"irandom_range".

דוגמה: הביטוי random_range(5,8) יכול לתת את התוצאות 5, 5.5, 6, 6.8, 7.9, או כל תוצאה אחרת מ-5 ומעלה שהיא קטנה מ-8.

לעומת זאת, הביטוי irandom_range(5,8) יכול לתת רק את התוצאות 5, 6 או 7.


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