سؤال

كنت أرغب في "محاكاة" لعبة فلاش مشهورة، Chrontron، بلغة C++ وكنت بحاجة إلى بعض المساعدة للبدء.(ملحوظة:ليس من أجل التحرير، فقط أتدرب لنفسي)

Basics:
Player has a time machine. On each iteration of using the time machine, a parallel state
is created, co-existing with a previous state. One of the states must complete all the
objectives of the level before ending the stage. In addition, all the stages must be able
to end the stage normally, without causing a state paradox (wherein they should have
been able to finish the stage normally but, due to the interactions of another state,
were not).

لذلك، هذا النوع من يفسر كيفية عمل اللعبة.يجب أن تلعبها قليلاً لفهم ماهية مشكلتي.

أفكر في طريقة جيدة لحل هذا الأمر هو استخدام القوائم المرتبطة لتخزين كل ولاية ، والتي من المحتمل أن تكون إما خريطة تجزئة ، استنادًا إلى الوقت ، أو قائمة مرتبطة تتكرر على الوقت.ما زلت غير متأكد.

السؤال الفعلي:

الآن بعد أن حصلت على بعض المواصفات التقريبية، أحتاج إلى بعض المساعدة في تحديد هياكل البيانات التي سيتم استخدامها لهذا الغرض ولماذا.أريد أيضًا معرفة واجهة برمجة التطبيقات/الطبقة الرسومية التي يجب أن أستخدمها للقيام بذلك:SDL أو OpenGL أو DirectX (خياري الحالي هو SDL).وكيف سأقوم بتنفيذ الدول الموازية؟مع المواضيع المتوازية؟

تعديل (للتوضيح أكثر):
نظام التشغيل - Windows (نظرًا لأن هذا مشروع هواية، فيمكن القيام بذلك في Linux لاحقًا)
الرسومات - لغة ثنائية الأبعاد - C ++ (يجب أن تكون C ++ - هذه ممارسة لفصل دراسي مقبل)

س- بدون إجابة:SDL :برنامج OpenGL :المباشر X
س-الإجابة:تجنب المعالجة الموازية
س-الإجابة:استخدم STL لتنفيذ إجراءات الخطوة الزمنية.

So far from what people have said, I should:
1. Use STL to store actions.
2. Iterate through actions based on time-step.
3. Forget parallel processing -- period. (But I'd still like some pointers as to how it
could be used and in what cases it should be used, since this is for practice).

ملحقًا بالسؤال، لقد استخدمت C# وPHP وJava في الغالب من قبل لذا لا أصف نفسي كمبرمج بارع.ما هي المعرفة المحددة بـ C++ التي من شأنها أن تساعد في تسهيل هذا المشروع بالنسبة لي؟(أي.ثلاثة أبعاد؟)

هل كانت مفيدة؟

المحلول

