मैं अपने गेम के लिए सेव / लोड सिस्टम कैसे लिख सकता हूं?


17

मैं C ++ में अपने गेम के लिए सेव / लोड सिस्टम लिखने का एक तरीका निकालने की कोशिश कर रहा हूं। अभी के रूप में, मैं यह सब बाइनरी झंडे का उपयोग कर रहा हूँ। किसी को भी यह कैसे एक और तरीका है पर एक सुराग मिला? मुझे बाइनरी का उपयोग करने में कोई आपत्ति नहीं है, लेकिन मैं अपने विकल्पों को जानना चाहता हूं। मैं कुछ ऐसा भी चाहता हूं जिसमें कुछ चीजों को तय करने के लिए सिर्फ एक घटना के पूर्ण या अपूर्ण होने की स्थिति की जांच करना आसान होगा (इस खेल में बहुत सी वस्तु प्रणाली खिलाड़ी पर निर्भर है कि उसने क्या किया है या नहीं किया है) खेल के दौरान)।


1
दरअसल, इसे देखने के बाद, मेरे लिए इस प्रोजेक्ट के लिए पाइथन के साथ रहना बेहतर होगा। मैं एक इंजन के रूप में पांडा 3 डी का उपयोग कर रहा हूं, और अजगर संस्करण अधिक पॉलिश है। वह, और मैं शायद अजगर में तेजी से विकास कर सकता हूं। साथ ही, अजगर के पास अचार नामक एक अंतर्निर्मित धारावाहिक वर्ग है, जो मुझे कोडिंग की परेशानी से बचाता है।
सोनिकबॉक

जवाबों:


5

सीरियलाइज़ेशन जाने का रास्ता होगा, और स्टेटस-चेकिंग के लिए, ऐसा करने के लिए आपके पास डीरिशियलाइज़ेशन विधि में तर्क हो सकते हैं।


मैं इसके बारे में यहां ( parashift.com/c++-faq-lite/serialization.html ) पढ़ रहा हूं और यह बहुत दिलचस्प लग रहा है। मैं वास्तव में क्रमबद्धता से कभी नहीं निपट पाया, इसलिए यह मेरे लिए एक अच्छा सीखने का अनुभव होगा। धन्यवाद!
सोनिकबोक

कोई परेशानी नहीं! मैं अपने खेल के लिए सीरियलाइजेशन के साथ-साथ सी # में भी काम कर रहा हूं। सौभाग्य!
ThatsGobbles

4
ध्यान रखें: यदि आप क्रमबद्ध करते हैं, तो हमेशा एक संस्करण संख्या को पहले संग्रहित करें, और इसे पहले पढ़ें। इस तरह से आप कुछ (पीछे) अनुकूलता प्रदान करके savegame प्रारूप में बदलाव को तोड़ सकते हैं।
LearnCocos2D

4
विकास के दौरान मैं आपको फ़ाइलों को मानव पठनीय प्रारूप में लिखने के लिए दृढ़ता से प्रोत्साहित करता हूं। शायद JSON या XML जैसी कोई चीज़। यह देखने के लिए बहुत आसान है कि क्या आपकी ज़रूरत की सभी चीज़ों को सहेजा गया था और पहले से ही लिखी गई फ़ाइल में डेटा को ट्विक करने के लिए भी बहुत आसान है (परीक्षण के लिए या डिस्क पर फ़ाइल लिखने के बाद सामान को ठीक करने के लिए)।
बंमजैक

5

मैंने DOOM स्रोत कोड का थोड़ा अध्ययन किया है। मैं बताता हूँ कि यह वहाँ कैसे किया जाता है।

D_DoomMain में सभी खुले / सहेजें / लोड फ़ंक्शंस शामिल हैं, साथ ही साथ अन्य चीज़ों का एक समूह भी है। जैसा कि यह फ़ाइल की शुरुआत में कहता है,

// DESCRIPTION:
//      DOOM main program (D_DoomMain) and game loop (D_DoomLoop),
//      plus functions to determine game mode (shareware, registered),
//      parse command line parameters, configure game parameters (turbo),
//      and call the startup functions.

असल में, पूरी फाइल M_CheckParmशुरू से आखिर तक भरी हुई है । यही D_DoomLoop के अंतर्गत आता है। यह एक बड़े पैमाने पर लूप है (1000-2000 लाइनों की तरह कुछ)।

चूंकि आपका प्रश्न 'मैं कैसे लिख सकता हूं?' मैं कोड के कुछ बिट्स को पेस्ट करने जा रहा हूं, जो D_DoomMain से गेमवेव को संदर्भित करता है:

