תכנות לילדים באמצעות Game Maker/חייזרים/צעד 8: פצצות חכמות



פצצות חכמות

עריכה

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

זה אומר שנצטרך לתכנת:

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

זו רשימת העבודה שלנו לתכנות הפצצות החכמות.

אובייקט פצצה

עריכה
 

קודם כל ניצור אובייקט ונקרא לו bomb (בּוֹמְבּ) - פצצה. הכנתי דמות בשבילו, כאן מצד שמאל. בשביל לבדוק את הפצצה, נשים פצצה או שתיים בחדר.


  הפצצה עוד לא עושה כלום, אבל איך היא נראית?




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

  1. להוסיף לפצצה ארוע יצירה.
  2. בארוע היצירה, לגרום לה לנוע ימינה   במהירות background_hspeed[1].

  עכשיו הפצצה אמורה לנוע עם ההרים.




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

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

נעבור לפריט הבא ברשימה: לתכנת את החללית לאסוף פצצות.

איסוף פצצות

עריכה

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

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

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

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

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

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

 

כדאי לדעת:

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

בשביל שהמשתנה bombs יהיה גלובלי, צריך לכתוב לפניו את המלה global ונקודה. ככה שאפשרויות הפעולה לקביעת ערך של משתנה בשביל איסוף פצצה צריכות להיות כמו בתמונה משמאל.

נשאר עוד דבר אחד: לאתחל את המשתנה הזה. את זה נעשה באותו מקום שבו אנחנו מאתחלים את החיים - בארוע תחילת המשחק של אובייקט לוח הניקוד. בארוע הזה נוסיף פעולה לקביעת ערך של משתנה   ושם נציב 0 במשתנה global.bombs.


  החללית אוספת פצצות, אבל לא רואים כמה פצצות היא כבר אספה.




הצגת מספר הפצצות

עריכה

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

 

עכשיו תורכם:

ליצור דמות מוקטנת לפצצה.

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

 

בחלון אפשרויות הפעולה, נבחר בדמות הפצצה המוקטנת. את השדה x נשאיר על 0, ובשדה y נכתוב 40, כדי שהפצצה תופיע מתחת לחלליות. לא לשכוח לסמן את תיבת הסימון Relative כדי שהפצצה תופיע איפה שהצבנו את לוח הניקוד.

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


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




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

 

בחלון אפשרויות הפעולה נכתוב בשדה variable את המשתנה שאנחנו רוצים להציג: global.bombs. בשדה y נכתוב אותו מספר שכתבנו בפעולה שבה ציירנו את תמונת הפצצה: 40. ובשדה x נכתוב 20. ככה מספר הפצצות יופיע מימין לתמונת הפצצה.


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




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

הצגת מספר הפצצות כתמונה

עריכה

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

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

 

כדאי לדעת:

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

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

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

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

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

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

 

מסובך קצת, לא?

הערות

עריכה

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

 

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

זה יותר ברור, לא?


 

כדאי לדעת:

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


תכנתנו משהו קצת מסובך, אז חשוב לבדוק אותו.


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




איפה אנחנו עומדים ברשימת העבודה של הפצצות?

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

אז עכשיו צריך לדאוג להופעת הפצצות.

ניהול הפצצות

עריכה

כשרצינו שהחייזרים יופיעו מדי פעם, נתנו לאובייקט מנהל החייזרים ליצור אותם. אפשר לעשות אותו דבר עם הפצצות. אבל הפעם לא חייבים ליצור מנהל פצצות נפרד - אותו מנהל יכול ליצור גם חייזרים וגם פצצות. כדאי רק לשנות לו את השם בהתאם: במקום alien_manager לקרוא לו item_manager (אַייטֵם מַנַגֵ'ר) - מנהל הפריטים.

 

עכשיו תורכם:

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

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

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

הפעלת פצצה חכמה

עריכה

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

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

  1. להוסיף את הפעולה לקביעת ערך של משתנה   ובה להקטין ב-1 את המשתנה global.bombs (באמצעות סימון Relative).
  2. להוסיף את הפעולה לשינוי אובייקט  . הפעולה הזו צריכה להתבצע על החייזרים, לכן ב-Applies to נסמן object ונבחר מהתפריט את החייזר. בשדה change into נהפוך את החייזרים לאובייקט הפיצוץ של החייזר.

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




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


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




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