דילוג לתוכן

ECS system

לפני חודש העלתי פוסט על מנוע רינדור שפיתחתי ב C++ עם OpenGL לינק לפוסט הקודם- shorturl.at/cyA57

המשכתי לפתח את המנוע והוספתי לו

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

כל הפיצ’רים האלה מעניינים ויכולים לקבל פוסט שמוקדש רק להם. אבל בפוסט הנוכחי אדבר בעיקר על ECS שזה - Entity Component System

מערכת לניהול ישויות זאת מערכת שדרכה אפשר ליצור ישויות שמורכבות מרכיבים בודדים.

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

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

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

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

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

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

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

מה ניתן לראות בסרטון:

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

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

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

אין כרגע מאמרים ברשימה זו.