Contacts
صفحه اصلی پورتال | صفحه اصلی تالار | ثبت نام | اعضاء | گروه ها | جستجو | پرسش و پاسخ | فروشگاه الکترونیکی | خرید پستی بازی های کامپیوتری





صفحه اول انجمنها -> اصول اولیه در طراحی بازیهای کامپیوتری -> مقاله : اصول اولیه برای ذخیره و بارگذاری بازیها
 

ارسال يك موضوع جديد   پاسخ به يك موضوع ديدن موضوع قبلي :: ديدن موضوع بعدي
برو به صفحه 1, 2  بعدي

نظر خود را در مورد مفید بودن این مقاله بیان کنید
چیز زیادی یاد نگرفتم
22%
 22%  [ 2 ]
بد نبود
11%
 11%  [ 1 ]
خیلی به دردم خورد
66%
 66%  [ 6 ]
مجموع آراء : 9

مقاله : اصول اولیه برای ذخیره و با
نويسنده
پيغام
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

*** کلیه حقوق مطالب این پست برای نویستده و سایت طراحان ایرانی محفوظ است و استفاده از آن با ذکر منبع بلا مانع است.***

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


2 شنبه 3 ارديبهشت 1386 - 19:21
پاسخ بصورت نقل قول
بچه ها نظر یادتون نره!!

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
Ali
مدیر کل
مدیر کل


تاريخ عضويت: شنبه 20 تير 1383
تعداد ارسالها: 2976
محل سكونت: On the edge


2 شنبه 3 ارديبهشت 1386 - 19:49
پاسخ بصورت نقل قول
مقاله بسیار مفیدی بود. استفاده کردیم...

علی

_________________
پی سی گیمرز - آرشيو بزرگ بازی های کامپیوتری
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


2 شنبه 3 ارديبهشت 1386 - 20:57
پاسخ بصورت نقل قول
خواهش میکنم علی آقا
جدا به درد شما هم خورد!!!؟؟؟
اگه اینجوریه باید به خودم امیدوار باشم Evil or Very Mad

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


2 شنبه 3 ارديبهشت 1386 - 21:08
پاسخ بصورت نقل قول
علی آقا تو نظر سنجی شرکت نکردیا!!!
اون برام خیلی مهمه.
آخه سعی میکنم سطح مقالات بعدی رو از روی اون تعیین کنم.
لطفا بچه هایی که مقاله رو می خونن نظر سنجی رو فراموش نکنن.

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
Ali
مدیر کل
مدیر کل


تاريخ عضويت: شنبه 20 تير 1383
تعداد ارسالها: 2976
محل سكونت: On the edge


3 شنبه 4 ارديبهشت 1386 - 00:59
پاسخ بصورت نقل قول
آره احسان جان. واقعا استفاده کردم. البته خیلی دلم می خواست که یه سری توضیحات تکمیلی در باره بعضی از قسمتها بدم. ولی متاسفانه دیگه مثل سابق فرصت نوشتن و خوندن رو ندارم. شوربختانه دیگه فرصتی دست نمی ده که مقاله بنویسیم و باید از مقالات خوندنی سایر دوستان استفاده کنیم.

_________________
پی سی گیمرز - آرشيو بزرگ بازی های کامپیوتری
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2066
محل سكونت: تهران


3 شنبه 4 ارديبهشت 1386 - 02:55
پاسخ بصورت نقل قول
ممنون احسان جان . ديد كلي بهم داد .
خوشبختانه تو يكي دو جلسه اي كه با يكي از آشايان سر كلاس VB رفتم از ذخيره فايل به صورت باينري اطلاعاتي دارم ( كه استادشون مي گفت روشي هست براي ذخيره متغيرها كه جايگزين آرايه هاست ... ) . خوب موتوري كه من الان كار مي كنم به صورت باينري ذخيره مي كنه ولي همين امروز كه يه ساعتي روي سيو تحقيق كردم متوجه شدم تابع هايي نداره كه بتونه اونها رو بخونه ... ( البته هنوز كامل كامل نگاه نكردم )

نقل قول:

بازیها در دنیای امروز از سبکهای بسیار متفاوتی برخوردارند. و از این گذشته یک سیستم ذخیره و بارگذاری به شدت وابسته به طراحی داخلی بازی شماست


