سؤال

لنفترض أنك تقوم ببناء لعبة تتريس.كأي مبرمج مناسب، لديك منطق العرض الخاص بك على جانب، ومنطق عملك على الجانب الآخر؛من المحتمل أن يحدث MVC كامل.

عندما يرسل النموذج الخاص به update(), ، يعيد العرض رسم نفسه، كما هو متوقع.

ولكن بعد ذلك...إذا أردت، على سبيل المثال، إضافة رسم متحرك لإخفاء خط ما، فكيف يمكنك تنفيذ ذلك في العرض؟

قم بأي افتراضات تريدها --- باستثناء أن "كل شيء مغلف بشكل صحيح".

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

المحلول

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

الآن، إذا كانت هناك خطوط يجب محوها، فإن المنطق يعرف ويمكنه وضع علامة على تلك الخطوط المراد إزالتها.أفترض هنا أن كل قطعة تتكون من 4 كتل مفردة وأي من هذه الكتل عبارة عن كائن واحد.الآن عندما تحتوي هذه الكتلة على علامة "القالب"، قد تحتاج إلى بعض أجزاء العرض لتختفي الكتلة (على سبيل المثال، 500 مللي ثانية للانفجار).بعد هذا الوقت، قد يتم التخلص من الكائن وتسقط الكتلة التي يوجد خط فوقها.لماذا 500 مللي ثانية؟حسنا، يجب عليك بالتأكيد استخدام الحركة على أساس الوقت لأن هذا يحافظ على سرعة اللعبة كما هي على أجهزة كمبيوتر مختلفة.

راجع للشغل، يوجد بالفعل ما يسمى بمحركات الألعاب التي توفر حلقة عرض التحديث هذه.على سبيل المثال XNA، إذا انتقلت إلى خط .NET.يمكنك أيضًا برمجة المحرك الخاص بك ولكن احذر، فهي ليست مهمة سهلة وتستغرق وقتًا طويلاً.لقد فعلت ذلك مرة واحدة ولا أتوقع أن يكون محركًا مثل Source Engine؛-)

نصائح أخرى

تقوم معظم الألعاب بتنفيذ حلقة تم إعادة توجيهها باستمرار عرض اللعبة بأسرع وقت ممكن، بدلا من انتظار تغيير في الحالة النموذجية ثم تحديث العرض.

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

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

لقد تساءلت كثيرا عن هذا بنفسي.

كانت أفكاري الخاصة على طول هذا الخط:

1) يتم إعطاء الرأي حالة الكتل (الشكل، YADA-YAAA)، ولكن مع بيانات "انتقالية" إضافية:

2) حقيقة أنه يجب إزالة الخط في الحالة، غير محسوبة في الرأي.

3) المنظر يعرف كيفية رسم التحولات الآن:

  • لا تغيير: الدولة هي نفسها بالنسبة لهذه الكتلة المعينة
  • تغيير من "الوقوع" إلى "مغلق": الدولة "مغلق" (بواسطة كتلة إسقاط)
  • تغيير من "مغلق" إلى "إزالة": الحالة "إزالتها" (بواسطة إكمال خط)
  • تغيير من "الوقوع" إلى "إزالة": الحالة "إزالتها"، لكن الحالة القديمة كانت "تسقط"

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

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

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

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