תכנות לילדים באמצעות Game Maker/חייזרים/צעד 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: יצירת חייזרים