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



מה זה יריות עריכה

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

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

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

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

יצירת יריות עריכה

אנחנו רוצים שהחללית תירה כשהמשתמש לוחץ על מקש רווח. לכן נוסיף לאובייקט החללית את ארוע המקשים  , ובתפריט שצץ נבחר במקש Space (סְפֵּייס) - רווח.

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

 

בחלון אפשרויות הפעולה יש חמישה שדות:

  • object - איזה אובייקט ליצור. כאן צריך לבחור את אובייקט הלייזר, כי זה מה שהחללית תירה.
  • x ו-y - איפה ליצור את האובייקט. כרגע נשאיר את זה על 0, ורק נסמן את תיבת הסימון Relative כדי שהקורדינטות האלה יהיו ביחס לחללית, ככה שהלייזר יופיע ליד החללית.
  • speed - באיזה מהירות הלייזר ינוע. כאן נרצה לכתוב מהירות די גדולה, למשל 20 או 30 או אפילו יותר.
  • direction - באיזה כיוון הלייזר ינוע. אנחנו רוצים שהוא ינוע שמאלה, לכן צריך לכתוב כאן 180.

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

אחריות על קיום מופעים עריכה

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

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

 

כדאי לדעת:

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

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

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

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


  מה קורה כשלוחצים על רווח?




הלייזר מופיע מעל החללית - בפינה השמאלית העליונה של תמונת החללית, כי שם x ו-y שלה הם 0. כדי שהוא יופיע במקום מתאים יותר, צריך לשנות את x ואת y באפשרויות פעולת יצירת המופע. נסו לכתוב שם ערכים שונים עד שהלייזר יופיע במקום שנראה טוב. (אם אין לך כוח לנסות, אפשר לכתוב את המשתנה spaceship.x בשדה x ו-spaceship.y+20 בשדה y - כי אז הנעלם של הx יהיה תמיד איפה שהחללית וגם הy עכשיו הוספתי לy 10 כי y מגיע לקצה של החללית ואנחנו רוצים שהוא יהיה באמצע החללית.) כדאי לנסות לשנות גם את המהירות עד שזה יראה לך טוב.

הפרדת יריות עריכה

מה קורה כשלוחצים על הרווח למשך כמה זמן?

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

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

דבר ראשון, צריך לאתחל את המשתנה. בשביל זה נוסיף לחללית ארוע יצירה  . בארוע הזה נשים את הפעולה לקביעת ערך של משתנה  . בחלון אפשרויות הפעולה נכתוב בשדה variable את השם can_shoot (קֵן שוּט) - יכול לירות. בשדה value נכתוב 1, כדי לסמן "כן" - אפשר לירות. (נהוג להשתמש ב-1 בשביל לסמן "כן", וב-0 כדי לסמן "לא".)

 

עכשיו נוכל להשתמש במשתנה הזה בשביל להחליט אם לירות או לא:

  1. בארוע הלחיצה על מקש רווח, נוסיף את הפעולה לבדיקת ערך של משתנה   (הפעולה הזו נמצאת בתחתית הלשונית control). בחלון אפשרויות הפעולה נכתוב can_shoot בשדה variable, ובשדה value נכתוב 1, כדי לבדוק אם עכשיו אפשר לירות. את השדה operation נשאיר על equal to. כך הפעולה הבאה ברשימה תתבצע רק אם can_shoot שווה ל-1 (כלומר: אם אפשר לירות).
  2. אם באמת אפשר לירות, נרצה לבצע יותר מפעולה אחת. לכן נוסיף את הפעולות לתחילת וסיום בלוק אחרי פעולת הבדיקה.
  3. את הפעולה ליצירת מופע של הלייזר נזיז לתוך הבלוק, כדי שקרן הלייזר תיווצר רק אם אפשר לירות.
  4. אחרי שהקרן נוצרה (כלומר: החללית ירתה) צריך לשנות את מצב החללית ללא יורה. לכן נוסיף את הפעולה לקביעת ערך של משתנה   ובאפשרויות הפעולה נכתוב לשנות את הערך של המשתנה can_shoot ל-0.
  5. ולבסוף, נוסיף פעולת כיוון שעון מעורר  . כדי שיזכיר לנו לשנות את החללית חזרה למצב ירייה. נכוון אותו לצלצל עוד 5 צעדים.
  6. עכשיו צריך להוסיף גם ארוע צלצול שעון  . ובו לשנות את משתנה המצב can_shoot בחזרה ל-1, כדי שאחרי 5 צעדים החללית תוכל שוב לירות.

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



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




השלמנו עוד פריט ברשימת העבודה:

  • חללית שנעה מימין לשמאל
  • יריות
  • אויבים
  • מכשולים
  • חיזוקים - מגן, תחמושת

עכשיו נעשה את המשחק מעניין - צעד 4: אויבים