תכנות לילדים באמצעות Game Maker/a first person shooter/צעד 3: שיפור החוויה

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

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

הוספת סוגי קירות נוספים[עריכה]

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


עכשיו תורכם:

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

המשחק נראה הרבה יותר מגוון.




שיפור מבנה החדר[עריכה]

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

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


עכשיו החדר מתאים יותר למשחק יריות בגוף ראשון.




הוספת אפקט ערפל[עריכה]

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

d3d_set_fog(true,c_black,10,300);

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


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




שיפור התזוזה[עריכה]

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

x = xprevious;
y = yprevious;
if (abs(hspeed) >= abs(vspeed) &&
not place_meeting(x+hspeed,y,obj_wall_basic))
{ x += hspeed; exit;}
if (abs(vspeed) >= abs(hspeed) &&
not place_meeting(x,y+vspeed,obj_wall_basic))
{ y += vspeed; exit;}
speed = 0;

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


עכשיו יותר קל לנוע לאורך מסדרונות.




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

var maxspeed;
if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;
if (speed < maxspeed ) speed = min(maxspeed ,speed+0.4);

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

עכשיו תורכם:

לתכנת ריצה באותה דרך גם ללחיצה על אחורה

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




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

var xn,yn;
xn = x - sin(direction*pi/180);
yn = y - cos(direction*pi/180);
if not place_meeting(xn,yn,obj_wall_basic)
{ x = xn; y = yn; }

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


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