x
בניית אתרים בחינם
הפוך לדף הבית
הוסף למועדפים
שלח לחבר
 
                     הכל על הכל©       

        

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

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

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


 אובייקט החללית

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

תמונה:small_spaceship.png


תמונה:gmaker_test_save.png כדאי להפעיל את המשחק ולראות את החללית בחדר.



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


עכשיו תורך:

לתכנת את אובייקט החללית לנוע למעלה ולמטה כשלוחצים על מקשי החצים.


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

 השארת אובייקט בגבולות החדר

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

  1. ללחוץ על הוספת ארוע.
  2. לבחור בסוג ארוע Other (אַזֵר) - אחר. תמונה:gmaker_other.png
  3. בתפריט שצץ, לבחור Intersect boundary (אִינְטֵרְסֵקְט בַּאוּנְדְרִי) - חוצה את הגבול (של החדר).
  4. להוסיף את פעולת התנועה הפשוטה תמונה:gmaker_red_move_button.png בשביל לעצור את החללית.

תמונה:gmaker_test_save.png נסו להזיז את החללית עד למעלה וגם עד למטה. מה קורה כשהיא מגיעה לקצה? מה קורה אם גם אז ממשיכים לנסות להזיז אותה?


החללית זזה קצת יותר מדי. לא מספיק לעצור אותה - צריך גם להזיז אותה חזרה לתוך החדר. איך מזיזים חזרה?

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

  • xprevious (אִיקְס פְּרִיוְויֵיס) - x הקודם.
  • yprevious (וּוַי פְּרִיוְויֵיס) - y הקודם.

לכן כדי להזיז את החללית חזרה לתוך החדר אפשר להשתמש בפעולה לקביעת ערך של משתנה תמונה:gmaker_set_var.png, ושם לשנות את הערך של המשתנה y ל-yprevious. (את x לא צריך לשנות, כי ממילא מדובר רק בתנועה אנכית - למעלה ולמטה).


תמונה:gmaker_test_save.png מה קורה עכשיו כשמנסים להוציא את החללית מהמסך?


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

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


הוספת רקע לחדר

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

בחלון תכונות הרקע שנפתח מקליקים על הכפתור Load Background (לוֹוּד בַּקְגְרַאוּנְד) - טען רקע. אז אפשר לבחור מבין הרקעים שמגיעים עם Game Maker.

תמונה:gmaker_bg_prop.png

לדעתי אף אחד מהרקעים האלה לא מתאים במיוחד למשחק שלנו, לכן נראה לי עדיף להשתמש בתמונה שלמטה. בשביל להשתמש בתמונה הזאת, צריך להקליק עליה בכפתור הימני של העכבר, ומהתפריט שצץ לבחור "שמור תמונה בשם" או "Save Image As". ואז צריך לבחור איפה על המחשב שלך לשמור את התמונה. כדאי לשמור אותה בתיקיית הרקעים של Game Maker, שנמצאת בדרך כלל בתיקייה C:\Program Files\Game_Maker6\Backgrounds.

