תכנות לילדים באמצעות Game Maker/חייזרים/גרסה להדפסה
משחקי יריות בחייזרים הביאו את משחקי המחשב לקהל הרחב (וגם גרמו ביפן למחסור במטבעות להפעלת מכונות משחק). הידוע מכולם הוא המשחק פולשים מהחלל. משחק ידוע נוסף הוא Defender, שאפשר לשחק באתר מידוויי או להוריד למחשב גירסה חופשית שלו. יש עוד הרבה משחקי יריות דומים, וגם אנחנו ניצור משחק דומה ל-Defender, אבל לא בדיוק.
לפני שמתחילים: מה יהיה במשחק
[עריכה]במשחק שניצור תהיה חללית שטסה מימין לשמאל דרך העולם של המשחק, בדומה לחללית במשחק Defender. החללית צריכה לירות באויבים שהיא פוגשת בדרך ולהתחמק ממכשולים. מדי פעם היא תוכל לאסוף חיזוקים שיביאו לה יכולות מיוחדות, כמו מגן או תחמושת.
לכן רשימת העבודה נראית כרגע כך:
- חללית שנעה מימין לשמאל
- יריות
- אויבים
- מכשולים
- חיזוקים - מגן, תחמושת
- חיזרים
(במשחק הזה נמשיך את הדרך שעשינו במשחקים הקודמים, ולכן כדאי להזכר בדברים שראינו במהלך הדרך הזו: סיכום המסלול לפונג וגם סיכום המסלול לפקמן)
מסלול ההתקדמות
[עריכה]"טעות היא דלת הכניסה לתגלית חדשה." (ג'יימס ג'ויס)
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזריםחלק מהתמונות בפרק זה לקוחות מספריית התמונות החופשית SpriteLib של ארי פלדמן.
צעד 1: החללית
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
אובייקט החללית
[עריכה]דבר ראשון, צריך ליצור חדר חדש כדי שיהיה איך לבדוק את החללית. עכשיו אפשר ליצור אובייקט חללית ולשים אותו בחדר. אפשר לצייר דמות חללית בעצמך, או להשתמש בתמונה שלמטה. לאובייקט החללית כדאי לקרוא spaceship (סְפֵּייסְשִיפּ) - חללית.
כדאי להפעיל את המשחק ולראות את החללית בחדר.
החללית אמורה לנוע שמאלה כל הזמן, ולנוע למעלה ולמטה כשלוחצים על החצים. התנועה למעלה ולמטה היא כמו מה שעשינו כבר בעבר, לכן בטח יהיה לך קל לתכנת אותה בעצמך.
עכשיו תורכם: לתכנת את אובייקט החללית לנוע למעלה ולמטה כשלוחצים על מקשי החצים. |
צריך למנוע מהחללית לצאת מהמסך אם היא עולה גבוה מדי או יורדת נמוך מדי. בעבר עשינו את זה באמצעות אובייקט קיר או גבול שחוסם את היציאה. הפעם נשתמש בדרך אחרת.
השארת אובייקט בגבולות החדר
[עריכה]במשחק פונג ראינו כבר שכשאובייקט יוצא מהמסך קורה ארוע Outside room (אַוּוטְסַייד רוּם) - מחוץ לחדר. אנחנו רוצים ארוע קצת שונה: הארוע שקורה כאשר האובייקט רק מתחיל לצאת מהמסך אבל עדיין לא יצא ממנו כולו. כשזה יקרה, נרצה לעצור את החללית ולהחזיר אותה חזרה לתוך החדר. לכן צריך:
- ללחוץ על הוספת ארוע.
- לבחור בסוג ארוע Other (אַזֵר) - אחר.
- בתפריט שצץ, לבחור Intersect boundary (אִינְטֵרְסֵקְט בַּאוּנְדְרִי) - חוצה את הגבול (של החדר).
- להוסיף את פעולת התנועה הפשוטה בשביל לעצור את החללית.
נסו להזיז את החללית עד למעלה וגם עד למטה. מה קורה כשהיא מגיעה לקצה? מה קורה אם גם אז ממשיכים לנסות להזיז אותה?
החללית זזה קצת יותר מדי. לא מספיק לעצור אותה - צריך גם להזיז אותה חזרה לתוך החדר. איך מזיזים חזרה?
במשחק פקמן ראינו שהמיקום של אובייקט נקבע באמצעות המשתנים x ו-y - הקורדינטות של האובייקט. לכל אובייקט יש עוד שני משתני קורדינטות, שנותנים את המיקום שבו היה האובייקט בצעד הקודם:
- xprevious (אִיקְס פְּרִיוְויֵיס) - x הקודם.
- yprevious (וּוַי פְּרִיוְויֵיס) - y הקודם.
לכן כדי להזיז את החללית חזרה לתוך החדר אפשר להשתמש בפעולה לקביעת ערך של משתנה , ושם לשנות את הערך של המשתנה y ל-yprevious. (את x לא צריך לשנות, כי ממילא מדובר רק בתנועה אנכית - למעלה ולמטה).
מה קורה עכשיו כשמנסים להוציא את החללית מהמסך?
החללית יודעת לזוז למעלה ולמטה כשלוחצים על החצים. עכשיו צריך לתכנת אותה לזוז שמאלה כל הזמן. אבל מה זה אומר לזוז שמאלה כל הזמן? אם החללית תזוז שמאלה בלי לעצור, היא תצא מהמסך!
אם נסתכל במשחק Defender נוכל לראות שלא החללית זזה על המסך, אלא שהמסך עצמו (והדברים שיש בו) הם אלה שזזים, בעוד החללית נשארת במקום. זה כמו שרואים בטלוויזיה מכונית נוסעת: המכונית נשארת במקום קבוע על המסך, והרקע של התמונה זז בכיוון ההפוך לכיוון הנסיעה שלה.
בשביל ליצור את התחושה שהחללית נעה כל הזמן שמאלה, ניצור רקע שנע כל הזמן ימינה - צעד 2: רקע
צעד 2: רקע
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
הוספת רקע לחדר
[עריכה]לחדרים במשחק אפשר להוסיף תמונת רקע שתופיע מאחורי האובייקטים בחדר. תמונת רקע היא סוג של משאב, כמו שיש משאבים מסוג צליל או דמות. בשביל להוסיף רקע לחדר, צריך קודם ליצור משאב חדש מסוג רקע באמצעות הקלקה על הכפתור להוספת רקע בסרגל הכלים: .
בחלון תכונות הרקע שנפתח מקליקים על הכפתור Load Background (לוֹוּד בַּקְגְרַאוּנְד) - טען רקע. אז אפשר לבחור מבין הרקעים שמגיעים עם Game Maker.
לדעתי אף אחד מהרקעים האלה לא מתאים במיוחד למשחק שלנו, לכן נראה לי עדיף להשתמש בתמונה שלמטה. בשביל להשתמש בתמונה הזאת, צריך להקליק עליה בכפתור הימני של העכבר, ומהתפריט שצץ לבחור "שמור תמונה בשם" או "Save Picture As". ואז צריך לבחור איפה על המחשב שלך לשמור את התמונה. כדאי לשמור אותה בתיקיית הרקעים של Game Maker, שנמצאת בדרך כלל בתיקייה C:\Program Files\Game_Maker6\Backgrounds.
כדאי לשים לב שבחלון תכונות הרקע כתוב גם הגודל שלו: Width (וִוידְס') - רוחב, ו-Height (הַייט) - גובה. עוד מעט נראה למה זה חשוב ומה עושים עם זה.
לא לשכוח לתת לרקע שיצרת שם משמעותי, למשל stars (סְטַרְז) - כוכבים.
עכשיו תורכם: לנסות להוסיף רקע לחדר בעצמך אם לא תצליח תוכל להסתכל למטה תמיד. |
אחרי שבחרת רקע, אפשר להוסיף אותו לחדר:
- לפתוח את חלון תכונות החדר באמצעות הקלקה-כפולה על החדר ברשימת המשאבים שמשמאל.
- בצד שמאל של חלון תכונות החדר יש את האזור להוספת אובייקטים. אם מסתכלים מעליו, רואים שיש שם בעצם שלוש לשוניות, ואנחנו עד עכשיו תמיד עבדנו רק בלשונית הראשונה: objects. עכשיו צריך לעבור ללשונית השלישית: backgrounds (בַּקְגְרַאוּנְדְס) - רקעים.
- בלשונית הזו יש הרבה דברים שאפשר לעשות עם הרקע. כרגע נעשה רק שניים:
- להוריד את הסימון בתיבת הסימון Draw background color (דְרוֹוּ בַּקְגְרַאוּנְד קוֹלוֹר) - צייר צבע רקע. כי אם אנחנו שמים תמונה ברקע, אז אין סיבה לצייר גם צבע - הצבע ממילא יוסתר על ידי התמונה.
- לבחור את הרקע של הכוכבים ברשימת הרקעים, כמו בתמונה משמאל.
אתגר: להוסיף רקע למשחק פונג ולחדרים במשחק הלבֵנים שיצרת. |
כדאי לדעת: בחלון תכונות החדר יש שלוש לשוניות: הראשונה objects בשביל להציב אובייקטים בחדר, האחרונה backgrounds בשביל לקבוע את הרקע של החדר. מה עם הלשונית האמצעית?בלשונית settings אפשר לקבוע תכונות כלליות של החדר:
בדרך כלל לא נצטרך לשנות את הערכים האלה, ונוכל להתעלם מהם. |
רקע נע
[עריכה]רצינו רקע שנע משמאל לימין בשביל ליצור תחושה שהחללית זזה כל הזמן מימין לשמאל. בשביל שהרקע ינוע, נחזור לחלון תכונות החדר וללשונית backgrounds. בתחתית החלון יש שני שדות שקובעים את התנועה של הרקע:
- Hor. Speed (הוֹרִיזוֹנְטְל סְפִּיד) - מהירות אופקית: מהירות התנועה משמאל לימין.
- Vert. Speed (וֵרְטִיקְל סְפִּיד) - מהירות אנכית: מהירות התנועה מלמעלה למטה.
אנחנו רוצים שהרקע ינוע משמאל לימין, לכן צריך לכתוב בשדה Hor. Speed איזשהו מספר (למשל 4).
עכשיו הכוכבים שברקע אמורים לנוע ולתת תחושה שהחללית זזה מימין לשמאל.
לא רע. החללית נראית נעה, פחות או יותר. אבל אפשר לשפר את זה: אם תסתכלו החוצה מחלון של מכונית נוסעת, תוכלו לראות שדברים קרובים (כמו עצים או תמרורים) חולפים על פניכם מהר, ולעומתם דברים רחוקים (כמו הרים) חולפים על פניכם לאט יותר. את התופעה הזאת אפשר לחקות במחשב כדי לתת תחושת תנועה יותר אמינה.
לכן נוסיף עוד רקע, שיהיה קרוב יותר מהכוכבים, למשל הרים.
את התמונה הזאת צריך לשמור במחשב שלך (עדיף בתיקיית הרקעים של 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.
שקיפות
[עריכה]מעל להרים יש שטח לבן. השטח הזה צריך להיות שקוף, כדי שיראו דרכו את הכוכבים. בשביל שהוא יהיה שקוף, צריך לפתוח את חלון תכונות הרקע באמצעות הקלקה-כפולה על ההרים ברשימת המשאבים.
באמצע החלון יש תיבת סימון Transparent. מסמנים אותה כדי שהרקע יהיה שקוף. אבל להרים יש שני צבעים - לבן וכחול - איזה מהם יוצג ואיזה יהיה שקוף? כמו בדמויות, גם ברקעים Game Maker בוחר את הצבע השקוף לפי הצבע של הפיקסל בנקודה השמאלית-תחתונה של התמונה. כרגע הצבע של הפיקסל הזה הוא כחול. בשביל לשנות את זה, צריך להקליק על
הכפתור Edit Background (אֵדִיט בַּקְגְרַאוּנְד) - ערוך רקע. אז מקבלים את חלון עריכת התמונות המוכר, ושם אפשר לצייר בלבן על הפיקסל שבפינה השמאלית-תחתונה.
עכשיו האויר מעל ההרים שקוף. אבל מה לגבי התנועה?
ההרים צריכים לנוע קצת יותר מהר מהכוכבים, כי הם יותר קרובים מהם. בשביל זה צריך לכתוב מספר מתאים בשדה Hor. Speed שבחלון תכונות החדר. אפשר לתת להרים מהירות גדולה יותר מזו של הכוכבים, או שאפשר להקטין את המהירות של הכוכבים. כדאי לנסות מספרים שונים ולראות מה יוצא הכי טוב כשמפעילים את המשחק. (אני אישית בחרתי במהירות 2 לכוכבים ומהירות 4 להרים, אבל אולי לך מספרים אחרים יראו טוב יותר.)
תחושת עומק
[עריכה]אם שני רקעים יוצרים תחושת תנועה טובה יותר מאשר רקע אחד, למה לא שלושה רקעים או יותר? אפשר לעשות עד שמונה רקעים, אבל צריך להזהר לא להגזים - אם יש יותר מדי דברים זזים על המסך, השחקן עלול לא לשים לב לדברים החשובים כמו אויבים, יריות, וחפצים לאיסוף. ובכל זאת, הכנתי עוד רקע שלא יהיה בולט מדי ושיוכל לחזק עוד יותר את תחושת התנועה:
עכשיו תורכם: להוסיף למשחק את הרקע של העננים, ולתכנת אותו לנוע קצת יותר מהר מהרקע של ההרים (למשל במהירות 5). כדאי לקרוא לו clouds (קְלַאוּדְס) - עננים. |
עכשיו יש במשחק כבר שלושה רקעים שנעים מאחורי החללית. אפשר ליצור תחושה מעניינת של עומק אם העננים יסתירו את החללית, כאילו הם יותר קרובים אלינו ממנה.
בשביל שהרקע של העננים יופיע מעל לאובייקטים במשחק, צריך ללכת לחלון תכונות החדר, ושם לבחור מרשימת הרקעים את רקע מספר 2 (הרקע השלישי - העננים). מעל לשם הרקע יש תיבת סימון Foreground image (פוֹרְגְרַאוּנְד אִימְג') - תמונה קדמית. את התיבה הזאת צריך לסמן, ואז העננים יופיע לפני האובייקטים שבחדר ויסתירו אותם, כאילו שהם קרובים יותר.
עכשיו החללית אמורה להראות כאילו היא טסה בין ההרים לעננים.
כדאי לדעת: עברנו כמעט על כל הדברים בלשונית backgrounds שבחלון תכונות החדר. נשארו רק עוד שתי תיבות סימון; אמנם לא נשתמש בהן כרגע, אבל כדאי להכיר אותן:
|
השלמנו את תכנות התנועה של החללית. רשימת העבודה עכשיו היא:
חללית שנעה מימין לשמאל- יריות
- אויבים
- מכשולים
- חיזוקים - מגן, תחמושת
החללית כבר עפה, עכשיו היא צריכה גם לירות - צעד 3: יריות
צעד 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 כדי לסמן "לא".)
עכשיו נוכל להשתמש במשתנה הזה בשביל להחליט אם לירות או לא:
- בארוע הלחיצה על מקש רווח, נוסיף את הפעולה לבדיקת ערך של משתנה (הפעולה הזו נמצאת בתחתית הלשונית control). בחלון אפשרויות הפעולה נכתוב can_shoot בשדה variable, ובשדה value נכתוב 1, כדי לבדוק אם עכשיו אפשר לירות. את השדה operation נשאיר על equal to. כך הפעולה הבאה ברשימה תתבצע רק אם can_shoot שווה ל-1 (כלומר: אם אפשר לירות).
- אם באמת אפשר לירות, נרצה לבצע יותר מפעולה אחת. לכן נוסיף את הפעולות לתחילת וסיום בלוק אחרי פעולת הבדיקה.
- את הפעולה ליצירת מופע של הלייזר נזיז לתוך הבלוק, כדי שקרן הלייזר תיווצר רק אם אפשר לירות.
- אחרי שהקרן נוצרה (כלומר: החללית ירתה) צריך לשנות את מצב החללית ללא יורה. לכן נוסיף את הפעולה לקביעת ערך של משתנה ובאפשרויות הפעולה נכתוב לשנות את הערך של המשתנה can_shoot ל-0.
- ולבסוף, נוסיף פעולת כיוון שעון מעורר . כדי שיזכיר לנו לשנות את החללית חזרה למצב ירייה. נכוון אותו לצלצל עוד 5 צעדים.
- עכשיו צריך להוסיף גם ארוע צלצול שעון . ובו לשנות את משתנה המצב can_shoot בחזרה ל-1, כדי שאחרי 5 צעדים החללית תוכל שוב לירות.
אפשר לראות משמאל את הרשימה המלאה של הפעולות בארוע הלחיצה על מקש רווח.
לחצו על הרווח במשך כמה זמן. אפשר לשנות את מספר הצעדים עד לצלצול השעון המעורר כדי שהיריות יהיו צפופות יותר או מרווחות יותר.
השלמנו עוד פריט ברשימת העבודה:
חללית שנעה מימין לשמאליריות- אויבים
- מכשולים
- חיזוקים - מגן, תחמושת
עכשיו נעשה את המשחק מעניין - צעד 4: אויבים
צעד 4: אויבים
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
חייזרים
[עריכה]בפקמן ראינו שלא פשוט לתכנת אויבים חכמים. לכן נתחיל עם אויב פשוט יחסית: חייזר שכל מה שהוא עושה זה לעלות ולרדת, ואולי לירות על החללית של השחקן. ניצור בשבילו אובייקט בשם alien (אֵילִיֵין - חייזר). אפשר להשתמש בדמות שלמטה, או ליצור דמות בעצמך. לא לשכוח להוסיף חייזר או שניים לחדר, כדי שנוכל לבדוק אותו.
בארוע היצירה של החייזר נוסיף לו את פעולת התנועה הפשוטה ושם נסמן את החץ למעלה והחץ למטה, כדי שהחייזר ינוע או למעלה או למטה. בשדה speed כדאי לכתוב מהירות קטנה יותר מהמהירות שנתת לחללית לעלות ולרדת, כדי שהשחקן יוכל להתחמק מהחייזרים.
כדי שהחייזר לא יצא מהמסך, נוסיף לו את ארוע חציית גבול המסך Intersect boundary . בארוע הזה נחזיר אותו חזרה לתוך החדר כמו שעשינו לחללית: נוסיף את פעולת קביעת ערך של משתנה , ושם נשנה את הערך של המשתנה y ל-yprevious. אבל לא נסתפק בזה: נוסיף גם את פעולת היפוך התנועה האנכית שנמצאת בלשונית move: . הפעולה הזו גורמת לאובייקט שנע למעלה לנוע למטה, ולאובייקט שנע למטה לנוע למעלה.
אם החייזר נע למעלה ולמטה בעולם המשחק, אנחנו צריכים לראות אותו זז ימינה, כמו הרקע, כי המבט שלנו זז יחד עם החללית. לכן נוסיף לארוע היצירה של החייזר את פעולת התנועה האופקית שנמצאת בלשונית move: . הפעולה הזו קובעת את המהירות שבה החייזר ינוע ימינה. לכן בחלון אפשרויות הפעולה נכתוב בשדה speed את אותה מהירות שנתנו להרים.
עכשיו החייזר אמור להראות כאילו הוא יורד לקרקע ועולה חזרה.
משתנה מהירות הרקע
[עריכה]מה יקרה אם בעתיד נרצה לשנות את מהירות התנועה? למשל, אם נרצה שהמשחק יהיה מהיר יותר או איטי יותר? למרבה המזל יש משתנה למהירות הרקע, ואפשר פשוט לכתוב את המשתנה הזה בתור המהירות האופקית בארוע היצירה של החייזר.
אבל איזה רקע? הרי יש לנו שלושה רקעים, ולכל אחד מהם יש מהירות אחרת!
המהירויות של הרקעים הן לא במשתנים רגילים, אלא במשתנה מסוג מערך. משתנה מסוג מערך מכיל יותר ממספר אחד - הוא יכול להכיל 2, 10 או אפילו 100 ערכים שונים. לכל אחד מהערכים האלה יש מספר סידורי: הערך הראשון הוא ערך מספר 0, הערך השני הוא ערך מספר 1, וכן הלאה.
המערך של מהירויות הרקעים נקרא background_hspeed (בַּקְגְרַאוּנְד הוֹרִיזוֹנְטְל סְפִּיד) - מהירות אופקית של רקע. המהירות של רקע מספר 0 (הכוכבים) היא background_hspeed[0], המהירות של רקע מספר 1 (ההרים) היא background_hspeed[1], והמהירות של רקע מספר 2 (העננים) היא background_hspeed[2].
לכן בארוע היצירה של החייזר, נשנה את פעולת המהירות האופקית ונכתוב background_hspeed[1] בשדה speed.
השינוי שעשינו הוא refactoring, לכן המשחק אמור להתנהג בדיוק כמו קודם. מה קורה כשהחייזר מגיע לצד ימין של החדר?
כשהחייזר מגיע לגבול הימני של החדר קורה ארוע חציית גבול החדר, ואז הוא הופך את המהירות האנכית שלו - שוב ושוב בכל צעד. צריך לשנות את הפעולות בארוע הזה כך שהמהירות האנכית לא תתהפך אם החייזר חוצה את הגבול הימני או השמאלי.
חציית גבולות החדר
[עריכה]איך יודעים איזה גבול החייזר חוצה? לפי הקורדינטות שלו. אם הוא חוצה את הגבול השמאלי של החדר, אז x שלו יהיה קטן מ-0. לכן לפני פעולת היפוך התנועה האנכית נכניס פעולת בדיקת ערך של משתנה , ובחלון אפשרויות הפעולה נכתוב 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 (סְמוֹלֵר זֵן) - קטן מ. ככה החייזר יהפוך את התנועה האנכית שלו רק אם הוא לא חוצה את הגבול הימני של החדר.
ולבסוף, אחרי שתי פעולות הבדיקה צריך לזכור להכניס לבלוק את שתי הפעולות שמחזירות את החייזר לחדר, כדי ששתיהן יתבצעו רק אם הבדיקות הצליחו.
עכשיו החייזר אמור לצאת מהחדר בצורה יפה, בלי קפיצות.
החייזר יוצא יפה יפה מהחדר. ומה עכשיו? צריך שיופיעו עוד חייזרים! מאיפה הם יבואו? - צעד 5: יצירת חייזרים
צעד 5: יצירת חייזרים
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
אובייקט ניהול
[עריכה]ראינו שאובייקט יכול ליצור אובייקטים אחרים (כשתכנתנו את החללית ליצור קרני לייזר). בשביל ליצור עוד אויבים, נוסיף אובייקט חדש למשחק ונקרא לו alien_manager (אֵילִיֵין מַנַגֵ'ר) - מנהל החייזרים. כל מה שהאובייקט הזה יעשה זה ליצור חייזרים, לכן הוא אפילו לא צריך דמות. למרות זאת, לדעתי כדאי לתת לו דמות כדי שיהיה קל לזהות אותו ברשימת המשאבים, לכן לקחתי בשבילו את הדמות הזו: .
בשביל שמנהל החייזרים יוכל לבצע פעולות, צריך לשים מופע שלו בחדר (ואפשר בהזדמנות למחוק את המופע של החייזר). לא משנה איפה בחדר הוא יהיה - ממילא זה לא ישפיע על מה שהוא יעשה. מצד שני, המשתמש לא אמור לראות על המסך את מנהל החייזרים. לכן בחלון תכונות האובייקט של מנהל החייזרים צריך להוריד את הסימון מתיבת הסימון Visible (וִיזִיבְּל) - נראה לעין. ככה מנהל החייזרים אמנם יהיה בחדר, אבל הוא יהיה אובייקט נסתר והמשתמש לא יראה אותו.
עכשיו אפשר לתכנת את מנהל החייזרים ליצור חייזרים. נתחיל בארוע היצירה שלו - נוסיף לארוע הזה את הפעולה ליצירת מופע שנמצאת בלשונית main1: .
בחלון אפשרויות הפעולה נבחר ליצור אובייקט מסוג חייזר. איפה ניצור אותו? בשדה x נכתוב -50 כדי שהחייזר בדיוק ייכנס לחדר משמאל. בשדה y נכתוב random(room_height - 50) כדי להגריל מיקום מקרי בין הקצה העליון של החדר כמעט עד לקצה התחתון.
אם יוצרים אובייקט, צריך גם למחוק אותו. לכן נוסיף לאובייקט החייזר ארוע יציאה מהחדר - Outside room . בארוע הזה נשים את פעולת מחיקת המופע . אבל לפני שמוחקים את החייזר צריך לוודא שהוא באמת יצא מהחדר מימין, ולא שהוא נמצא משמאל לחדר ועומד להכנס אליו עוד מעט. לכן לפני המחיקה נכניס פעולת בדיקת משתנה ובה נוודא ש-x גדול מ-0.
מיד עם תחילת המשחק אמור להכנס חייזר משמאל.
יצירת חייזרים נוספים
[עריכה]חייזר אחד זה נחמד, אבל אנחנו רוצים שיופיעו עוד ועוד חייזרים! יש הרבה דרכים לעשות את זה, ואנחנו נעשה את זה בעזרת שעון מעורר: נוסיף לארוע היצירה של מנהל החייזרים פעולת כיוון שעון מעורר . נכוון אותו לצלצל עוד 150 צעדים, למשל. בארוע צלצול השעון ניצור עוד חייזר באמצעות הפעולה ליצירת מופע ונוסיף גם עוד פעולת כיוון שעון מעורר , כדי שכל פעם יופיע עוד חייזר. (אפשר פשוט לשחזר את השעון בכך שנרשום 0 וכך הוא יחזור על עצמו)
כל כמה שניות אמור להופיע חייזר חדש.
כדי שהמשחק יהיה מאתגר יותר ככל שמשחקים יותר, נרצה שהזמן שעובר בין חייזר לחייזר ילך ויתקצר. ככה בהתחלה יהיה לשחקן זמן "לנשום" בין חייזר לחייזר, אבל בהמשך החייזרים יופיעו יותר בצפיפות והשחקן יצטרך להתאמץ בשביל להלחם בהם.
כדי לקצר את הזמן שעובר בין חייזר לחייזר נצטרך להשתמש במשתנה. לכן נוסיף לארוע היצירה של מנהל החייזרים פעולת קביעת ערך של משתנה . נקרא למשתנה alien_interval (אֵילִיֵין אִינְטֵרְוַול) - מרווח חייזרים. הערך שניתן לו יהיה 150. עכשיו נשנה את פעולת כיוון השעון לחכות alien_interval צעדים - גם בארוע היצירה וגם בארוע צלצול השעון.
בארוע צלצול השעון נרצה לקצר את המרווח בין החייזרים, לכן נוסיף גם לו פעולת קביעת ערך של משתנה . הפעם נרצה להקטין את הערך של המרווח, לכן ניתן לו את הערך -5 ונסמן Relative - ככה המרווח יקטן כל פעם בחמישה צעדים.
עכשיו המרווחים בין הופעת חייזר אחד לשני אמורים להתקצר. אבל מה קורה אם מחכים עוד ועוד? כמה קצר יכול להיות המרווח?
המרווח בין החייזרים מתקצר ומתקצר עד שהוא מגיע ל-0. אבל אז, פעולת כיוון השעון ל-0 צעדים גורמת לכיבוי השעון המעורר. לכן לפני שמקטינים את המרווח צריך להוסיף פעולת בדיקת ערך של משתנה . בפעולה הזאת צריך לוודא ש-alien_interval גדול מ-5. ככה המרווח בין החייזרים יקטן עוד ועוד, עד שהוא יגיע לחמישה צעדים, ואז הוא ישאר חמישה צעדים.
אחרי שמחכים הרבה זמן החייזרים יהיו מאוד צפופים, אל הם עדיין ימשיכו להופיע.
יכול להיות שהחייזרים צפופים מדי. אולי כדאי להפסיק להקטין את המרווח עוד לפני לפני שהוא מגיע לחמישה צעדים - כדאי לשחק עם הערך של פעולת הבדיקה עד שמגיעים לערך שנראה לך טוב.
יש חללית, יש חייזרים, עכשיו אפשר לתת להם להלחם זה בזה - צעד 6: פיצוצים
צעד 6: פיצוצים
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
לירות בחייזרים
[עריכה]איך יורים בחייזר? משגרים לעברו קרן לייזר. אם קרן הלייזר פוגעת בו, יהיה ארוע התנגשות בין החייזר ללייזר. לכן נוסיף לחייזר ארוע התנגשות בלייזר . בארוע הזה נשים שתי פעולות:
- פעולת מחיקה בשביל למחוק את החייזר.
- פעולת מחיקה נוספת בשביל למחוק את הלייזר - בפעולה הזאת צריך ש-Applies to יהיה Other (הלייזר).
עכשיו אפשר לירות בחייזרים ולהעלים אותם.
נחמד להרוג את החייזרים, אבל יהיה נחמד יותר לפוצץ אותם!
פיצוץ
[עריכה]מה זה פיצוץ? הפיצוץ מופיע במקום שבו מת חייזר, הוא מציג דמות מונפשת לזמן קצר, ואז הוא נעלם. בזמן הקצר של קיומו, הוא לא עושה כלום - אי אפשר לירות בו, הוא לא יורה בחזרה, וכו'. לכן פיצוץ הוא אובייקט - אובייקט שונה מהחייזר כי הוא מתנהג אחרת ממנו.
אז ניצור אובייקט חדש לפיצוץ. נקרא לו alien_explosion (אֵילִיֵין אֵקְסְפְּלוֹזֵ'ן) - פיצוץ חייזר. הדמות שלו צריכה להיות הנפשה של פיצוץ. מצאתי הנפשה מתאימה בספריית הדמויות החופשית SpriteLib:
(כדאי לשמור אותה בתיקיית הדמויות של Game Maker.)
אבל אם נשתמש בדמות הזו, לא נראה הנפשה אלא תמונה של כל שלבי הפיצוץ זה ליד זה! מה עושים?
רצועות
[עריכה]דרך מקובלת לשמור דמויות מונפשות היא באמצעות strip (סְטְרִיפּ) - רצועה, תמונה בצורת פס ארוך שמכיל את כל שלבי ההנפשה זה ליד זה. Game Maker יכול לקרוא רצועות כאלה וליצור מהן דמויות מונפשות.
בשביל לקרוא רצועה, צריך לפתוח את חלון תכונות הדמות ולהקליק על הכפתור לעריכת הדמות - Edit Sprite. ייפתח לנו חלון עריכת דמות. בחלון הזה נלך לתפריט השמאלי - תפריט File. שם נבחר Create from Strip (קְרִיאֵייט פְרוֹם סְטְרִיפ) - הכן מתוך רצועה. אז נתבקש לבחור את הקובץ שבו הרצועה - צריך לבחור הקובץ שבו שמרת את התמונה שמופיעה כאן למעלה.
אחרי שבחרת את התמונה יופיע חלון גדול עם הרבה שדות למלא. מה עושים כאן? קודם כל לוקחים נשימה עמוקה. זה יותר פשוט ממה שזה נראה. כל השדות האלה בסך הכל אומרים איך לקרוא את התמונה כדי למצוא בתוכה את ההנפשה (כי לפעמים שמים כמה רצועות הנפשה בתמונה אחת גדולה).
השדות הכי חשובים הם ארבעת השדות הראשונים:
- number of images (נַמְבֵּר אוֹף אִימַגֵ'ז) - מספר התמונות. ברצועה שלנו יש שבע תמונות, אז בשדה הזה נכתוב 7.
- images per row (אִימַגֵ'ז פֵּר רוֹוּ) - תמונות בכל שורה. ברצועה שלנו כל שבע התמונות הן בשורה אחת, לכן גם כאן נכתוב 7.
- image width (אִימַג' וּוִידְס') - רוחב תמונה. ברצועה הזאת הרוחב של כל אחת מהתמונות הוא 54 פיקסלים, לכן נכתוב כאן 54. (אם לא יודעים את הרוחב אפשר לנסות מספרים שונים ולראות מה מתאים לפי המסגרות שמופיעות בצד ימין. נסו ותראו!)
- image height (אִימַג' הַייט) - גובה תמונה. גם הגובה של התמונות שלנו הוא 54 פיקסלים, לכן גם כאן נכתוב 54.
את כל השדות האחרים אפשר להשאיר על 0. אבל אם מעניין אותך מה אפשר לעשות איתם, כדאי לך לנסות לכתוב שם מספרים שונים ולראות איך זה משפיע.
כשגמרת לבדוק, צריך להקליק על הכפתור OK. אז נוכל לראות את התמונות של שלבי הפיצוץ נפרדות זו מזו. כדי לראות את הדמות מונפשת, אפשר לסמן בצד שמאל את תיבת הסימון Show Preview (שוֹוּ פְּרִיוְויוֹ) - תצוגה מוקדמת.
זהו - מקליקים על ה-וי הירוק ויש לנו דמות מונפשת של פיצוץ. עכשיו אפשר לחזור לאובייקט הפיצוץ ולסמן לו להשתמש בדמות הזו.
הצגת הפיצוץ
[עריכה]בשביל שאובייקט הפיצוץ יוצג, צריך לשנות את הפעולות בארוע ההתנגשות של החייזר בלייזר: במקום פעולת המחיקה שמוחקת את החייזר, צריך לשים פעולת שינוי אובייקט , ובה להפוך את החייזר לפיצוץ. בשדה perform events נסמן yes כדי שנוכל לבצע פעולות בארוע המחיקה של החייזר ובארוע היצירה של הפיצוץ.
אם לא אומרים להנפשה לעצור, היא פשוט תחזור שוב ושוב. לכן צריך לעצור את ההנפשה אחרי הפעם הראשונה שהיא מוצגת, ולמחוק את הפיצוץ. איך יודעים מתי ההנפשה סיימה להציג את כל התמונות? יש ארוע שקורה אז. לכן נלך לחלון תכונות האובייקט של הפיצוץ, ושם נוסיף את הארוע הזה: בסוג ארוע Other נבחר מהתפריט שצץ את הארוע Animation end (אַנִימֵיישֵן אֵנְד) - סוף ההנפשה. בארוע הזה צריך לעשות פעולה אחת: למחוק את הפיצוץ .
עכשיו אפשר לפוצץ יפה את החייזרים!
איך נראה הפיצוץ? אם הוא נראה לך מהיר מדי או איטי מדי, אפשר לשנות את מהירות ההנפשה: להוסיף לאובייקט הפיצוץ ארוע יצירה ובו לשים פעולת קביעת דמות בשביל לכוונן את מהירות ההנפשה.
סכנה: חייזרים!
[עריכה]עד עכשיו החללית היתה בטוחה - החייזרים לא עשו לה כלום. בואו נשנה את זה.
עכשיו תורכם: כשהחללית מתנגשת בחייזר, לתכנת אותה להתפוצץ בפיצוץ גדול:(ברצועה הזו יש 12 תמונות בגובה 64 פיקסלים וברוחב 64 פיקסלים.) תזכורת: צריך לתכנת אובייקט פיצוץ שמוחק את עצמו בארוע סוף ההנפשה. כשהחללית מתנגשת בחייזר, צריך להפוך אותה לאובייקט הפיצוץ הזה. |
עכשיו המשחק קצת יותר מעניין. בואו נעשה אותו אפילו יותר מאתגר!
החייזרים לא יכולים לירות לעבר מה שלא קיים. לכן לפני שחייזר מנסה לירות, צריך להכניס את הפעולה לבדיקת מספר המופעים ולוודא שמספר המופעים של החללית גדול מ-0.
עכשיו לא צריכה להיות שגיאה אחרי שהחללית מתפוצצת.
לפעמים חייזר יורה על החללית כשהוא נמצא מעליה או מתחתיה, ואז החללית לא יכולה לברוח מהקליע, כי היא לא יכולה לנוע הצידה - רק למעלה או למטה. לכן כדאי להכניס לפני הירייה של החייזר עוד בדיקה, הפעם פעולת בדיקת ערך של משתנה , כדי לתת לחייזר לירות רק אם הוא במרחק מספיק גדול משמאל לחללית: אם x שלו קטן יותר (smaller than) מאשר הביטוי spaceship.x - 30.
עכשיו תורכם: להוסיף צלילים ליריות ולפיצוצים. |
החללית יודעת לפוצץ ולהתפוצץ. עכשיו אפשר לדאוג לניקוד - צעד 7: ניקוד וחיים
צעד 7: ניקוד וחיים
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
חישוב ניקוד וחיים
[עריכה]בואו נוסיף ניקוד וחיים:
- נוסיף לאובייקט הפיצוץ של החייזר ארוע מחיקה ובו נעלה את הניקוד באמצעות פעולת קביעת הניקוד . (לא לשכוח לסמן את תיבת הסימון Relative כדי להוסיף עוד נקודות לניקוד הנוכחי.)
- נוסיף גם לאובייקט הפיצוץ של החללית ארוע מחיקה ובו נקטין את מספר החיים שנותרו באמצעות פעולת קביעת החיים . (לא לשכוח לסמן את תיבת הסימון Relative)
- נוסיף שם גם פעולה להשהיה ואחריה פעולה ליצירת חללית חדשה באותו מקום שהיה הפיצוץ (קורדינטות 0,0 וסימון Relative).
(נעזוב לרגע את איתחול מספר החיים בתחילת המשחק ואת הטיפול בארוע סוף החיים.)
עכשיו אפשר לצבור נקודות ולחזור לשחק אחרי שהחללית התפוצצה.
כדאי לדעת: למה לשנות את הניקוד והחיים בארוע המחיקה של הפיצוצים ולא בארוע המחיקה של החללית ושל החייזרים?
|
תצוגת ניקוד וחיים
[עריכה]במשחקים הקודמים הצגנו את הניקוד והחיים בכותרת החלון של המשחק. אבל אפשר להציג אותם גם בתוך החלון, ובצורה יותר יפה מאשר סתם במספר. למשל, במקום לכתוב שמספר החיים הוא 3 אפשר להציג 3 חלליות קטנות. את זה אפשר לבצע בעזרת אירוע הציור של האובייקט.
ארוע הציור של אובייקט , הוא אירוע שמתרחש ממש בסוף כל צעד, כש Game Maker מצייר את המסך ואת כל האובייקטים. כברירת מחדל, גיים מייקר יצייר את ה sprite שלו במקום שבו הוא נמצא, אבל אפשר לשים פקודות בארוע כדי לתת לאובייקט לצייר משהו אחר במקום. לכן נצטרך אובייקט חדש בשביל להציג את הניקוד והחיים. נקרא לאובייקט הזה score_panel (סְקוֹר פַּנֵל) - לוח ניקוד. אמנם מבחינת המשחק אין צורך בדמות לאובייקט הזה, אבל נוח יותר למצוא אותו ברשימת המשאבים אם יש לו דמות. לכן כדאי לדעתי לתת לו דמות, למשל זאת: .
לאובייקט הזה נוסיף את ארוע הציור . איזה פעולות נבצע בארוע הזה? נתחיל מהצגת הניקוד: נוסיף את פעולת ציור הניקוד שנמצאת בלשונית score .
בחלון אפשרויות הפעולה צריך לכתוב איפה יוצג הניקוד (באיזה קורדינטות). נשאיר את זה על 0,0 ורק נסמן את תיבת הסימון Relative כדי שהניקוד יוצג במקום בחדר שבו נציב את לוח הניקוד, ולא בפינה השמאלית-עליונה של החדר. השדה caption קובע מה יופיע ליד הניקוד. למרבה הצער, כשכותבים שם אותיות עבריות הן לא מוצגות במשחק אז נשאיר את השדה הזה כפי שהוא.
עכשיו צריך רק להציב את לוח הניקוד בחדר. (לדעתי כדאי לשים אותו משמאל למטה, שלא יפריע למשחק.)
הניקוד מוצג באותיות שחורות. בשביל לראות אותו יותר טוב, צריך לשנות את הצבע שבו מציירים:
- לחזור לארוע הציור של לוח הניקוד.
- לעבור ללשונית draw (דרוֹוּ) - צייר. כל הפעולות בלשונית הזו נועדו לציור.
- לשים לפני פעולת ציור הניקוד את פעולת קביעת צבע הציור .
- בחלון אפשרויות הפעולה, לבחור לבן או צבע בהיר אחר.
אפשר להזיז את מיקום לוח הניקוד בחדר, ולשנות את צבע הניקוד עד שזה יראה טוב.
חיים
[עריכה]בואו נוסיף גם תצוגת חיים.
קודם כל, נאתחל את מספר החיים:
- נוסיף לאובייקט לוח הניקוד ארוע Game start .
- בארוע הזה נוסיף את פעולת קביעת החיים ובה נאתחל את מספר החיים ל-3.
- נוסיף גם את הפעולה לקביעת כותרת החלון ובה נסמן לא להראות (don't show) את הניקוד, כי הוא ממילא מוצג בחלון עצמו.
בהזדמנות זו, נטפל גם במה שקורה כשנגמרים החיים:
- נוסיף לאובייקט לוח החיים את ארוע No more lives .
- בארוע הזה נשים את הפעולות להצגת טבלת האלופים ולהתחלת המשחק מחדש .
עכשיו נלך חזרה לארוע הציור, ונוסיף את הפעולה להצגת מספר החיים כתמונה, שנמצאת בלשונית score: . בחלון אפשרויות הפעולה נבחר בדמות החללית בשדה image. את הקורדינטות נצטרך לשנות, כדי לא לצייר את החיים על גבי הניקוד: בשדה y נכתוב 20 ואז החיים יוצגו מתחת לניקוד. לא לשכוח לסמן את תיבת הסימון Relative כדי שהחיים יוצגו איפה שהצבנו את לוח הניקוד.
(צריך גם לוודא שלוח הניקוד לא מוצב נמוך מדי בחדר, כדי שיהיה מספיק מקום להציג את החיים.)
רואים חלליות? מה קורה כשהחללית מתפוצצת?
החלליות בלוח הניקוד הן קצת גדולות ועלולות להיראות כאילו יש להן תפקיד במשחק. עדיף להציג חלליות קטנות יותר.
דמות לתצוגת החיים
[עריכה]בשביל להציג חללית קטנה, צריך ליצור דמות מתאימה:
- לשכפל את דמות החללית (ברשימת המשאבים משמאל, להקליק על דמות החללית באמצעות הכפתור הימני של העכבר, ובתפריט שצץ לבחור Duplicate).
- לשנות את שם הדמות המשוכפלת לשם אחר, למשל small_spaceship_sprite (סְמוֹל סְפֵּייסְשִיפּ סְפְּרַייט) - דמות חללית קטנה.
- להקליק על הכפתור לעריכת הדמות Edit Sprite.
- בחלון עריכת הדמות, ללכת לתפריט Transform ולבחור Scale כדי לשנות את גודל הציור.
- לבחור גודל קטן יותר לתמונה. אפשר לכתוב בדיוק את הגודל בשדות מצד ימין, או פשוט לכתוב 50 במקום 100 בשדות האחוזים משמאל, כדי להקטין את התמונה לחצי הגודל. בסוף להקיש אנטר או להקליק על OK.
- ללכת לתפריט Images ולבחור Crop כדי לקצץ את השוליים הריקים של התמונה. בשדה Border אפשר לכתוב להשאיר גבול של פיקסל אחד סביב התמונה.
- להקליק על ה-וי הירוק כדי לחזור לחלון הרגיל של Game Maker.
עכשיו כשיש דמות של חללית קטנה, נלך חזרה לאובייקט לוח הניקוד, לארוע הציור שלו, ונשנה את פעולת ציור החיים: במקום לצייר את דמות החללית, נבחר את דמות החללית הקטנה.
עכשיו החלליות שמראות כמה חיים נשארו קטנות יותר מהחללית האמיתית של המשחק.
עוד פעולות ציור
[עריכה]אפשר לשפר את המראה של לוח הניקוד באמצעות הפעולות בלשונית draw. למשל, בואו נצייר מלבן סביב לוח הניקוד כדי להדגיש אותו:
- נוסיף לארוע הציור של לוח הניקוד את הפעולה לציור מלבן .
- בחלון אפשרויות הפעולה, נכתוב איפה לצייר את המלבן: x1 ו-x2 אומרים באיזה מרחק מהקצה השמאלי יהיו הקוים האנכיים, y1 ו-y2 אומרים באיזה מרחק מהקצה העליון יהיו הקוים האופקיים. השדה filled אומר אם למלא את המלבן בצבע או לא. נשנה את השדה הזה ל-outline כדי לצייר רק את מסגרת המלבן. לא לשכוח לסמן Relative כדי שהמלבן יופיע איפה שלוח הניקוד מוצב.
אפשר לשנות את הקורדינטות של המלבן ולהזיז את מיקום לוח הניקוד עד שזה יראה טוב.
אם רוצים, אפשר להוסיף עוד פעולת קביעת צבע הציור לפני פעולת ציור המלבן, כדי לצייר את המלבן בצבע שונה.
עדכון רשימת העבודה
[עריכה]תכנתנו לוח ניקוד נחמד. בואו נראה איפה אנחנו עומדים ברשימת העבודה:
חללית שנעה מימין לשמאליריותאויבים- מכשולים
- חיזוקים - מגן, תחמושת
מה זה מכשולים? דברים שצריך להמנע מלהתנגש בהם. בעצם החייזרים הם מכשולים כאלה. אז במקום לכתוב מכשולים, בואו נחליף את זה באויבים נוספים, שיעשו דברים אחרים ואולי יהיו יותר מעניינים. ולפני שנתחיל לחשוב על אויבים נוספים, בואו נייצר חיזוקים לחללית כדי שיהיה קל יותר להלחם בכל האויבים האלה.
אז רשימת העבודה המעודכנת היא:
חללית שנעה מימין לשמאליריותאויבים- חיזוקים - מגן, תחמושת
- אויבים נוספים
הגענו לחיזוקים. נתחיל עם משהו מחזק במיוחד - צעד 8: פצצות חכמות
צעד 8: פצצות חכמות
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
פצצות חכמות
[עריכה]בואו נצייד את החללית בפצצות חכמות המפוצצות את כל החייזרים שעל המסך בלי לפגוע בחללית עצמה. החללית תצטרך לאסוף את הפצצות האלה, שיחכו לה מדי פעם בדרך. את הפצצות שהיא אספה נציג בלוח הניקוד.
זה אומר שנצטרך לתכנת:
- אובייקט פצצה חכמה.
- החללית יכולה לאסוף פצצות ולשמור אותן במטען.
- מטען הפצצות מוצג בלוח הניקוד.
- הפצצות מופיעות מדי פעם בדרך.
- הפעלת פצצה חכמה גורמת לכל החייזרים להתפוצץ.
זו רשימת העבודה שלנו לתכנות הפצצות החכמות.
אובייקט פצצה
[עריכה]קודם כל ניצור אובייקט ונקרא לו bomb (בּוֹמְבּ) - פצצה. הכנתי דמות בשבילו, כאן מצד שמאל. בשביל לבדוק את הפצצה, נשים פצצה או שתיים בחדר.
הפצצה עוד לא עושה כלום, אבל איך היא נראית?
הפצצה לא זזה עם ההרים, כמו שחפץ דומם אמור לעשות במשחק. את זה קל לתקן:
עכשיו הפצצה אמורה לנוע עם ההרים.
השלמנו את אובייקט הפצצה. נחזור לרשימת העבודה של הפצצות:
אובייקט פצצה חכמה.- החללית יכולה לאסוף פצצות ולשמור אותן במטען.
- מטען הפצצות מוצג בלוח הניקוד.
- הפצצות מופיעות מדי פעם בדרך.
- הפעלת פצצה חכמה גורמת לכל החייזרים להתפוצץ.
נעבור לפריט הבא ברשימה: לתכנת את החללית לאסוף פצצות.
איסוף פצצות
[עריכה]כשהחללית מגיעה לפצצה, היא אוספת אותה ושומרת אותה אצלה במטען. לכן נוסיף לאובייקט החללית ארוע התנגשות בפצצה . בארוע הזה נשים פעולת מחיקה בשביל למחוק את הפצצה (הפעולה צריכה לפעול על Other).
עכשיו צריך פעולה נוספת, בשביל לסמן שנוספה פצצה למטען של החללית. איזו פעולה זו יכולה להיות?
בשביל לשמור פצצות בחללית, כל מה שצריך זה משתנה שאומר כמה פצצות אספנו. לכן הפעולה שמוסיפה פצצה למטען תהיה הפעולה לקביעת ערך של משתנה .
למשתנה של מספר הפצצות בחללית אפשר לקרוא bombs (בּוֹמְבְּז) - פצצות. אבל יש איתו בעיה: אם נכתוב פשוט bombs אז המשתנה הזה יהיה שייך לחללית. ואז כשהחללית תתפוצץ, גם כל הפצצות שהיא אספה ילכו איתה. היה עדיף שהפצצות יישארו לשחקן גם להמשך המשחק.
אז אולי כדאי לשייך את המשתנה bombs לאובייקט אחר? אולי ללוח הניקוד או למנהל החייזרים - הרי הם לא נמחקים. זה פתרון אפשרי, אבל קצת מוזר. וגם יכול להיות שפעם נרצה שיהיו שני לוחות ניקוד או שני מנהלי חייזרים (למשל אחד מייצר חייזרים שבאים מצד שמאל והשני מצד ימין) ואז כבר לא ברור איפה המשתנה הזה צריך להיות. חוץ מזה, יכול להיות שיהיו כמה חדרים שונים במשחק, ולא בכולם יהיו חייזרים ומנהל חייזרים.
לכן במקרה הזה עדיף שהמשתנה bombs יהיה משתנה גלובלי - משתנה כללי למשחק, שלא שייך לאף אובייקט. כבר השתמשנו בשני משתנים גלובליים, למרות שלא קראנו להם בשם: משתנה החיים ומשתנה הניקוד. גם המשתנים של גודל החדר (room_width ו-room_height) הם משתנים גלובליים.
כדאי לדעת: איזה הבדלים יש בין משתנה גלובלי למשתנה של אובייקט?
|
בשביל שהמשתנה 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 אחרי ציור הפצצה.
איפה אנחנו עומדים ברשימת העבודה של הפצצות?
אובייקט פצצה חכמה.החללית יכולה לאסוף פצצות ולשמור אותן במטען.מטען הפצצות מוצג בלוח הניקוד.- הפצצות מופיעות מדי פעם בדרך.
- הפעלת פצצה חכמה גורמת לכל החייזרים להתפוצץ.
אז עכשיו צריך לדאוג להופעת הפצצות.
ניהול הפצצות
[עריכה]כשרצינו שהחייזרים יופיעו מדי פעם, נתנו לאובייקט מנהל החייזרים ליצור אותם. אפשר לעשות אותו דבר עם הפצצות. אבל הפעם לא חייבים ליצור מנהל פצצות נפרד - אותו מנהל יכול ליצור גם חייזרים וגם פצצות. כדאי רק לשנות לו את השם בהתאם: במקום alien_manager לקרוא לו item_manager (אַייטֵם מַנַגֵ'ר) - מנהל הפריטים.
עכשיו תורכם: להוסיף למנהל הפריטים עוד שעון מעורר ועוד משתנה, וליצור פצצות שיופיעו מדי פעם (אבל לא הרבה כמו החייזרים). לא לשכוח למחוק את הפצצות אחרי שהן יוצאות מהחדר. |
את הפצצות שהצבנו קודם בחדר לצורך הבדיקות אפשר למחוק עכשיו.
נשאר רק הפריט האחרון ברשימת העבודה של הפצצות: הפעלת פצצה חכמה גורמת לכל החייזרים להתפוצץ.
הפעלת פצצה חכמה
[עריכה]קודם כל, צריך להחליט איך מפעילים פצצה חכמה. לדעתי כדאי לעשות את זה בהקשה על אחד המקשים, למשל מקש Control (שבדרך כלל נמצא בשתי הפינות התחתונות של המקלדת). לכן נוסיף לאובייקט החללית ארוע לחיצה על מקש ומהתפריט שצץ נבחר במקש Ctrl.
כשארוע הזה קורה צריך לעשות שני דברים: להקטין ב-1 את מספר הפצצות שיש לחללית, ולפוצץ את כל החייזרים. לכן נצטרך:
- להוסיף את הפעולה לקביעת ערך של משתנה ובה להקטין ב-1 את המשתנה global.bombs (באמצעות סימון Relative).
- להוסיף את הפעולה לשינוי אובייקט . הפעולה הזו צריכה להתבצע על החייזרים, לכן ב-Applies to נסמן object ונבחר מהתפריט את החייזר. בשדה change into נהפוך את החייזרים לאובייקט הפיצוץ של החייזר.
עכשיו אפשר להפעיל פצצה בלחיצה על מקש Control. אבל מה קורה כשמנסים להפעיל פצצה למרות שאין לחללית פצצות?
לפני שמרשים לחללית להפעיל פצצה, צריך לוודא שיש לה בכלל פצצות. לכן לפני שתי הפעולות ששמנו נוסיף פעולה לבדיקת ערך של משתנה . בפעולה הזאת נבדוק שהמשתנה global.bombs גדול מ-0. את שתי הפעולות שאחריה נרצה לבצע רק אם הבדיקה מצליחה, לכן נכניס אותן לבלוק.
עכשיו הפצצות יפעלו רק כשבאמת יש לחללית פצצות להפעיל.
השלמנו את הפצצות החכמות. עכשיו כשיכולת ההתקפה שלה משופרת, בואו נשפר לה גם את ההגנה - צעד 9: בריאות
צעד 9: בריאות
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
בריאות
[עריכה]כשהחללית מתנגשת בחייזר, היא מתפוצצת ואילו הוא ממשיך ללא פגע. בואו נהפוך את היוצרות: החייזר יהיה זה שיתפוצץ, ואילו החללית תוכל להמשיך הלאה. אבל לא ניתן לה להמשיך בכלל בלי להפגע - כל התנגשות כזאת תפגע בה קצת, ואם היא תתנגש בחייזרים יותר מדי פעמים אז גם היא תתפוצץ.
את זה נוכל לעשות בעזרת הבריאות. הבריאות היא משתנה גלובלי, כמו החיים והניקוד. בתחילת המשחק הערך של הבריאות הוא 100, כי השחקן בריא במאה אחוזים. אנחנו נוריד 25 אחוזי בריאות בכל התנגשות, ואז אחרי 4 התנגשויות הבריאות תגיע ל-0.
בשביל זה צריך לשנות את ארוע ההתנגשות של החללית בחייזר:
- למחוק את פעולת שינוי החללית לפיצוץ.
- להוסיף פעולת שינוי החייזר לפיצוץ (לבחור Other ב-Applies to).
- להוסיף את הפעולה לקביעת הבריאות שנמצאת בלשונית score . בפעולה הזאת נרצה להקטין את הבריאות, לכן צריך לכתוב -25 בשדה value ולסמן Relative.
כשהבריאות מגיעה ל-0, נרצה שהחללית תתפוצץ. לכן נוסיף לחללית ארוע סוף הבריאות - No more health מסוג ארוע Other . בארוע הזה נשים פעולה להפוך את החללית לפיצוץ .
בארוע היצירה של החללית נחזיר את הבריאות שלה ל-100 באמצעות הפעולה לקביעת הבריאות .
עכשיו החללית מתפוצצת רק אחרי ארבע התנגשויות.
הצגת הבריאות
[עריכה]בואו נוסיף את הבריאות ללוח הניקוד: בארוע הציור של אובייקט לוח הניקוד נוסיף את הפעולה לציור הבריאות שנמצאת בלשונית score . הפעולה הזאת מציירת פס בריאות, כמו הפס משמאל.
בחלון אפשרויות הפעולה יש 6 שדות:
- x1 ו-x2 הם הקצוות האופקיים של פס הבריאות - איפה הוא מתחיל ואיפה הוא נגמר. נכתוב 0 בשדה x1 כדי שפס הבריאות יתחיל משמאל, ו-100 בשדה x2 כדי שהפס יהיה בגודל 100 פיקסלים.
- y1 ו-y2 הם הקצוות האנכיים של פס הבריאות. נכתוב 60 בשדה y1 כדי שפס הבריאות יופיע מתחת לפצצות, ונכתוב 70 בשדה y2 כדי שהפס יהיה ברוחב 10 פיקסלים.
- back color (בַּק קוֹלוֹר) - צבע הרקע. כאן אפשר לבחור את צבע הרקע של הפס. אני בעד להשאיר את השדה הזה על הערך none כדי שהרקע יהיה שקוף, אבל אפשר לשים שם צבע אחר אם זה נראה לך יותר טוב.
- bar color (בַּר קוֹלוֹר) - צבע הפס. כאן אפשר לקבוע את צבע פס הבריאות עצמו. כדאי להשאיר את זה על green to red (גְרִין טוּ רֵד) - מירוק לאדום. ככה הפס יהיה ירוק כשהבריאות מלאה, אדום כשהיא כמעט ריקה, וגווני צהוב וכתום כשהיא איפשהו באמצע.
כמובן שצריך לסמן Relative כדי שפס הבריאות יופיע במקום בו הצבנו את לוח הניקוד.
אפשר לראות את הבריאות, אבל היא מוצגת מחוץ ללוח הניקוד.
שיפור לוח הניקוד
[עריכה]בואו נדאג שהבריאות תהיה בתוך לוח הניקוד, וגם נדאג לסדר אותו בצורה טובה יותר - כמו הלוח משמאל.
לכן נשנה את הקורדינטות של פעולות הציור:
- בפעולת ציור הבריאות, נשנה את y1 ל-20 ואת y2 ל-30 כדי שהבריאות תופיע מיד מתחת לניקוד. את x2 נשנה ל-115 כדי שפס הבריאות יימשך עד לסוף החללית השלישית ויראה יותר מסודר.
- בפעולת ציור החיים, נשנה את y ל-40 כדי שהחלליות יופיעו מתחת לבריאות.
- בסדרת הפעולות לציור הפצצה, נאתחל את bomb_x ל-130 ונשנה את y ל-20 כדי שהפצצות יופיעו מימין לפס הבריאות.
- המסגרת של לוח הניקוד צריכה להיות בגודל מתאים בשביל להקיף את כל הפצצות. איך יודעים עד לאן מגיעה תצוגת הפצצות? בעזרת המשתנה bomb_x שמשמש לציור הפצצות - בסוף תצוגת הפצצות הוא מראה את המקום שבו היה אפשר לצייר את הפצצה הבאה (אילו היתה) ולכן הוא מראה בדיוק איפה גמרנו לצייר פצצות. לכן בפעולת ציור המלבן נשנה את x2 ל-bomb_x.
עכשיו לוח הניקוד אמור להתאים לתוכנו.
בואו ניתן לחללית עוד חיזוק - צעד 10: מגן
צעד 10: מגן
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
הפעלת מגן
[עריכה]ניתן לחללית עוד חיזוק לאסוף כמו שהיא אוספת פצצות חכמות: מגן שיתן לה למשך כמה שניות הגנה מפני חייזרים ויריות. כשהחללית מוגנת, הדמות שלה תהיה התמונה הזאת:
אתגר: יש לך את כל הידע הדרוש לתכנת בעצמך את המגן. רוצה לנסות? אם זה לא מצליח, אפשר להמשיך לקרוא, ולראות את הדרך שלי לתכנת את המגן. |
בשביל להפעיל את המגן צריך:
- להוסיף דמות חדשה למשחק (אפשר לקרוא לה spaceship_with_shield) ולטעון אליה את התמונה של החללית עם המגן.
- להוסיף לחללית ארוע להפעלת המגן - למשל לחיצה על מקש Shift .
- כשהארוע הזה קורה, לשנות את דמות החללית ולכוון שעון מעורר (אפשר ל-100 צעדים). חשוב להשתמש בשעון מעורר אחר מזה שמשמש ליריות!
- להוסיף ארוע צלצול שעון מעורר ובו לשנות את דמות החללית חזרה לדמות הרגילה שלה. .
לחיצה על מקש Shift צריכה להראות את החללית עם מגן סביבה למשך כמה שניות.
מצב מוגן
[עריכה]אמנם רואים מגן סביב החללית, אבל זה לא מספיק - היא צריכה גם להתנהג בצורה שונה כשהיא מוגנת. את זה נוכל לעשות בעזרת משתנה מצב:
- בארוע היצירה של החללית נאתחל ל-0 משתנה בשם shield_on באמצעות הפעולה לקביעת ערך של משתנה . זה יסמן שהמגן כרגע לא מופעל (0 = לא).
- בארוע לחיצה על מקש Shift נשנה את shield_on ל-1, כדי לסמן "כן" - המגן מופעל. (שוב בעזרת הפעולה לקביעת ערך של משתנה )
- בארוע צלצול השעון המעורר, נשנה את shield_on חזרה ל-0 כדי לסמן "לא" - המגן לא מופעל.
- בארוע ההתנגשות בקליע של חייזר, נוסיף את הפעולה לבדיקת ערך של משתנה לפני הפעולה שהופכת את החללית לפיצוץ. בפעולה הזו נבדוק אם shield_on שווה ל-0, כדי שהחללית תתפוצץ רק אם היא בלי מגן.
- גם בארוע ההתנגשות בחייזר, נוסיף את הפעולה לבדיקת ערך של משתנה לפני הפעולה שמורידה את הבריאות. גם כאן נבדוק ש- shield_on שווה ל-0, כדי שהבריאות תרד רק אם החללית בלי מגן.
עכשיו החללית באמת מוגנת כשמפעילים את המגן.
כדאי לדעת: במשחק פקמן שינינו את ההתנהגות של הרוחות בדרך אחרת: הפכנו אותן לאובייקט אחר. ואילו כאן שינינו את ההתנהגות של החללית באמצעות משתנה מצב שצריך לבדוק לפני שמבצעים חלק מהפעולות. שתי הדרכים האלה טובות בשביל לשנות התנהגות.מתי כדאי לשנות את האובייקט ומתי כדאי להשתמש במשתנה מצב? אם יש הרבה התנהגויות שונות בין שני המצבים, כדאי יותר לשנות אובייקט. אם רוב ההתנהגויות נשארות זהות ורק מעט משתנות, עדיף להשתמש במשתנה מצב. בנוסף, לפעמים יש מצבים שונים שיכולים להתקיים בו-זמנית. למשל, החללית שלנו יכולה להיות במצב ירייה ובמצב אי-ירייה גם כשהמגן מופעל וגם כשלא. כשיש כמה מצבים כאלה, נוח יותר להשתמש במשתני מצב ולא לשנות אובייקט. |
איסוף מגינים
[עריכה]החללית תצטרך לאסוף מגינים כמו שהיא אוספת פצצות.
אם המגינים פועלים, נעבור לתצוגה שלהם בלוח הניקוד:
עכשיו תורכם: ליצור דמות מגן מוקטנת בשביל לוח הניקוד, באותה דרך שבה יצרנו את הדמות המוקטנת של הפצצה. |
כדי לצייר מגינים בלוח הניקוד, נשתמש באותן פעולות כמו הפעולות להצגת הפצצות. בשביל זה נבחר את כל הפעולות של ציור הפצצות (נגרור את העכבר מפעולת ההערה ועד סוף הבלוק, ככה שכל הפעולות שקשורות לציור הפצצות יראו "צבועות"). אז נעתיק אותן (בהקשה על Control+C) ונדביק אותן לפני הפעולות לציור המלבן (נלחץ על פעולה ההערה שלפני ציור המלבן, ואז נקיש Control+V).
עכשיו נערוך את הפעולות שהעתקנו כדי שיציירו מגינים ולא פצצות:
- קודם כל, נשנה את ההערה כדי להסביר מה הפעולות עושות.
- אחר כך נשנה את הפעולה לקביעת ערך של משתנה - במקום לאתחל את המשתנה bomb_x, נאתחל משתנה בשם shield_x.
- את פעולת החזרה נשנה כך שהיא תחזור global.shields פעמים על הבלוק שאחריה.
- את פעולת ציור הדמות נשנה כך שתצייר את דמות המגן המוקטן. את השדה x נשנה ל- shield_x, ואת השדה y נשנה ל-40 כדי שהמגינים יופיע מתחת לפצצות.
- את הפעולה האחרונה לקביעת ערך של משתנה נשנה כך שהיא תגדיל את המשתנה shield_x ב-20.
עכשיו אפשר לראות בלוח הניקוד כמה מגינים יש. כדאי לראות אם המיקום שלהם והרווחים שלהם נראים טוב, או שעדיף לשנות אותם.
מה קורה אם אוספים יותר מגינים מפצצות? גודל המסגרת של לוח הניקוד נקבע לפי מספר הפצצות. נשנה את זה כך שהמסגרת תכיל גם את המגינים:
בפעולת ציור המלבן , במקום לכתוב bomb_x בשדה x2, נכתוב שם: max( bomb_x, shield_x ). הפונקציה max() (מַקְס - קיצור של מקסימום - הכי גדול) מחזירה את הערך הכי גדול מבין הפרמטרים, ככה שנקבל את הגדול מבין bomb_x ו-shield_x.
נסו לאסוף יותר מגינים מפצצות כדי לראות אם המסגרת מתאימה לתוכן.
אתגר: לנסות להשתמש בפעולות הציור שעוד לא השתמשנו בהן:למשל, אפשר לצייר קו בין החיזוקים לבין הבריאות והחיים, או לצייר כותרת לחיזוקים. |
השלמנו את המגינים. בואו נראה איפה אנחנו ברשימת העבודה:
חללית שנעה מימין לשמאליריותאויביםחיזוקים - פצצות חכמות, מגן- אויבים נוספים
חיזקנו את חללית היטב, עכשיו אפשר לתת לה אתגרים - צעד 11: אויבים נוספים
צעד 11: אויבים נוספים
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
אויבים
[עריכה]המשחק יהיה יותר מעניין אם מדי פעם יופיעו אויבים חדשים. את האויבים החדשים צריך להוסיף למנהל הפריטים: בארוע היצירה שלו לכוון שעון מעורר נפרד לכל סוג אויב, וכשהשעון הזה מצלצל - ליצור את האויב המתאים.
עכשיו תורכם: להוסיף אויבים מסוג צלחת מעופפת: האויבים האלה ינועו מהר יחסית, אבל ישנו את כיוון התנועה לעתים קרובות. ככה התנועה שלהם תהיה בלתי צפויה ויהיה קשה לירות בהם. מלבד תנועה למעלה ולמטה, הם יוכלו לנוע גם ימינה ושמאלה ביחס להרים, כלומר לנוע ימינה במהירות קצת גדולה יותר או קצת קטנה יותר ממהירות ההרים. |
עכשיו תורכם: להוסיף חלליות מניחות מוקשים, שנעות לאיטן משמאל לימין (כלומר, קצת יותר מהר מההרים) ומשאירות מאחוריהן מוקשים (המוקשים נעים באותה מהירות כמו ההרים). כשהחללית פוגעת במוקש היא מתפוצצת. |
יצירת אויבים שונים
[עריכה]במקום להשתמש בשעון מעורר נפרד לכל סוג אויב, אפשר להשתמש בשעון יחיד אבל להגריל בכל פעם איזה אויב ייווצר. כדי לעשות את צריך להחליף את הפעולה ליצירת מופע בפעולה ליצירת מופע של אובייקט אקראי (שגם היא נמצאת בלשונית main1): .
בחלון אפשרויות הפעולה אפשר להגריל בין 4 אובייקטים (או פחות), ואז המופע שייווצר ייבחר מאחד האובייקטים האלה באופן אקראי.
החייזרים אמורים להופיע בתדירות הולכת וגדלה, כל פעם חייזרים שונים - באופן אקראי.
עכשיו תורכם: לשנות את הארועים והפעולות ליצירת חיזוקים כדי שסוג החיזוק שיופיע ייבחר באופן אקראי. |
השלמנו את כל הפריטים ברשימת העבודה. עכשיו נשייף את הפינות - צעד 12: גימור המשחק.
צעד 12: גימור המשחק
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
הוראות שימוש
[עריכה]יצרנו משחק עם הרבה אובייקטים ופעולות. כדי שהמשתמש יבין מי נגד מי ומה צריך לעשות במשחק, כדאי לתת לו הסבר קצר על המשחק.
לכל משחק שנוצר ב-Game Maker יש דף מידע על המשחק. את הדף הזה אפשר לראות אם מקישים F1 במהלך המשחק. (נסו ותראו! כרגע הדף הריק, אבל אפשר לראות אותו.) כדי לכתוב בדף המידע, צריך לעשות הקלקה-כפולה על Game Information ברשימת המשאבים.
מתקבל חלון שבו אפשר לכתוב מה שרוצים. מה כדאי לכתוב?
נהוג לכתוב את שם התוכנה, מי הכין אותה, ומתי. חוץ מזה, זה מקום טוב להסביר איך להשתמש בתוכנה - מה צריך לעשות ועל מה אפשר ללחוץ. הנה מה שאני כתבתי:
כמובן שאפשר לבחור לכתוב דברים אחרים; העיקר שהמשתמש יוכל לדעת איך משחקים ועל מה ללחוץ.
לחיצה על F1 מראה את המידע שכתבת.
כדאי לדעת: בדף המידע אפשר לעצב אותיות בכל מיני צורות וגדלים, אבל אי אפשר להכניס תמונות או הנפשות. אם רוצים הוראות שימוש עם תמונות והנפשות, אפשר ליצור חדר מיוחד להוראות השימוש, ובו לצייר דמויות וטקסט. |
איך המשתמש ידע להקיש F1 בשביל לראות את ההוראות? יכול להיות שהוא ינחש. אבל אם לא, בואו נעזור לו ונציג לו את ההוראות בתחילת המשחק: נלך לארוע תחילת המשחק של אובייקט לוח הניקוד, ונוסיף לו את הפעולה להצגת דף המידע שנמצאת בלשונית main2: .
עכשיו הוראות השימוש יופיעו לפני תחילת המשחק.
אריזת המשחק
[עריכה]גמרנו להכין את המשחק. לפני שניתן אותו לאנשים אחרים, כדאי "לארוז" אותו בעטיפה יפה: לתת לו אייקון משלו ותמונת פתיחה יפה. אפשר להשתמש באייקון שהכנתי ובתמונה שלמטה, או להכין בעצמכם בתוכנת ציור. (אם בחרת להשתמש בתמונות האלה, צריך לשמור אותן אצלך במחשב.)
כדי להכניס את התמונות האלה (או אחרות) למשחק, עושים הקלקה כפולה על Global Game Settings ברשימת המשאבים.
בחלון הגדרות המשחק שנפתח יש למעלה ארבע לשוניות. אנחנו צריכים לעבור ללשונית השלישית: Loading (לוֹוּדִינְג) - טעינה.
כדי לשנות את האייקון של המשחק צריך להקליק על הכפתור Change Icon שבתחתית החלון. בחלון שנפתח צריך לבחור את האייקון ששמרת (או ציירת).
כדי לשנות את תמונת הפתיחה של המשחק צריך להקליק על הכפתור Change Image שמימין למעלה. בחלון שנפתח צריך לבחור את התמונה ששמרת (או ציירת). אחר כך צריך לסמן את תיבת הסימון שלמעלה משמאל, כדי ש-Game Maker ידע להשתמש בתמונה הזו.
עכשיו רואים את תמונת הפתיחה של החייזרים כשהמשחק נטען, ואת האייקון של החייזר בפינת החלון של המשחק.
זהו! עכשיו אפשר ללכת לתפריט File ולבחור Create Executable כדי לשמור את המשחק כתוכנית שגם אחרים יוכלו להפעיל.
עברנו את רוב הארועים והפעולות הבסיסיות ב-Game Maker. כדאי לחזור ולהיזכר בהם - צעד 13: סוף המסלול.
צעד 13: סוף המסלול
נמצאה תבנית הקוראת לעצמה: תבנית:גמייקר/חייזרים
סיכום
[עריכה]בשלושה משחקים כיסינו את רוב הפעולות הבסיסיות ב-Game Maker. כדאי לקרוא ולהזכר בדרך שעברנו.
מושגים ב-Game Maker:
- רקע
- הגדרות החדר
- אובייקט נסתר
- בריאות
- מידע והסברים על המשחק ב-Game Information
- קביעת אייקון ותמונת פתיחה ב-Global Game Settings
גרפיקה:
מושגים בתכנות:
שיטות מימוש:
ארועים:
פעולות:
- יצירת מופע
- יצירת מופע בתנועה
- יצירת מופע של אובייקט אקראי
- בדיקת ערך של משתנה
- היפוך התנועה האנכית
- קביעת התנועה האופקית
- קביעת הבריאות
- ציור הבריאות
- ציור הניקוד
- קביעת צבע הציור
- הצגת מספר החיים כתמונה
- ציור מלבן
- ציור דמות
- ציור ערך של משתנה
- ציור טקסט
- ציור אליפסה
- ציור קו
- חזרה על פעולה או בלוק
- הערה
- הצגת דף המידע על המשחק
פונקציות:
משתנים:
תרגילים
[עריכה]עכשיו כבר יש לך יכולת ליצור משחקים יותר חכמים ומעניינים. כדי להזכר במה אפשר להשתמש במשחקים, אפשר להעזר בסיכום שכאן למעלה וגם בסיכום של פקמן ובסיכום של פונג.
אתגר: במשחק הלבנים שיצרת לתכנת שאם הכדור יפגע בלבנים לפעמים יפלו בונוסים עם המחבט התנגש בבונוס הוא מקבל משהו אפשר לתכנת את הלבנה לפעמים ליצור בונוס בעזרת הפעולה ליצירת מופע. |
אתגר: לשפר את משחק פקמן שיצרת בפרק הקודם: להוסיף לרוחות הרפאים משתנה מצב שאומר אם הן כבר יצאו מהמכלאה שלהן או לא. אם הן יצאו - לתת להן להתקדם כרגיל. אם לא, הן צריכות להעדיף לפנות למעלה כדי לצאת מהמכלאה. |
אתגר: לתכנת משחק נהיגה במכונית בכביש עמוס. הכביש והמכוניות האחרות ינועו על המסך מלמעלה למטה. השחקן יוכל לנוע ימינה ושמאלה בעזרת החצים. הוא יוכל לשנות את מהירות הנסיעה של המכונית שלו בעזרת החצים למעלה ולמטה - ע"י שינוי המשתנה background_vspeed[0], שקובע את מהירות התנועה האנכית של הרקע.את דמויות המכוניות אפשר לצייר לבד או למצוא ברחבי הרשת, או שאפשר להשתמש בדמויות שמגיעות עם חבילת המשאבים הנוספים עבור Game Maker (שכוללת עוד הרבה דמויות וצלילים). |
אתגר: לתכנת גירסה משלך למשחק פולשים מהחלל.קודם כל, כדאי לשחק בו קצת - אפשר באתר זולו או שאפשר להתקין אצלך במחשב. דבר שני, תכנות המגינים: במקום לתכנת את המגינים כמו במשחק המקורי, אפשר להחליש את כל המגן בכל פגיעה בו, לא חשוב איפה היא היתה. אחרי כמה פגיעות - למחוק את המגן כולו. ודבר אחרון, התמונות: אפשר לצייר אותן לבד או להשתמש בתמונות שכאן, שלקוחות מספריית התמונות החופשית SpriteLib של ארי פלדמן: ממה שאני ניסיתי, כדאי להכניס את הערכים הבאים כשיוצרים דמויות מהרצועה:
|
המשך הדרך
[עריכה]אחרי שכיסינו את רוב הפעולות ב-Game Maker לרוחב ולאורך, במשחק הבא ניכנס קצת יותר לעומק: משחק חשיבה: טטריס.