תכנון קבצי נתונים

Blue Beetle

New member
תכנון קבצי נתונים

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

someboddy

New member
קובץ הנתונים אמור להיות טקסטואלי או בינארי?

אתה מתכוון לשמור בו Raster Graphics ודברים בסגנון? כי לשמור BMP בעזרת CPP בלי ספריות חיצוניות זה אפשרי(אבל עדיין קצת קשה), אבל דברים מעבר לזה - כמו גראפיקה דחוסה או אפילו סאונד - זה כבר נהייה ממש מסובך. ואם כבר מדברים על גראפיקה - אתה עושה את המשחק עם גראפיקת ASCII, או אם גראפיקה ממש? דבר נוסף - אתה מתכוון לערוך את הקובץ הזה באמצעות עורך טקסט(או עורך HEX, אם מדובר בקובץ בינארי) או באמצעות תוכנה יעודית שתכתוב(לא נראה לי סביר, בהתחשב בטיב הפרוייקט)
 

Blue Beetle

New member
ככה

1. הקובץ בינארי כנראה (זה לא ממש משנה, שגרות הכתיבה יהיו char char). 2. בין השמר גם שמירה על Raster Graphics (מיני אייקונים/חותמות להדבקה על לוח משבצות). אני לא אשתמש בפורמט BMP פר-סה אלא בפורמט דמוי BMP שלי (בלי דחיסה או כלום). חלק מהתרגול שאני רוצה כולל התעסקות עם זה. בשלב הראשון אני לא אבנה עורך לקבצי הנתונים, אלא אכניס פונקציות שיוצרות אייקונים (ואת קובץ הנתונים בכללותו) כאלו בצורה שרירותית. אחר כך אולי אני גם אכתוב עורך, למרות שיתכן שכתיבת העורך תהיה מורכבת יותר מהמשחק עצמו. אם ממש יהיה צורך, אני אכתוב עורך ב- C#, שהרבה יותר מותאמת לשטויות כאלו..
 

someboddy

New member
כששאלתי אם הקובץ בינארי

לא התכוונתי אם אתה פותח אותו במצב בינארי(כי זה משפיע רק על דברים כמו חלוקה לשורות וכו' - אפשר לכתוב קובץ טקסט רגיל במצב בינארי) אלא אם כשמישהו פותח אותו עם עורך טקסט, אם הוא יראה אנגלית או מנדרינית עתיקה. בכל אופן, אני הייתי שומר את המידע הגולמי בHEX ומשתמש בחלק קטן משאר התווים לבקרה. כל אובייקט יהיה בשורה נפרדת בקובץ הנתונים, שתתחיל במזהה יחודי(בHEX או טקסטואלי, איך שאתה מעדיף), אחריו רווח, אחריו טיפוס הנתונים שלו(שיציין אם הוא גראפיקה, מחרוזת טקסט, או כל דבר אחר), אחריו עוד רווח, אחריו פרמטרים(למשל בתמונה - אורך ורוחב), אחריהם עוד רווח, ואז הנתונים הגולמיים של האובייקט בHEX. התוכנית שתקרא את כל זה תיצור std::map לכל טיפוס שתרצה לתמוך בו, ותטען את הHEX של כל אובייקט לתוך הMAP, כאשר הKEY יהיה המזהה של האובייקט. בקובץ השלבים, כשתרצה להשתמש באובייקט מקובץ הנתונים, פשוט תציין את הטיפוס והמזהה שלו, ולפי זה התוכנה תוכל לשלוף את האובייקט הרצוי מתוך הMAP. החיסרון של הגישה הזו זה שהיא מבזבזת הרבה מקום יחסית לשמירה של הנתונים בצורה בינארית גולמית, אבל היתרון שלה זה שקל לערוך קבצים שלה עם עורך טקסט(כי כל שורה בקובץ זה אובייקט נפרד), שגירסה ישנה של התוכנית יכולה לקרוא קבצים של גרסה חדשה, כשהיא מתעלמת מטיפוסים שהיא לא מכירה, ושקשה לשבור את הקובץ בטעות - מקסימום מחריבים שורה בודדת.
 

De-Panther

New member
XML. אתה יכול לשים אותו ואת קבצי התמונה יחד..

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

someboddy

New member
שים לב למטרה שלו

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