כדאי לשים לב שבחלון תכונות הרקע כתוב גם הגודל שלו: Width (וִוידְס') - רוחב, ו-Height (הַייט) - גובה. עוד מעט נראה למה זה חשוב ומה עושים עם זה.

לא לשכוח לתת לרקע שיצרת שם משמעותי, למשל stars (סְטַרְז) - כוכבים.


אחרי שבחרת רקע, אפשר להוסיף אותו לחדר:

  1. לפתוח את חלון תכונות החדר באמצעות הקלקה-כפולה על החדר ברשימת המשאבים שמשמאל.
  2. בצד שמאל של חלון תכונות החדר יש את האזור להוספת אובייקטים. אם מסתכלים מעליו, רואים שיש שם בעצם שלוש לשוניות, ואנחנו עד עכשיו תמיד עבדנו רק בלשונית הראשונה: objects. עכשיו צריך לעבור ללשונית השלישית: backgrounds (בַּקְגְרַאוּנְדְס) - רקעים.
  3. בלשונית הזו יש הרבה דברים שאפשר לעשות עם הרקע. כרגע נעשה רק שניים:
    • להוריד את הסימון בתיבת הסימון Draw background color (דְרוֹוּ בַּקְגְרַאוּנְד קוֹלוֹר) - צייר צבע רקע. כי אם אנחנו שמים תמונה ברקע, אז אין סיבה לצייר גם צבע - הצבע ממילא יוסתר על ידי התמונה.
    • לבחור את הרקע של הכוכבים ברשימת הרקעים, כמו בתמונה משמאל.

תמונה:gmaker_test_save.png איך החדר נראה עכשיו?




אתגר:

להוסיף רקע למשחק פונג ולחדרים במשחק הלבֵנים שיצרת.



{{{גודל}}}

כדאי לדעת:

בחלון תכונות החדר יש שלוש לשוניות: הראשונה objects בשביל להציב אובייקטים בחדר, האחרונה backgrounds בשביל לקבוע את הרקע של החדר. מה עם הלשונית האמצעית?

בלשונית settings אפשר לקבוע תכונות כלליות של החדר:

  • Name (נֵיים) - שם החדר, כפי שהוא מופיע ברשימת המשאבים.
  • Caption (קַפְּשֵן) - כותרת לחדר, שתופיע בכותרת החלון של המשחק.
  • Width (וִוידְס') - רוחב החדר.
  • Height (הַייט) - גובה החדר.
  • Speed (סְפִּיד) מהירות החדר (כמה צעדים בשניה).

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



 רקע נע

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

  • Hor. Speed (הוֹרִיזוֹנְטְל סְפִּיד) - מהירות אופקית: מהירות התנועה משמאל לימין.
  • Vert. Speed (וֵרְטִיקְל סְפִּיד) - מהירות אנכית: מהירות התנועה מלמעלה למטה.

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


תמונה:gmaker_test_save.png עכשיו הכוכבים שברקע אמורים לנוע ולתת תחושה שהחללית זזה מימין לשמאל.



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

לכן נוסיף עוד רקע, שיהיה קרוב יותר מהכוכבים, למשל הרים.

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

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

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

 ריצוף

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

את הריצוף אפשר לשנות בשתי תיבות הסימון שמתחת לשם הרקע:

  • Tile Hor (טַייל הוֹרִיזוֹנְטְלִי) - רַצֵף בצורה אופקית.
  • Tile Vert (טַייל וֵרְטִיקְלִי) - רַצֵף בצורה אנכית.

אנחנו רוצים לבטל את הריצוף האנכי, לכן צריך להוריד את הסימון מתיבת הסימון Tile Vert.

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

את המיקום של הרקע בחדר אפשר לשנות בשדות X ו-Y שליד תיבות הסימון של הריצוף. ה-X וה-Y האלה הם בדיוק כמו קורדינטות של אובייקטים - הם קובעים את המרחק של הרקע מהפינה השמאלית עליונה של החדר. אנחנו רוצים להוריד את ההרים למטה, ולכן צריך לכתוב איזשהו מספר בשדה Y. אבל איזה מספר? הגובה של החדר כולו הוא 480 פיקסלים, והגובה של ההרים הוא 126 פיקסלים. לכן, בשביל שההרים יגיעו בדיוק עד לתחתית החדר, צריך שהם יהיו במרחק 480 - 126 = 354 פיקסלים מהקצה העלין של החדר. לכן צריך לכתוב 354 בשדה Y.


תמונה:gmaker_test_save.png מה רואים עכשיו במשחק?



 שקיפות

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

באמצע החלון יש תיבת סימון Transparent. מסמנים אותה כדי שהרקע יהיה שקוף. אבל להרים יש שני צבעים - לבן וכחול - איזה מהם יוצג ואיזה יהיה שקוף? כמו בדמויות, גם ברקעים Game Maker בוחר את הצבע השקוף לפי הצבע של הפיקסל בנקודה השמאלית-תחתונה של התמונה. כרגע הצבע של הפיקסל הזה הוא כחול. בשביל לשנות את זה, צריך להקליק על הכפתור Edit Background (אֵדִיט בַּקְגְרַאוּנְד) - ערוך רקע. אז מקבלים את חלון עריכת התמונות המוכר, ושם אפשר לצייר בלבן על הפיקסל שבפינה השמאלית-תחתונה.


תמונה:gmaker_test_save.png עכשיו האויר מעל ההרים שקוף. אבל מה לגבי התנועה?



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

 תחושת עומק

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


עכשיו תורך:

להוסיף למשחק את הרקע של העננים, ולתכנת אותו לנוע קצת יותר מהר מהרקע של ההרים (למשל במהירות 5). כדאי לקרוא לו clouds (קְלַאוּדְס) - עננים.


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

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


תמונה:gmaker_test_save.png עכשיו החללית אמורה להראות כאילו היא טסה בין ההרים לעננים.




{{{גודל}}}

כדאי לדעת:

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

  • Visible when room starts (וִיזִיבְּל וּוֵן רוּם סְטַרְטְס) - האם הרקע יוצג או לא. נסו להוריד את הסימון מהתיבה הזאת (שנמצאת מיד מתחת לרשימת הרקעים) ותראו שהרקע הנוכחי ברשימה משתנה מאות עבה לאות רגילה, כדי להראות שהוא לא יוצג.
  • Stretch (סְטְרֵץ') - הרחב. כשמסמנים את התיבה הזאת (שנמצאת מתחת לתיבות הסימון של הריצוף) אז הרקע "ייתרחב" עד שהוא יכסה את כל החדר. נסו לסמן אותה עבור כל אחד משלושת הרקעים ותראו איך זה מוצג בצד ימין של החלון.


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

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

מה זה יריות

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

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

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

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

 יצירת יריות

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

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

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

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

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

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

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

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


{{{גודל}}}

כדאי לדעת:

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

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

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


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


תמונה:gmaker_test_save.png מה קורה כשלוחצים על רווח?



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

 הפרדת יריות

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

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

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

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

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

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

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



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



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

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

חייזרים

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

תמונה:alien_lander.png

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

כדי שהחייזר לא יצא מהמסך, נוסיף לו את ארוע חציית גבול המסך Intersect boundary תמונה:gmaker_other.png. בארוע הזה נחזיר אותו חזרה לתוך החדר כמו שעשינו לחללית: נוסיף את פעולת קביעת ערך של משתנה תמונה:gmaker_set_var.png, ושם נשנה את הערך של המשתנה y ל-yprevious. אבל לא נסתפק בזה: נוסיף גם את פעולת היפוך התנועה האנכית שנמצאת בלשונית move: תמונה:gmaker_reverse_vspeed.png. הפעולה הזו גורמת לאובייקט שנע למעלה לנוע למטה, ולאובייקט שנע למטה לנוע למעלה.


תמונה:gmaker_test_save.png איך נע החייזר?



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


תמונה:gmaker_test_save.png עכשיו החייזר אמור להראות כאילו הוא יורד לקרקע ועולה חזרה.



 משתנה מהירות הרקע

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

אבל איזה רקע? הרי יש לנו שלושה רקעים, ולכל אחד מהם יש מהירות אחרת!

המהירויות של הרקעים הן לא במשתנים רגילים, אלא במשתנה מסוג מערך. משתנה מסוג מערך מכיל יותר ממספר אחד - הוא יכול להכיל 2, 10 או אפילו 100 ערכים שונים. לכל אחד מהערכים האלה יש מספר סידורי: הערך הראשון הוא ערך מספר 0, הערך השני הוא ערך מספר 1, וכן הלאה.

המערך של מהירויות הרקעים נקרא background_hspeed (בַּקְגְרַאוּנְד הוֹרִיזוֹנְטְל סְפִּיד) - מהירות אופקית של רקע. המהירות של רקע מספר 0 (הכוכבים) היא background_hspeed[0], המהירות של רקע מספר 1 (ההרים) היא background_hspeed[1], והמהירות של רקע מספר 2 (העננים) היא background_hspeed[2].

לכן בארוע היצירה של החייזר, נשנה את פעולת המהירות האופקית ונכתוב background_hspeed[1] בשדה speed.


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



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

 חציית גבולות החדר

איך יודעים איזה גבול החייזר חוצה? לפי הקורדינטות שלו. אם הוא חוצה את הגבול השמאלי של החדר, אז x שלו יהיה קטן מ-0. לכן לפני פעולת היפוך התנועה האנכית נכניס פעולת בדיקת ערך של משתנה תמונה:gmaker_if_var.png, ובחלון אפשרויות הפעולה נכתוב x בשדה variable, נכתוב 0 בשדה value, ובשדה operation נכתוב larger than (לַרְגֵ'ר זֵן) - גדול מ. ככה החייזר יהפוך את התנועה האנכית רק אם x שלו גדול מ-0.

ומה לגבי הצד הימני של החדר? אם החייזר חוצה את הגבול הימני של החדר, אז x שלו יהיה כמעט כמו רוחב החדר - מספיק גדול כדי שהקצה הימני של החייזר יהיה בנקודה ש-x שלה גדול מגודל החדר. בשביל לדעת איפה הקצה הימני של החייזר צריך להוסיף ל-x שלו את רוחב דמות החייזר. רוחב הדמות נתון במשתנה sprite_width (סְפְּרַייט וּוִידְס') - רוחב הדמות. ורוחב החדר נתון במשתנה room_width (רוּם וּוִידְס') - רוחב החדר. ככה שהחייזר חוצה את הגבול הימני אם x + sprite_width גדול מ-room_width. או בניסוח אחר: אם x גדול מהביטוי room_width - sprite_width. לכן נוסיף עוד פעולת בדיקת ערך משתנה לפני פעולת היפוך התנועה האנכית. שוב נכתוב x בשדה variable, אבל הפעם נכתוב room_width - sprite_width בשדה value, ובשדה operation נכתוב smaller than (סְמוֹלֵר זֵן) - קטן מ. ככה החייזר יהפוך את התנועה האנכית שלו רק אם הוא לא חוצה את הגבול הימני של החדר.

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


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

אובייקט ניהול

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

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

תמונה:gmaker_object_visible.png

עכשיו אפשר לתכנת את מנהל החייזרים ליצור חייזרים. נתחיל בארוע היצירה שלו תמונה:gmaker_create.png - נוסיף לארוע הזה את הפעולה ליצירת מופע שנמצאת בלשונית main1: תמונה:gmaker_create_instance.png.

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

אם יוצרים אובייקט, צריך גם למחוק אותו. לכן נוסיף לאובייקט החייזר ארוע יציאה מהחדר - Outside room תמונה:gmaker_other.png. בארוע הזה נשים את פעולת מחיקת המופע תמונה:gmaker_destroy_button.png. אבל לפני שמוחקים את החייזר צריך לוודא שהוא באמת יצא מהחדר מימין, ולא שהוא נמצא משמאל לחדר ועומד להכנס אליו עוד מעט. לכן לפני המחיקה נכניס פעולת בדיקת משתנה תמונה:gmaker_if_var.png ובה נוודא ש-x גדול מ-0.


תמונה:gmaker_test_save.png מיד עם תחילת המשחק אמור להכנס חייזר משמאל.



 יצירת חייזרים נוספים

חייזר אחד זה נחמד, אבל אנחנו רוצים שיופיעו עוד ועוד חייזרים! יש הרבה דרכים לעשות את זה, ואנחנו נעשה את זה בעזרת שעון מעורר: נוסיף לארוע היצירה של מנהל החייזרים פעולת כיוון שעון מעורר תמונה:gmaker_clock_button.png. נכוון אותו לצלצל עוד 150 צעדים, למשל. בארוע צלצול השעון תמונה:gmaker_alarm.png ניצור עוד חייזר באמצעות הפעולה ליצירת מופע תמונה:gmaker_create_instance.png ונוסיף גם עוד פעולת כיוון שעון מעורר תמונה:gmaker_clock_button.png, כדי שכל פעם יופיע עוד חייזר. (אפשר פשוט להעתיק את הפעולות מארוע היצירה)


תמונה:gmaker_test_save.png כל כמה שניות אמור להופיע חייזר חדש.



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

כדי לקצר את הזמן שעובר בין חייזר לחייזר נצטרך להשתמש במשתנה. לכן נוסיף לארוע היצירה של מנהל החייזרים פעולת קביעת ערך של משתנה תמונה:gmaker_set_var.png. נקרא למשתנה alien_interval (אֵילִיֵין אִינְטֵרְוַול) - מרווח חייזרים. הערך שניתן לו יהיה 150. עכשיו נשנה את פעולת כיוון השעון לחכות alien_interval צעדים - גם בארוע היצירה וגם בארוע צלצול השעון.

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


תמונה:gmaker_test_save.png עכשיו המרווחים בין הופעת חייזר אחד לשני אמורים להתקצר. אבל מה קורה אם מחכים עוד ועוד? כמה קצר יכול להיות המרווח?



המרווח בין החייזרים מתקצר ומתקצר עד שהוא מגיע ל-0. אבל אז, פעולת כיוון השעון ל-0 צעדים גורמת לכיבוי השעון המעורר. לכן לפני שמקטינים את המרווח צריך להוסיף פעולת בדיקת ערך של משתנה תמונה:gmaker_if_var.png . בפעולה הזאת צריך לוודא ש-alien_interval גדול מ-5. ככה המרווח בין החייזרים יקטן עוד ועוד, עד שהוא יגיע לחמישה צעדים, ואז הוא ישאר חמישה צעדים.


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


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

לירות בחייזרים

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

  1. פעולת מחיקה תמונה:gmaker_destroy_button.png בשביל למחוק את החייזר.
  2. פעולת מחיקה נוספת תמונה:gmaker_destroy_button.png בשביל למחוק את הלייזר - בפעולה הזאת צריך ש-Applies to יהיה Other (הלייזר).

תמונה:gmaker_test_save.png עכשיו אפשר לירות בחייזרים ולהעלים אותם.



נחמד להרוג את החייזרים, אבל יהיה נחמד יותר לפוצץ אותם!

\ פיצוץ

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

אז ניצור אובייקט חדש לפיצוץ. נקרא לו alien_explosion (אֵילִיֵין אֵקְסְפְּלוֹזֵ'ן) - פיצוץ חייזר. הדמות שלו צריכה להיות הנפשה של פיצוץ. מצאתי הנפשה מתאימה בספריית הדמויות החופשית SpriteLib:

(כדאי לשמור אותה בתיקיית הדמויות של Game Maker.)

אבל אם נשתמש בדמות הזו, לא נראה הנפשה אלא תמונה של כל שלבי הפיצוץ זה ליד זה! מה עושים?

 רצועות

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

בשביל לקרוא רצועה, צריך לפתוח את חלון תכונות הדמות ולהקליק על הכפתור לעריכת הדמות - Edit Sprite. ייפתח לנו חלון עריכת דמות. בחלון הזה נלך לתפריט השמאלי - תפריט File. שם נבחר Create from Strip (קְרִיאֵייט פְרוֹם סְטְרִיפ) - הכן מתוך רצועה. אז נתבקש לבחור את הקובץ שבו הרצועה - צריך לבחור הקובץ שבו שמרת את התמונה שמופיעה כאן למעלה.

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

השדות הכי חשובים הם ארבעת השדות הראשונים:

  1. number of images (נַמְבֵּר אוֹף אִימַגֵ'ז) - מספר התמונות. ברצועה שלנו יש שבע תמונות, אז בשדה הזה נכתוב 7.
  2. images per row (אִימַגֵ'ז פֵּר רוֹוּ) - תמונות בכל שורה. ברצועה שלנו כל שבע התמונות הן בשורה אחת, לכן גם כאן נכתוב 7.
  3. image width (אִימַג' וּוִידְס') - רוחב תמונה. ברצועה הזאת הרוחב של כל אחת מהתמונות הוא 54 פיקסלים, לכן נכתוב כאן 54. (אם לא יודעים את הרוחב אפשר לנסות מספרים שונים ולראות מה מתאים לפי המסגרות שמופיעות בצד ימין. נסו ותראו!)
  4. image height (אִימַג' הַייט) - גובה תמונה. גם הגובה של התמונות שלנו הוא 54 פיקסלים, לכן גם כאן נכתוב 54.

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

כשגמרת לבדוק, צריך להקליק על הכפתור OK. אז נוכל לראות את התמונות של שלבי הפיצוץ נפרדות זו מזו. כדי לראות את הדמות מונפשת, אפשר לסמן בצד שמאל את תיבת הסימון Show Preview (שוֹוּ פְּרִיוְויוֹ) - תצוגה מוקדמת.

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

 הצגת הפיצוץ

בשביל שאובייקט הפיצוץ יוצג, צריך לשנות את הפעולות בארוע ההתנגשות של החייזר בלייזר: במקום פעולת המחיקה שמוחקת את החייזר, צריך לשים פעולת שינוי אובייקט תמונה:gmaker_change_instance.png, ובה להפוך את החייזר לפיצוץ. בשדה perform events נסמן yes כדי שנוכל לבצע פעולות בארוע המחיקה של החייזר ובארוע היצירה של הפיצוץ.


תמונה:gmaker_test_save.png מה קורה כשיורים בחייזר?



אם לא אומרים להנפשה לעצור, היא פשוט תחזור שוב ושוב. לכן צריך לעצור את ההנפשה אחרי הפעם הראשונה שהיא מוצגת, ולמחוק את הפיצוץ. איך יודעים מתי ההנפשה סיימה להציג את כל התמונות? יש ארוע שקורה אז. לכן נלך לחלון תכונות האובייקט של הפיצוץ, ושם נוסיף את הארוע הזה: בסוג ארוע Other תמונה:gmaker_other.png נבחר מהתפריט שצץ את הארוע Animation end (אַנִימֵיישֵן אֵנְד) - סוף ההנפשה. בארוע הזה צריך לעשות פעולה אחת: למחוק את הפיצוץ תמונה:gmaker_destroy_button.png.


תמונה:gmaker_test_save.png עכשיו אפשר לפוצץ יפה את החייזרים!



איך נראה הפיצוץ? אם הוא נראה לך מהיר מדי או איטי מדי, אפשר לשנות את מהירות ההנפשה: להוסיף לאובייקט הפיצוץ ארוע יצירה תמונה:gmaker_create.png ובו לשים פעולת קביעת דמות תמונה:gmaker_change_sprite_button.png בשביל לכוונן את מהירות ההנפשה.

] סכנה: חייזרים!

עד עכשיו החללית היתה בטוחה - החייזרים לא עשו לה כלום. בואו נשנה את זה.


עכשיו תורך:

כשהחללית מתנגשת בחייזר, לתכנת אותה להתפוצץ בפיצוץ גדול:

תמונה:big-explosion-strip.png

(ברצועה הזו יש 12 תמונות בגובה 64 פיקסלים וברוחב 64 פיקסלים.)

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


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


עכשיו תורך:

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

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

כשקליע פוגע בחללית, היא צריכה להתפוצץ (והקליע עצמו צריך להמחק).

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




תמונה:gmaker_test_save.png מה קורה אחרי שהחללית מתפוצצת?


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

 
 

תמונה:gmaker_test_save.png עכשיו לא צריכה להיות שגיאה אחרי שהחללית מתפוצצת.



לפעמים חייזר יורה על החללית כשהוא נמצא מעליה או מתחתיה, ואז החללית לא יכולה לברוח מהקליע, כי היא לא יכולה לנוע הצידה - רק למעלה או למטה. לכן כדאי להכניס לפני הירייה של החייזר עוד בדיקה, הפעם פעולת בדיקת ערך של משתנה תמונה:gmaker_if_var.png, כדי לתת לחייזר לירות רק אם הוא במרחק מספיק גדול משמאל לחללית: אם x שלו קטן יותר (smaller than) מאשר הביטוי spaceship.x - 30.


עכשיו תורך:

להוסיף צלילים ליריות ולפיצוצים.

 

חישוב ניקוד וחיים

בואו נוסיף ניקוד וחיים:

  1. נוסיף לאובייקט הפיצוץ של החייזר ארוע מחיקה תמונה:gmaker_destroy.png ובו נעלה את הניקוד באמצעות פעולת קביעת הניקוד תמונה:gmaker_set_score.png. (לא לשכוח לסמן את תיבת הסימון Relative כדי להוסיף עוד נקודות לניקוד הנוכחי.)
  2. נוסיף גם לאובייקט הפיצוץ של החללית ארוע מחיקה תמונה:gmaker_destroy.png ובו נקטין את מספר החיים שנותרו באמצעות פעולת קביעת החיים תמונה:gmaker_lives.png. (לא לשכוח לסמן את תיבת הסימון Relative)
  3. נוסיף שם גם פעולה להשהיה תמונה:gmaker_sleep.png ואחריה פעולה ליצירת חללית חדשה תמונה:gmaker_create_instance.png באותו מקום שהיה הפיצוץ (קורדינטות 0,0 וסימון Relative).

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


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



{{{גודל}}}

כדאי לדעת:

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

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



 תצוגת ניקוד וחיים

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

ארוע הציור של אובייקט תמונה:gmaker_draw.png, הוא אירוע שמתרחש בכל פעם ש Game Maker צריך לצייר את האובייקט מחדש (כשהאוביקט נוצר, כשהוא מוסתר ע"י משהו ואחרי זה נגלה בחזרה וכו'). כברירת מחדל, גיים מייקר יצייר את ה sprite שלו במקום שבו הוא נמצא, אבל אפשר לשים פקודות בארוע כדי לתת לאובייקט לצייר משהו אחר במקום. לכן נצטרך אובייקט חדש בשביל להציג את הניקוד והחיים. נקרא לאובייקט הזה score_panel (סְקוֹר פַּנֵל) - לוח ניקוד. אמנם מבחינת המשחק אין צורך בדמות לאובייקט הזה, אבל נוח יותר למצוא אותו ברשימת המשאבים אם יש לו דמות. לכן כדאי לדעתי לתת לו דמות, למשל זאת: תמונה:gmaker_score_panel.png.

לאובייקט הזה נוסיף את ארוע הציור תמונה:gmaker_draw.png. איזה פעולות נבצע בארוע הזה? נתחיל מהצגת הניקוד: נוסיף את פעולת ציור הניקוד שנמצאת בלשונית score תמונה:gmaker_draw_score_button.png.

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

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


תמונה:gmaker_test_save.png רואים את הניקוד בחלון המשחק?



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

  1. לחזור לארוע הציור של לוח הניקוד.
  2. לעבור ללשונית draw (דרוֹוּ) - צייר. כל הפעולות בלשונית הזו נועדו לציור.
  3. לשים לפני פעולת ציור הניקוד את פעולת קביעת צבע הציור תמונה:gmaker_set_color.png.
  4. בחלון אפשרויות הפעולה, לבחור לבן או צבע בהיר אחר.

תמונה:gmaker_test_save.png עכשיו רואים יותר טוב?


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

 חיים

בואו נוסיף גם תצוגת חיים.

קודם כל, נאתחל את מספר החיים:

  1. נוסיף לאובייקט לוח הניקוד ארוע Game start תמונה:gmaker_other.png.
  2. בארוע הזה נוסיף את פעולת קביעת החיים תמונה:gmaker_lives.png ובה נאתחל את מספר החיים ל-3.
  3. נוסיף גם את הפעולה לקביעת כותרת החלון תמונה:gmaker_set_caption.png ובה נסמן לא להראות (don't show) את הניקוד, כי הוא ממילא מוצג בחלון עצמו.

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

  1. נוסיף לאובייקט לוח החיים את ארוע No more lives תמונה:gmaker_other.png.
  2. בארוע הזה נשים את הפעולות להצגת טבלת האלופים תמונה:gmaker_highscore.png ולהתחלת המשחק מחדש תמונה:gmaker_restart.png.

עכשיו נלך חזרה לארוע הציור, ונוסיף את הפעולה להצגת מספר החיים כתמונה, שנמצאת בלשונית score: תמונה:gmaker_draw_lives_button.png. בחלון אפשרויות הפעולה נבחר בדמות החללית בשדה image. את הקורדינטות נצטרך לשנות, כדי לא לצייר את החיים על גבי הניקוד: בשדה y נכתוב 20 ואז החיים יוצגו מתחת לניקוד. לא לשכוח לסמן את תיבת הסימון Relative כדי שהחיים יוצגו איפה שהצבנו את לוח הניקוד.

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


תמונה:gmaker_test_save.png רואים חלליות? מה קורה כשהחללית מתפוצצת?



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

 דמות לתצוגת החיים

בשביל להציג חללית קטנה, צריך ליצור דמות מתאימה:

  1. לשכפל את דמות החללית (ברשימת המשאבים משמאל, להקליק על דמות החללית באמצעות הכפתור הימני של העכבר, ובתפריט שצץ לבחור Duplicate).
  2. לשנות את שם הדמות המשוכפלת לשם אחר, למשל small_spaceship_sprite (סְמוֹל סְפֵּייסְשִיפּ סְפְּרַייט) - דמות חללית קטנה.
  3. להקליק על הכפתור לעריכת הדמות Edit Sprite.
  4. בחלון עריכת הדמות, ללכת לתפריט Transform ולבחור Scale כדי לשנות את גודל הציור.
  5. לבחור גודל קטן יותר לתמונה. אפשר לכתוב בדיוק את הגודל בשדות מצד ימין, או פשוט לכתוב 50 במקום 100 בשדות האחוזים משמאל, כדי להקטין את התמונה לחצי הגודל. בסוף להקיש אנטר או להקליק על OK.
  6. ללכת לתפריט Images ולבחור Crop כדי לקצץ את השוליים הריקים של התמונה. בשדה Border אפשר לכתוב להשאיר גבול של פיקסל אחד סביב התמונה.
  7. להקליק על ה-וי הירוק כדי לחזור לחלון הרגיל של Game Maker.

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


תמונה:gmaker_test_save.png עכשיו החלליות שמראות כמה חיים נשארו קטנות יותר מהחללית האמיתית של המשחק.



 עוד פעולות ציור

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

  1. נוסיף לארוע הציור של לוח הניקוד את הפעולה לציור מלבן תמונה:gmaker_draw_rect_button.png.
  2. בחלון אפשרויות הפעולה, נכתוב איפה לצייר את המלבן: x1 ו-x2 אומרים באיזה מרחק מהקצה השמאלי יהיו הקוים האנכיים, y1 ו-y2 אומרים באיזה מרחק מהקצה העליון יהיו הקוים האופקיים. השדה filled אומר אם למלא את המלבן בצבע או לא. נשנה את השדה הזה ל-outline כדי לצייר רק את מסגרת המלבן. לא לשכוח לסמן Relative כדי שהמלבן יופיע איפה שלוח הניקוד מוצב.

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


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

 עדכון רשימת העבודה

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

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

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

אז רשימת העבודה המעודכנת היא:

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

פצצות חכמות

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

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

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

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

 אובייקט פצצה

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


תמונה:gmaker_test_save.png הפצצה עוד לא עושה כלום, אבל איך היא נראית?



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

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

תמונה:gmaker_test_save.png עכשיו הפצצה אמורה לנוע עם ההרים.



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

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

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

 איסוף פצצות

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

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

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

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

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

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


{{{גודל}}}

כדאי לדעת:

איזה הבדלים יש בין משתנה גלובלי למשתנה של אובייקט?

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


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

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


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



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

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


עכשיו תורך:

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


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

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

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


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



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

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


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



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

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

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

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


{{{גודל}}}

כדאי לדעת:

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


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

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

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

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

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

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

 הערות

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

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

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


{{{גודל}}}

כדאי לדעת:

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



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


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



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

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

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

 ניהול הפצצות

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


עכשיו תורך:

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


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

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

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

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

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

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

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



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


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

 

בריאות

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

את זה נוכל לעשות בעזרת הבריאות. הבריאות היא משתנה גלובלי, כמו החיים והניקוד. בתחילת המשחק הערך של הבריאות הוא 100, כי השחקן בריא במאה אחוזים. אנחנו נוריד 25 אחוזי בריאות בכל התנגשות, ואז אחרי 4 התנגשויות הבריאות תגיע ל-0.

בשביל זה צריך לשנות את ארוע ההתנגשות של החללית בחייזר:

  1. למחוק את פעולת שינוי החללית לפיצוץ.
  2. להוסיף פעולת שינוי החייזר לפיצוץ תמונה:gmaker_change_instance.png (לבחור Other ב-Applies to).
  3. להוסיף את הפעולה לקביעת הבריאות שנמצאת בלשונית score תמונה:gmaker_set_health_button.png. בפעולה הזאת נרצה להקטין את הבריאות, לכן צריך לכתוב -25 בשדה value ולסמן Relative.

כשהבריאות מגיעה ל-0, נרצה שהחללית תתפוצץ. לכן נוסיף לחללית ארוע סוף הבריאות - No more health מסוג ארוע Other תמונה:gmaker_other.png. בארוע הזה נשים פעולה להפוך את החללית לפיצוץ תמונה:gmaker_change_instance.png.

בארוע היצירה של החללית תמונה:gmaker_create.png נחזיר את הבריאות שלה ל-100 באמצעות הפעולה לקביעת הבריאות תמונה:gmaker_set_health_button.png.


תמונה:gmaker_test_save.png עכשיו החללית מתפוצצת רק אחרי ארבע התנגשויות.



 הצגת הבריאות

בואו נוסיף את הבריאות ללוח הניקוד: בארוע הציור של אובייקט לוח הניקוד נוסיף את הפעולה לציור הבריאות שנמצאת בלשונית score תמונה:gmaker_draw_health_button.png. הפעולה הזאת מציירת פס בריאות, כמו הפס משמאל.

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

  • x1 ו-x2 הם הקצוות האופקיים של פס הבריאות - איפה הוא מתחיל ואיפה הוא נגמר. נכתוב 0 בשדה x1 כדי שפס הבריאות יתחיל משמאל, ו-100 בשדה x2 כדי שהפס יהיה בגודל 100 פיקסלים.
  • y1 ו-y2 הם הקצוות האנכיים של פס הבריאות. נכתוב 60 בשדה y1 כדי שפס הבריאות יופיע מתחת לפצצות, ונכתוב 70 בשדה y2 כדי שהפס יהיה ברוחב 10 פיקסלים.
  • back color (בַּק קוֹלוֹר) - צבע הרקע. כאן אפשר לבחור את צבע הרקע של הפס. אני בעד להשאיר את השדה הזה על הערך none כדי שהרקע יהיה שקוף, אבל אפשר לשים שם צבע אחר אם זה נראה לך יותר טוב.
  • bar color (בַּר קוֹלוֹר) - צבע הפס. כאן אפשר לקבוע את צבע פס הבריאות עצמו. כדאי להשאיר את זה על green to red (גְרִין טוּ רֵד) - מירוק לאדום. ככה הפס יהיה ירוק כשהבריאות מלאה, אדום כשהיא כמעט ריקה, וגווני צהוב וכתום כשהיא איפשהו באמצע.

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


תמונה:gmaker_test_save.png אפשר לראות את הבריאות, אבל היא מוצגת מחוץ ללוח הניקוד.



 שיפור לוח הניקוד

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

לכן נשנה את הקורדינטות של פעולות הציור:

  • בפעולת ציור הבריאות, נשנה את y1 ל-20 ואת y2 ל-30 כדי שהבריאות תופיע מיד מתחת לניקוד. את x2 נשנה ל-115 כדי שפס הבריאות יימשך עד לסוף החללית השלישית ויראה יותר מסודר.
  • בפעולת ציור החיים, נשנה את y ל-40 כדי שהחלליות יופיעו מתחת לבריאות.
  • בסדרת הפעולות לציור הפצצה, נאתחל את bomb_x ל-130 ונשנה את y ל-20 כדי שהפצצות יופיעו מימין לפס הבריאות.
  • המסגרת של לוח הניקוד צריכה להיות בגודל מתאים בשביל להקיף את כל הפצצות. איך יודעים עד לאן מגיעה תצוגת הפצצות? בעזרת המשתנה bomb_x שמשמש לציור הפצצות - בסוף תצוגת הפצצות הוא מראה את המקום שבו היה אפשר לצייר את הפצצה הבאה (אילו היתה) ולכן הוא מראה בדיוק איפה גמרנו לצייר פצצות. לכן בפעולת ציור המלבן נשנה את x2 ל-bomb_x.

תמונה:gmaker_test_save.png עכשיו לוח הניקוד אמור להתאים לתוכנו.

פעלת מגן

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

תמונה:small_spaceship_with_sheild.png


אתגר:

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


בשביל להפעיל את המגן צריך:

  1. להוסיף דמות חדשה למשחק (אפשר לקרוא לה spaceship_with_shield) ולטעון אליה את התמונה של החללית עם המגן.
  2. להוסיף לחללית ארוע להפעלת המגן - למשל לחיצה על מקש Shift תמונה:gmaker_key_down.png.
  3. כשהארוע הזה קורה, לשנות את דמות החללית תמונה:gmaker_change_sprite_button.png ולכוון שעון מעורר תמונה:gmaker_clock_button.png (אפשר ל-100 צעדים). חשוב להשתמש בשעון מעורר אחר מזה שמשמש ליריות!
  4. להוסיף ארוע צלצול שעון מעורר תמונה:gmaker_alarm.png ובו לשנות את דמות החללית חזרה לדמות הרגילה שלה. תמונה:gmaker_change_sprite_button.png.

תמונה:gmaker_test_save.png לחיצה על מקש Shift צריכה להראות את החללית עם מגן סביבה למשך כמה שניות.



\ מצב מוגן

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

  1. בארוע היצירה של החללית נאתחל ל-0 משתנה בשם shield_on באמצעות הפעולה לקביעת ערך של משתנה תמונה:gmaker_set_var.png. זה יסמן שהמגן כרגע לא מופעל (0 = לא).
  2. בארוע לחיצה על מקש Shift נשנה את shield_on ל-1, כדי לסמן "כן" - המגן מופעל. (שוב בעזרת הפעולה לקביעת ערך של משתנה תמונה:gmaker_set_var.png)
  3. בארוע צלצול השעון המעורר, נשנה את shield_on חזרה ל-0 כדי לסמן "לא" - המגן לא מופעל. תמונה:gmaker_set_var.png
  4. בארוע ההתנגשות בקליע של חייזר, נוסיף את הפעולה לבדיקת ערך של משתנה תמונה:gmaker_if_var.png לפני הפעולה שהופכת את החללית לפיצוץ. בפעולה הזו נבדוק אם shield_on שווה ל-0, כדי שהחללית תתפוצץ רק אם היא בלי מגן.
  5. גם בארוע ההתנגשות בחייזר, נוסיף את הפעולה לבדיקת ערך של משתנה תמונה:gmaker_if_var.png לפני הפעולה שמורידה את הבריאות. גם כאן נבדוק ש- shield_on שווה ל-0, כדי שהבריאות תרד רק אם החללית בלי מגן.

תמונה:gmaker_test_save.png עכשיו החללית באמת מוגנת כשמפעילים את המגן.



{{{גודל}}}

כדאי לדעת:

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

מתי כדאי לשנות את האובייקט ומתי כדאי להשתמש במשתנה מצב?

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

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



 איסוף מגינים

החללית תצטרך לאסוף מגינים כמו שהיא אוספת פצצות.


עכשיו תורך:

להפוך את המגן לחיזוק שהחללית יכולה לאסוף:

  1. ליצור אובייקט shield (שִילְד) - מגן. אפשר להשתמש בתמונה הזאת בשביל הדמות שלו: תמונה:power_shield.png.
  2. לתכנת את מנהל הפריטים ליצור גם מגינים, כמו שהוא יוצר פצצות וחייזרים. (לא לשכוח למחוק את המגינים שיוצאים מהחדר).
  3. לתכנת את החללית לאסוף מגינים (בארוע ההתנגשות עם המגן) ולשמור את מספר המגינים שהיא אספה במשתנה גלובלי global.shields (לזכור לאתחל אותו בתחילת המשחק).
  4. לתת לחללית להפעיל את המגן רק אם יש לה מגינים (כלומר, רק אם global.shields גדול מ-0). ואז להקטין ב-1 את מספר המגיניים שנשארו לה.


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


עכשיו תורך:

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


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


עכשיו נערוך את הפעולות שהעתקנו כדי שיציירו מגינים ולא פצצות:

  1. קודם כל, נשנה את ההערה תמונה:gmaker_comment_button.png כדי להסביר מה הפעולות עושות.
  2. אחר כך נשנה את הפעולה לקביעת ערך של משתנה תמונה:gmaker_set_var.png - במקום לאתחל את המשתנה bomb_x, נאתחל משתנה בשם shield_x.
  3. את פעולת החזרה תמונה:gmaker_repeat_button.png נשנה כך שהיא תחזור global.shields פעמים על הבלוק שאחריה.
  4. את פעולת ציור הדמות תמונה:gmaker_draw_sprite_button.png נשנה כך שתצייר את דמות המגן המוקטן. את השדה x נשנה ל- shield_x, ואת השדה y נשנה ל-40 כדי שהמגינים יופיע מתחת לפצצות.
  5. את הפעולה האחרונה לקביעת ערך של משתנה תמונה:gmaker_set_var.png נשנה כך שהיא תגדיל את המשתנה shield_x ב-20.

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



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

בפעולת ציור המלבן תמונה:gmaker_draw_rect_button.png, במקום לכתוב bomb_x בשדה x2, נכתוב שם: max( bomb_x, shield_x ). הפונקציה max() (מַקְס - קיצור של מקסימום - הכי גדול) מחזירה את הערך הכי גדול מבין הפרמטרים, ככה שנקבל את הגדול מבין bomb_x ו-shield_x.


תמונה:gmaker_test_save.png נסו לאסוף יותר מגינים מפצצות כדי לראות אם המסגרת מתאימה לתוכן.



אתגר:

לנסות להשתמש בפעולות הציור שעוד לא השתמשנו בהן:

  • הפעולה לציור טקסט תמונה:gmaker_draw_text_button.png
  • הפעולה לציור אליפסה תמונה:gmaker_draw_ellipse_button.png
  • הפעולה לציור קו תמונה:gmaker_draw_line_button.png

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



השלמנו את המגינים. בואו נראה איפה אנחנו ברשימת העבודה:

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

אויבים

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


עכשיו תורך:

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




עכשיו תורך:

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



 יצירת אויבים שונים

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

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


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



עכשיו תורך:

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



הוראות שימוש

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

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

תמונה:gmaker_game_info.png

מתקבל חלון שבו אפשר לכתוב מה שרוצים. מה כדאי לכתוב?

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

כמובן שאפשר לבחור לכתוב דברים אחרים; העיקר שהמשתמש יוכל לדעת איך משחקים ועל מה ללחוץ.


תמונה:gmaker_test_save.png לחיצה על F1 מראה את המידע שכתבת.



{{{גודל}}}

כדאי לדעת:

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


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


תמונה:gmaker_test_save.png עכשיו הוראות השימוש יופיעו לפני תחילת המשחק.



 אריזת המשחק

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


כדי להכניס את התמונות האלה (או אחרות) למשחק, עושים הקלקה כפולה על Global Game Settings ברשימת המשאבים.

בחלון הגדרות המשחק שנפתח יש למעלה ארבע לשוניות. אנחנו צריכים לעבור ללשונית השלישית: Loading (לוֹוּדִינְג) - טעינה.

כדי לשנות את האייקון של המשחק צריך להקליק על הכפתור Change Icon שבתחתית החלון. בחלון שנפתח צריך לבחור את האייקון ששמרת (או ציירת).

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


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



זהו! עכשיו אפשר ללכת לתפריט File ולבחור Create Executable כדי לשמור את המשחק כתוכנית שגם אחרים יוכלו להפעיל

קרידיט לויקיספר
  הודעות אפשר גם לשלוח לאיימל ioman1@walla.com