תכנות לילדים באמצעות Game Maker/a first person shooter/צעד 4: אובייקטים נוספים

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

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

אז איך נצייר את הצמחים ככה שתמיד יפנו למצלמה? נצטרך להשתמש שוב בטריגונומטריה. אם נסמן את הזווית שהשחקן מסתכל בה ב-D, וחצי מהרוחב של הצמח ב-L, אז המיקומים שצריכים להיות לשתי הפינות של הצמח הם ((x-L*sin(D*pi/180),y-L*cos(D*pi/180) ו- ((x-L*sin(D*pi/180),y-L*cos(D*pi/180). אם אנחנו רוצים לצייר צמח בגודל 14X20 למשל, אנחנו צריכים לשים קוד כזה באירוע הציור שלו:

var ss,cc,tex;
tex = sprite_get_texture(spr_plant,0);
ss = sin(player.direction*pi/180);
cc = cos(player.direction*pi/180);
d3d_draw_wall(x-7*ss,y-7*cc,20,x+7*ss,y+7*cc,0,tex,1,1);

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


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




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


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




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


המשחק אמור לעבור אותו דבר כי רק עשינו refactoring




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

אנימציה בתלת מימד

עריכה

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