यहाँ वे कथन हैं जहाँ उस सामान का उपयोग किया जाता है, लूप के बिल्कुल अंत में।

   p = M_CheckParm ("-loadgame");
   if (p && p < myargc-1)
   {
       if (M_CheckParm("-cdrom"))
           sprintf(file, "c:\\doomdata\\"SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
       else
           sprintf(file, SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
       G_LoadGame (file);
   }


   if ( gameaction != ga_loadgame )
   {
       if (autostart || netgame)
           G_InitNew (startskill, startepisode, startmap);
       else
           D_StartTitle ();                // start up intro loop

   }

   D_DoomLoop ();  // never returns

यहां वह फ़ंक्शन है जो स्ट्रिंग्स तक पहुंचता है, जिसे आप पूरे कोड में बिखरे हुए पाते हैं:

void M_ReadSaveStrings(void)
{
   int             handle;
   int             count;
   int             i;
   char    name[256];

   for (i = 0;i < load_end;i++)
   {
       if (M_CheckParm("-cdrom"))
           sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",i);
       else
           sprintf(name,SAVEGAMENAME"%d.dsg",i);

       handle = open (name, O_RDONLY | 0, 0666);
       if (handle == -1)
       {
           strcpy(&savegamestrings[i][0],EMPTYSTRING);
           LoadMenu[i].status = 0;
           continue;
       }
       count = read (handle, &savegamestrings[i], SAVESTRINGSIZE);
       close (handle);
       LoadMenu[i].status = 1;
   }
}

आपको सामान के साथ p_savegame.c नामक एक फ़ाइल भी मिली है जो उपयोगकर्ता के सभी जुड़े डेटा (जो आपको मिला है, जहां आप किस स्तर पर हैं, आदि) को बचाएगा।

और अंत में आपको फ़ाइल मिल गई है जो savegame डेटा को गेम परिदृश्य में लोड करता है, यकीनन सभी का सबसे जटिल है, क्योंकि यह बाकी सब कुछ भी लोड करता है। वह जिसे p_setup.c कहा जाता है, और उसी निर्देशिका में स्थित है।

यह मेरे लिए catएक पाठ बफर और pipeउस पाठ को sendmailअपने ईमेल पते पर इन सभी के लिए अच्छी तरह से काम किया । इस तरह मैं दिन के विषम क्षणों में इसके माध्यम से पढ़ सकता हूं, और 'खोज' का उपयोग कर सकता हूं जब मैं 'कैसे एक खेल लोड करता हूं' जैसे सामान की तलाश करना चाहता हूं। कोड अच्छी तरह से टिप्पणी की है।


3

आप वर्ग या डेटा को एक फ्लैट फ़ाइल में अनुक्रमित कर सकते हैं और फिर लोड होने पर इसे वापस पढ़ सकते हैं।


कॉर्पोरेट फ़ायरवॉल के कारण, मैं उन लिंक को प्राप्त करने में असमर्थ था। माफ़ करना।
सोनिकबॉक

4
यदि आपका निगम आपको सामान पढ़ने से रोकता है, तो आपको काम करने की आवश्यकता है वे सबसे अच्छे हैं।
ओ ० '।

2
खैर, यह अभी तक मेरा काम नहीं है। : P (और शायद "कॉर्पोरेट" सबसे अच्छा शब्द नहीं था ... यह मेरे स्कूल में एक फ़ायरवॉल है)
sonicbhoc

-1

I +1: सेव गेम्स को स्ट्रक्चर करने के लिए XML / JSON का उपयोग करने के सुझाव को संपादित करें। इस तरह आप "क्लाउड" आधारित सेव बनाने के लिए बहुत तैयार हैं। या कम से कम, आपके पास एक ऐसी संरचना होगी जिसका उपयोग आप भविष्य की परियोजनाओं के लिए कर सकते हैं जिसमें वेब शामिल हो सकता है। जब तक फ़ाइलों को इस तरह से संग्रहीत नहीं किया जाता है, तब तक यह पढ़ना बहुत आसान है कि उन्हें आपको लाभों का भार देना चाहिए। मेट्रिक्स की तरह! हुर्रे


1
क्लाउड स्टोरेज का मतलब है कि आप ऑनलाइन बचत कर रहे हैं। आप किसी भी फ़ाइल प्रारूप के साथ ऐसा कर सकते हैं।

मुझे पता है। लेकिन संचार के प्रयोजनों के लिए यह एक अच्छा विचार हो सकता है कि इसे किसी ऐसी चीज के साथ संरचना करें जो हस्तांतरण करना आसान है।
फिल

यदि आपका गेम अपने स्वयं के सेव फ़ाइल फॉर्मेट के साथ संगत नहीं है, तो आपको "ट्रांसफर में आसानी" की तुलना में बहुत बड़ा मुद्दा मिल गया है
गुरगादुर्गेन

XML और JSON सेव (= धोखा) के साथ छेड़छाड़ करना बहुत आसान होगा। एक डेवलपर के रूप में, आप इसके साथ ठीक हो भी सकते हैं और नहीं भी।
त्रिगर्त ओउल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.