ما يجب عليك فعله هو أولاً قراءة وفهم حلقة اللعبة "الخطوة الزمنية الثابتة" (إليك شرحًا جيدًا: http://www.gaffer.org/game-physics/fix-your-timestep).

ثم ما عليك فعله هو الاحتفاظ بقائمة من أزواج عداد الإطار والإجراء.مثال للمحكمة الخاصة بلبنان:

std::list<std::list<std::pair<unsigned long, Action> > > state;

أو ربما ناقل لقوائم الأزواج.لإنشاء الحالة، لكل إجراء (تفاعل اللاعب) تقوم بتخزين رقم الإطار والإجراء الذي يتم تنفيذه، على الأرجح أنك ستحصل على أفضل النتائج إذا تم ببساطة "الضغط على المفتاح <X>" أو "تحرير المفتاح <X>" ":

state.back().push_back(std::make_pair(currentFrame, VK_LEFT | KEY_PRESSED));

لتشغيل الحالات السابقة، يجب عليك إعادة تعيين عداد الإطار في كل مرة يقوم فيها اللاعب بتنشيط آلة الزمن ثم التكرار خلال قائمة الحالات لكل حالة سابقة ومعرفة ما إذا كان أي منها يطابق الإطار الحالي.إذا كان هناك، قم بتنفيذ الإجراء لتلك الحالة.للتحسين، يمكنك الاحتفاظ بقائمة من المكررات إلى مكان تواجدك في كل قائمة حالة سابقة.وهنا بعض كود مزيف من أجل هذا:

typedef std::list<std::pair<unsigned long, Action> > StateList;
std::list<StateList::iterator> stateIteratorList;
//
foreach(it in stateIteratorList)
{
  if(it->first == currentFrame)
  {
    performAction(it->second);
    ++it;
  }
}

أتمنى أن تصلك الفكرة...

من شأن سلاسل الرسائل المنفصلة أن تؤدي إلى تعقيد الأمر بشكل كبير، وبهذه الطريقة تحصل على نفس النتيجة في كل مرة، وهو ما لا يمكنك ضمانه باستخدام سلاسل رسائل منفصلة (لا يمكنك حقًا رؤية كيفية تنفيذ ذلك) أو حلقة لعبة غير ثابتة ذات خطوات زمنية.

عندما يتعلق الأمر بواجهة برمجة تطبيقات الرسومات، سأختار SDL لأنه ربما يكون أسهل شيء للبدء.يمكنك دائمًا استخدام OpenGL من SDL لاحقًا إذا كنت تريد الانتقال إلى الأبعاد الثلاثية.

نصائح أخرى

هذا يبدو مشابها جدا ل جديلة.أنت حقًا لا تريد معالجة متوازية لهذا - فالبرمجة المتوازية هي كذلك صعب, ، ولشيء مثل هذا، لا ينبغي أن يكون الأداء مشكلة.

نظرًا لأن متجه حالة اللعبة سينمو بسرعة كبيرة (ربما بترتيب عدة كيلو بايت في الثانية، اعتمادًا على معدل الإطارات وكمية البيانات التي تخزنها)، فأنت لا تريد قائمة مرتبطة، والتي تحتوي على الكثير من الحمل من حيث من المساحة (ويمكن أن يفرض عقوبات كبيرة على الأداء بسبب أخطاء ذاكرة التخزين المؤقت إذا تم وضعها بشكل سيء).لكل مخطط زمني متوازي، تريد بنية بيانات متجهة.يمكنك تخزين كل جدول زمني متوازي في قائمة مرتبطة.كل خط زمني يعرف في أي وقت بدأ.

لتشغيل اللعبة، عليك التكرار عبر جميع المخططات الزمنية النشطة وتنفيذ إجراءات تساوي إطارًا واحدًا من كل منها في خطوة ثابتة.لا حاجة للمعالجة المتوازية.

لقد لعبت هذه اللعبة من قبل.لا أعتقد بالضرورة أن المعالجة المتوازية هي الحل الأمثل.لقد قمت بمشاركة كائنات في اللعبة (الروافع، الصناديق، المصاعد، إلخ) والتي ستحتاج إلى مشاركتها بين العمليات، ربما مع كل دلتا، وبالتالي تقليل فعالية التوازي.

أنا شخصيًا سأحتفظ بقائمة من الإجراءات، ثم لكل تكرار لاحق، أبدأ في تشذيرها معًا.على سبيل المثال، إذا كانت القائمة بتنسيق <[iteration.action]>، فسيتم تنفيذ الإجراءات 1.1 و2.1 و3.1 و1.2 و2.2 و3.3 وما إلى ذلك في المرة الثالثة.

بعد إلقاء نظرة سريعة على الوصف، أعتقد أن لديك الفكرة الصحيحة، سيكون لدي كائن حالة يحمل بيانات الحالة، وأضعه في قائمة مرتبطة...لا أعتقد أنك بحاجة إلى سلاسل رسائل متوازية...

فيما يتعلق بواجهة برمجة تطبيقات الرسومات، فقد استخدمت opengl فقط، ويمكنني القول إنها قوية جدًا وتحتوي على واجهة برمجة تطبيقات C / C++ جيدة، وسيكون opengl أيضًا أكثر عبر الأنظمة الأساسية حيث يمكنك استخدام مكتبة Messia على أجهزة كمبيوتر *Nix.

فكرة لعبة مثيرة جدا للاهتمام.أعتقد أنك على حق في أن الحوسبة المتوازية ستكون مفيدة لهذا التصميم، ولكن ليس أكثر من أي برنامج آخر عالي الموارد.

السؤال غامض بعض الشيء.أرى أنك ستكتب هذا بلغة C++ ولكن ما هو نظام التشغيل الذي تقوم بترميزه؟هل تنوي أن تكون منصة مشتركة وما هو نوع الرسومات التي تريدها، على سبيل المثال، ثلاثية الأبعاد، ثنائية الأبعاد، عالية الجودة، ومعتمدة على الويب.

لذلك نحن في الأساس بحاجة إلى الكثير من المعلومات.

المعالجة المتوازية ليست الحل.يجب عليك ببساطة "تسجيل" تصرفات اللاعب ثم تشغيلها مرة أخرى "للإجراءات السابقة"

لذلك تقوم بإنشاء متجه (قائمة مرتبطة بشكل فردي) من المتجهات التي تحمل الإجراءات.ما عليك سوى تخزين رقم الإطار الذي تم اتخاذ الإجراء فيه (أو الدلتا) وإكمال هذا الإجراء على "الروبوت الوهمي" الذي يمثل اللاعب خلال تلك الحالة المحددة.ما عليك سوى تكرار الحالات وتشغيلها واحدة تلو الأخرى.

تحصل على تأثير جانبي يتمثل في "كسر" اللعبة بسهولة عندما تحدث مفارقة الحالة ببساطة بسبب فشل الإجراء التالي.

ما لم تكن في حاجة ماسة إلى استخدام لغة C++ في تعليمك الخاص، فيجب عليك بالتأكيد أن تنظر إليها XNA لإطار اللعبة والرسومات الخاص بك (يستخدم C#).إنه مجاني تمامًا، ويفعل الكثير من الأشياء لك، وقريبًا ستتمكن من بيع لعبتك على Xbox Live.

للإجابة على سؤالك الرئيسي، لا يتطلب أي شيء يمكنك القيام به بالفعل في Flash استخدام أكثر من موضوع واحد.ما عليك سوى تخزين قائمة بالمواضع في مصفوفة وتنفيذها باستخدام إزاحة مختلفة لكل روبوت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top