eta مدیر سایت
تاريخ عضويت: 2 شنبه 27 تير 1384 تعداد ارسالها: 2153 محل سكونت: شاهين شهر
2 شنبه 3 ارديبهشت 1386 - 18:43 |
|
|
مقاله ای که در پیش رو دارید حاوی مقدماتی بر اصول save (ذخیره) و load (بارگذاری) بازی هاست.
بنده، برای جمع آوری اطلاعات مستدل برای این مقاله چند بار تلاش کردم. ولی خوب به مطلب مناسبی دست پیدا نکردم.
مجموعه جوابهایی که در مورد علت عدم وجود چنین مقاله ای دریافت کردم این بود که :
« بازیها در دنیای امروز از سبکهای بسیار متفاوتی برخوردارند. و از این گذشته یک سیستم ذخیره و بارگذاری به شدت وابسته به طراحی داخلی بازی شماست. بنابراین خواندن مقاله یا یافتن آموزشی که نحوه پیاده سازی یک سیستم جامع ذخیره و بارگذاری را به شما نشان دهد، امری غیر ممکن است. اگر چه ممکن است آموزشهایی برای سیستم های ذخیره و بارگذاری در زبانها و یا موتورهای خاص بیابید. »
بنابراین شما مطمئنا قادر نخواهید بود تنها با اتکا بر این مقاله و بدون توجه به محیط اجرایی خودتان یک سیستم ذخیره و بارگذاری بی نقص طراحی کنید.
در این مقاله با مسائلی همچون :
1. یک سیستم ذخیره و بارگذاری چیست؟
2. چه چیز را ذخیره کنیم؟
3. چگونه ذخیره کنیم؟
4. چگونه بازی را بارگذاری کنیم؟
آشنا خواهید شد.
سیستم ذخیره و بار گذاری چیست؟
سیستم ذخیره و بارگذاری سیستمی است که به شما اجازه می دهد تا یک بازی کامل را به نحوی که بعدا قابل بارگذاری مجدد و ادامه باشد، ذخیره کنید. در حقیقت یک سیستم ذخیره و بارگذاری کامل و موفق به شما این امکان را می دهد که یک بازی را به طور کامل متوقف(pause) نمایید و هر زمان که خواستید ادامه دهید.
در این راستا شما نیازمند خواهید بود که کلیه متغیرها و آبجکتهای درگیر و کلیه اسکریپتهای در حال اجرا را در یک فایل ذخیره نمایید. گاهی اوقات ممکن است شما بخواهید تا یک عکس از وضعیت مرحله را نیز با اطلاعات دیگر ذخیره کنید.
اگر چه یک سیستم ذخیره و بارگذاری ممکن است در ابتدا چیز عجیب و غریبی به نظر برسد، اما شما باید بدانید که عموما در هنگام تغییر مرحله بازی و رفتن از یک مرحله به مرحله بعد از یک سیستم مشابه استفاده می نمایید. بنابراین اگر شما در بازیتان می توانید از یک مرحله به مرحله دیگری بروید مطمئن باشید که با کمی تغییر و گاهی هیچ تغییر اضافی قادر خواهید بود تا از همان سیستم برای ذخیره و بارگذاری نیز استفاده نمایید.
البته این را هم باید در نظر داشته باشید که در طراحی یک سیستم کامل ذخیره و بارگذاری باید دقت بسیاری به خرج داد. در حقیقت هر قسمتی از اطلاعات دخیل در تعیین وضعیت فعلی بازی که ذخیره نشوند طبیعتا در هنگام بارگذاری وجود نخواهند داشت و شبیه سازی شما از بازی ذخیره شده ضعیف تر خواهد بود.
چه چیز را ذخیره کنیم؟
برای ذخیره یک بازی نیازی به این نیست که کلیه اطلاعات موجود در بازیتان را ذخیره کنید.
بسیاری از اطلاعات موجود در بازی شما احتمالا در کل بازیتان مشترک خواهند بود (از جمله تصاویر و انیمیشن ها و صداهای موجود در بازی). اینگونه اطلاعات در ابتدای راه اندازی بازی بارگذاری می گردند.
بسیاری از اطلاعات موجود در بازی شما احتمالا در تمام قسمتهای یک مرحله از بازیتان ثابت خواهد بود (از جمله سلاحها و ابزارهایی که یک کاراکتر دارد. یا اطلاعات مربوط به شرط خاتمه و شکست بازی). اینگونه از اطلاعات در هنگام بارگذاری هر مرحله به همراه آن بارگذاری می گردند.
و در نهایت قسمتی از اطلاعات بازی شما وضعیت و حالت یک مرحله را مشخص می کنند(از جمله تعداد سکه هایی که کاراکتر پیدا کرده، تعداد آدمهایی که کشته، میزان مهمات یا لیست ابزارها و سلاح های او به شرط اینکه این ابزارها از داخل بازی پیدا شوند.). این اطلاعات، اطلاعاتی هستند که شما باید آنها را در فایلهای ذخیره بازی ذخیره نمایید.
البته گاهی اوقات اگر اطلاعات مربوط به هر مرحله بازی چندان حجیم نباشند. می توان آنها را نیز به همراه اطلاعات وضعیت مرحله در یک فایل ذخیره کرد.
اگر تاکنون در هنگام بازی کردن متوجه شده اید که بارگذاری یک باز ذخیره شده از همین مرحله از بارگذاری یک بازی ذخیره شده در مرحله دیگر سریع تر است. این احتمالا به دلیل جدا بودن روال ها و اطلاعات مربوط به بارگذاری یک مرحله و وضعیت یک بازی ذخیره شده است.
پس تاکنون دانستیم که اصل آنچه ذخیره و سپس بارگذاری می کنیم، اطلاعات مشخص کننده وضعیت بازی هستند.
گاهی اوقات برخی از مشخصه های وضعیت بازی کاملا واضح و قابل دسترسی اند. مثلا ممکن است شما متغییری داشته باشید که سرعت باد را با آن مشخص کنید. خوب ذخیره کردن آن بسیار آسان خواهد بود. ذخیره اش کنید.
اما بعضا برخی از مشخصه های وضعیت با مشخصه هایی دیگر آمیخته شده اند. در این موارد بهتر است که شما ابتدا مشخصه های مربوط به وضعیت را از سایر مشخصات استخراج نموده و به نحوی که بعدا قابل دسترسی باشند(فرمتی خاص) ذخیره کنید. مثلا شما یک رزمنده دارید که میخواهید وضعیت آن را ذخیره کنید. این رزمنده به صورت یک آبجکت است و مشخصاتی همچون محل، سرعت، جهت، حداکثر سرعت ممکن، توان حبس نفس، جان و یک مشت انیمیشن را دارد. از این میان شما باید اطلاعاتی همچون سرعت، محل، جان و جهت را استخراج نمایید و برای او ذخیره نمایید. این کار را نیز بکنید.
اکنون اطلاعات مورد نیازمان را در دست داریم!!
باید بدانیم :
چگونه ذخیره کنیم؟
این حقیقت را که شما مجبور خواهید بود بازی خود را در یک فایل ذخیره کنید در ذهن خود بیاورید. یک فایل یک رشته از بایتهای پشت سر هم است. در یک فایل شما تنها با یک مشت کاراکتر روبرو هستید. اگر تا کنون برنامه نویسی کرده اید و در برنامه هایتان با فایلها کار کرده اید این موضوع را می دانید که در یک فایل دیگری چیزی به اسم متغیر و آبجکت و ... وجود ندارد. شما نمی توانید به یک فایل بگویید. که مقدار متغیر «جان کماندو» را که ذخیره کردم، به من بگو. در حالی که زمانی که در حافظه کار می کنید، می توانید به متغیرهایتان اسم بدهید و آنها را با آن نام بخوانید.
در این میان و با این محدودیتها چیزی که به کمک شما می آید و به درد شما خواهد خورد کمی نظم و ترتیب است.
عموما اطلاعات را با دو برداشت متفاوت می توان در یک فایل ذخیره نمود :
1. به صورت باینری(غیر قابل خواندن توسط انسان) : در این حالت شما اطلاعات خود را به صورتی معین در یک فایل پشت سر هم قرار می دهید.
در راستای ذخیره اطلاعات به صورت باینری ممکن است شما نیاز به تکنیکهایی داشته باشید که به وسیله آن آبجکتهای خودتان را در فایل ذخیره نمایید. به این تکنیکها serialization می گویند.
برای اطلاعات بیشتر در این زمینه می توانید به صفحه زیر مراجعه نمایید.
http://www.parashift.com/c++-faq-lite/serialization.html
2. به صورت متنی(قابل خواندن توسط انسان) : در این حالت می توان توالی اطلاعات را نادیده گرفت. چرا که در این حالت شما میتوانید به اطلاعات خود اسم بدهید.
به مثال مقابل توجه کنید.
این یک فایل است که بخشی از اطلاعات وضعیت یک بازی فرضی را به صورت متنی ذخیره کرده است.
كد: |
level = 2
commando.joon = 10
commando.jahat = SW
baroon = false
money = 10000
...
|
اگر فکر می کنید. که از تجربه کافی برخوردار نیستید، استفاده از روش دوم به شما توصیه می گردد.
البته از فایل ها به گونه ای پیشرفته تر نیز می توان استفاده کرد و آن استفاده از یک header در ابتدای فایل برای مشخص کردن آرایش اطلاعات درون فایل است که فعلا از آن می گذریم.
خوب اکنون که اطلاعات خود را ذخیره کردیم،
چگونه بازی را بارگذاری کنیم؟
این مرحله کاملا بستگی به نحوه ذخیره کردن اطلاعات در فایل مربوطه دارد.
اگر به صورت باینری ذخیره شده باشند : در روال لود کردن اطلاعات، اطلاعات را به همان ترتیب معین که ذخیره کردید از فایل خارج می نمایید و در محل مورد نیاز قرار می دهید.
در صورتی که از تکنیکهای serialization استفاده کرده اید در هنگام تبدیل اطلاعات به دست آمده از فایل به اطلاعات قابل استفاده از بازی باید عکس تکنیک زمان ذخیره را به کار بندید.
و اگر به صورت متنی ذخیره شده با شند : در روال لود این اطلاعات از یک ساختار شرطی برای تشخیص این که این مقدار به چه متغیری مربوط می شود استفاده نمایید.
کافیست شما امکانی مانند readLine را در اختیار داشته باشید. سپس با استفاده از آن یک خط از برنامه را بخوانید، متغیر مربوطه را تشخیص دهید و در نهایت مقدار مشخص شده را به آن انتساب دهید.
برای مثال قبل می توان از شبه کد زیر استفاده نمود:
كد: |
loadGame( String file ) {
String Level = file.readLine();
loadLevel( level.subString( level.firstPlaceOf( '=' )+2, level.length ) );
while( file.hasMoreLine() ) {
String string = file.readLine();
String variable = string.subString( 0, string.firstPlaceOf( '=' )-1 );
String Value = string.subString( string.firstPlaceOf( '=' )+2, string.length() );
if( variable == "commando.joon" ) {
commando.joon = value.intValue();
} else if( variable == "commando.jahat" ) {
commando.jahat = value;
} else if( variable == "baroon" ) {
if( value == "false" )
baroon = fasle;
else
baroon = true;
} else if( variable == "money" ) {
money = value.intValue();
} else ...
}
}
|
منابع :
http://www.conitec.com/english/gstudio/faq.htm
http://www.parashift.com/c++-faq-lite/serialization.html
نوع استفاده از منابع :
استفاده مقطعی و ارجاع
سطح مقاله : مبتدی
نویسنده : احسان طاهری
پست الکترونیک : eh_taheri@yahoo.com
*** کلیه حقوق مطالب این پست برای نویستده و سایت طراحان ایرانی محفوظ است و استفاده از آن با ذکر منبع بلا مانع است.*** |
_________________ تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید
|
|