לדלג לתוכן

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

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


מעבר למצב תלת מימד

[עריכה]

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

d3d_start();
d3d_set_hidden(true);
d3d_set_perspective(true);
d3d_set_lighting(false);
texture_set_interpolation(true);

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

ציור בתלת מימד

[עריכה]

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

d3d_set_projection(x,y,10,
               x+cos(direction*pi/180),y-sin(direction*pi/180),10,
               0,0,1);

זה אולי נראה מבהיל אבל זה לא עד כדי כך מסובך. אומנם יש תשעה פרמטרים, אבל הם מיצגים שלושה מיקומים של נקודות. במשחקים הדו מימדיים ייצגנו מיקומים בעזרת x ו- y, אבל בשלושה מימדים צריך שלוש קורדינאטות - x,y ו- z, ולכן שלוש נקודות הן תשעה פרמטרים. אז נעבור על הנקודות אחת אחת. הנקודה הראשונה - (x,y,10) היא המיקום של המצלמה. אין הרבה מה להסביר עליה - ה-x וה-y שלה הם ה-x וה-y של השחקן, וה-z הוא 10 שזה מייצג את גובה העיניים של השחקן. הנקודה השנייה - (x+cos(direction*pi/180),y-sin(direction*pi/180),10) נראית הרבה יותר מסובכת כי היא ארוכה ומכילה פונקציות שלא למדנו עליהן ולכן היא דורשת הסבר. ובכן, הפונקציות האלה הן סינוס וקוסינוס, פונקציות מתמטיות מענף שנקרא טריגונומטריה והן יעזרו לנו מאוד לחשב מיקומים של נקודות ואורכים לפי זוויות. הנקודה הזאת היא פשוט צעד אחד לכיוון שהשחקן מסתכל אליו. הנקודה האחרונה היא פשוט המיקום היחסי שה"חלק העליון של המצלמה" פונה אליו - כלפי מעלה במקרה שלנו. אפשר לשנות אותה כדי לסובב את המצלמה. הדבר הבא שנעשה הוא לצייר את התקרה, הרצפה והקירות. אבל הבעיה היא שאנחנו לא רוצים לצייר אותם בצבע אחיד - אנחנו רוצים שהקירות יראו עשויים מלבנים, הרצפה תראה עשויה ממרצפות או אבנים וכו'. לשם כך אנחנו צריכים להשתמש בטקסטורות.

טקסטורות

[עריכה]

כפי שלמדנו, כשהגיים מייקר מצייר צורה הוא מצייר אותה בצבע הציור הנוכחי, שאפשר לשנות אותו באמצעות הפעולה לשינוי צבע הציור. אבל בגרסה בתשלום של הגיים מייקר אפשר לתת לצורות סוג שונה של מילוי - טקסטורות. טקסטורות הן למעשה תמונות שיכולות לשמש כמילוי של צורה, ע"י חזרה על עצמן הרבה פעמים או ע"י הגדלה והקטנה. אפשר ליצור טקסטורות מספרייטים או מרקעים, אבל הן חייבות להיות ריבועיות (גובה ורוחב שווים) ושהגובה והרוחב שלהן יהיו חזקות של 2 (16X16,32X32,64X64,128X128 וכו'). אז נחזור למשחק שלנו. אתם יכולים להשתמש באילו טקסטורות שאתם רוצים, כל עוד הן בגודל מתאים. באתר הזה יש כמה טקסטורות טובות אבל שימו לב לתנאי השימוש שבתחתית הדף ואל תשכחו לשנות את הגודל. תמצאו טקסטורה טובה לקיר, לרצפה ולתקרה ותשימו אותן במשחק בתור רקעים. אפשר לקרוא להן איך שאתם רוצים אבל בקודים נניח שקראתם להן texture_wall, texture_floor ו - texture_ceiling. דבר נוסף שחייבים לשים לב אליו לפני שנתחיל לצייר, הוא שכשמציירים צורות עם טקסטורות הטקסטורה מתערבבת עם צבע הציור הנוכחי. זה שימושי אם רוצים למשל לצייר שני קירות עם אותה טקסטורה אבל צבע שונה. אבל במקרה שלנו אנחנו לא רוצים שום ערבוב עם צבע, ולכן צריך להשתמש בפעולה לשינוי צבע הציור - באירוע הציור של השחקן כדי לשנות את צבע הציור ללבן. אחרי זה נצייר את הרצפה והתקרה בעזרת הקוד הבא:

d3d_draw_floor(0,0,0,640,480,0,
background_get_texture(texture_floor),24,18);
d3d_draw_floor(0,0,32,640,480,32,
background_get_texture(texture_ceiling),16,12);

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

d3d_draw_wall(x1,y1,z1,x2,y2,z2,tex,1,1);

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

עכשיו תורכם:

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

אם לא הצלחת הנה הפתרון:

פתרון

בקיר האופקי שימו:
x במשתנה x1,
x+32 ב- x2,
y ב- y1 וגם y2
ו- 0 ב- z1 ו-32 ב- z2.
בקיר האנכי שימו אותם ערכים רק הפוך ב-x ו- y.
texture_wall במשתנה tex.



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



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