كاملا موافقم . اگه بازي من سبك ديگه بود انقدر جرات نمي كردم كه طرف سيو كردن برم . توي سبك ادونچر تنها وضعيت مربوط به معماهاي حل شده و حل نشده - اتاقي كه در آن قرار گرفته ايم و محل قرار گرفتن كاراكتر ( اصلي ترين عوامل ) هستند كه بايد سيو شوند ...

نقل قول:

اگر شما در بازیتان می توانید از یک مرحله به مرحله دیگری بروید مطمئن باشید که با کمی تغییر و گاهی هیچ تغییر اضافی قادر خواهید بود تا از همان سیستم برای ذخیره و بارگذاری نیز استفاده نمایید


خوب احسان جان من همين مطلب رو مبنا قرار دادم ( يا فكر مي كنم اين طوري باشه ) . هنوز كه چيزي رو شروع نكردم ولي اين تو ذهنمه :
براي همه قسمتهايي از بازي كه تغيير مي كنند يه متغير به نام Solved قرار مي دم كه هر وقت حل شدند يا تغيير حالت دادند از false به true تغيير پيدا مي كنند و يه متغير ديگه به نام Room كه براي هر اتاق از بازيم يه عدد قرار مي دم و وقتي كاراكتر توي اون اتاق هست مقدار Room برابر شماره اون اتاق مي شه و براي موقيعت كاراكتر هم از 2 متغير استفاده مي كنم ...
خوب بازي شروع مي شه همه Solved ها برابر false هستند و Room برابر يك هست و موقعيت كاراكتر ...
وقتي از اتاقي به اتاق ديگه مي ريم شما با توجه به Solved ها مي توني به معماهاي ديگه دسترسي داشته باشي به طور مثال هر وقت شما puzzle01.solved رو برابر true كردي مي توي وارد معماي دوم بشي و در اين صورت هست كه امكان true شدن puzzle02.solved بوجود مياد پس مي تونيم نتيجه بگيريم در صورتي كه اين Solved ها و اتاقي كه در آن هستيم ذخيره كنيم مي تونيم بعدا با فراخواندن شان ادامه بازي رو انجام بديم ...

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


3 شنبه 4 ارديبهشت 1386 - 05:53
پاسخ بصورت نقل قول
کارت درسته مجتبی جان البته اگه شماره فریم کاراکترت رو هم سیو کنی و بعد از همون فریم ادامه بدی. کلاس کارت هم میره بالا PDT_002

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2066
محل سكونت: تهران


3 شنبه 4 ارديبهشت 1386 - 09:48
پاسخ بصورت نقل قول
ممنون .
كاراكتر در حالت عادي به طرف رو به رو هست و وقتي در حال اجراي انيميشن ديگه اي هست كه بهش اين دستور رو داده باشي . مهم نيست وقتي بازي شروع مي شه همون حالت قبلي رو داشه باشه . توي بازي هاي ادونچر كه تو 2 بعد حركت مي كنه لازمه ولي اينجا فكر نمي كنم نيازي باشه ...

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
مصطفي سپهريان
پیر بازی سازی
پیر بازی سازی


تاريخ عضويت: جمعه 24 آذر 1385
تعداد ارسالها: 1147
محل سكونت: تو يه فلش مموري دو گيگ


3 شنبه 4 ارديبهشت 1386 - 15:20
پاسخ بصورت نقل قول
ايولا خيلي خوب بود و بدرد بخور((بيش از بدرد بخور)) Confused

_________________
«پشتکار»«پشتکار»«پشتکار»
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نمايش نامه هاي ارسال شده قبلي:   
ارسال يك موضوع جديد   پاسخ به يك موضوع    صفحه 1 از 2 تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد
برو به صفحه 1, 2  بعدي


 
پرش به:  


شما نمي توانيد در اين انجمن نامه ارسال كنيد.
شما نمي توانيد به موضوعات اين انجمن پاسخ دهيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن ويرايش كنيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن حذف كنيد
شما نمي توانيد در نظر سنجي هاي اين انجمن شركت كنيد


unity3d

بازگردانی به فارسی : علی کسایی @ توسعه مجازی کادوس 2004-2011
Powered by phpBB © 2001, 2011 phpBB Group
| Home | عضويت | ليست اعضا | گروه هاي كاربران | جستجو | راهنماي اين انجمن | Log In |