
الوقت المناسب ، مجتمع هبر.
قبل سنوات عديدة ، صادفت مشاركة
(1) . ثم كنت في حيرة من فرصة إنشاء عناصر مثيرة للاهتمام للعب في roguelike
(2) . لنفترض أن خصمًا قد يكون خلف جدار ، لا نراه حتى نواجهه في خط البصر. لكنني أفضل الوضع عندما نسافر على طول ممرات الزنزانة ، نكشف عن ميزات موقع الأشياء تدريجيًا استنادًا إلى منطقة الرؤية.
لاحقًا في المنشورات:
(3) و
(4) و
(5) ، تم النظر في أسئلة صب الظل في ألعاب ثنائية الأبعاد. كما لاحظ المؤلفون أنفسهم ، وفي التعليقات ، أن حساب الظلال ضخم للغاية وليس مهمة سهلة ، لكل من الآلة الحاسبة والتصميم.
بطريقة ما كان لدي بعض الأيام المجانية ، وقررت العودة إلى مسألة المزيد من الظلال الواعدة. من الواضح أن بطاقة الفيديو تتواءم مع الظلال بنجاح وبسرعة ، ولكن في هذه الحالة ، أردت معالجة الظلال للعبة ثنائية الأبعاد ، وبدا أنه من غير الضروري نقل الحسابات إلى بطاقة الفيديو. نعم ، ونمت قوة المعالج في السنوات الأخيرة ككل ، في الواقع منشور حول ما حدث في النهاية.
تم كتابة البرنامج بلغة باسكال ، ببساطة لأنني أعرفه جيدًا ، ولعازر هو بيئة تطوير متكاملة مفتوحة مع مجموعة واسعة من المكونات.
كانت الفكرة الأصلية هي رسم خطوط ، من المراقب عبر كل ركن من أركان البلاط ، ثم تعتيم الشكل الناتج.

ومع ذلك ، يبدو هذا الظل غير طبيعي إلى حد ما عندما تتغير زاوية الرؤية. أصبحت الظلال الآن أوسع ، وأضيق الآن.

ظل جسم مستدير يبدو أفضل بكثير. من أجل بناء مثل هذا الظل ، تحتاج إلى رسم ظلتين من نقطة المراقبة إلى الدائرة وإلى حدود الشاشة. سيتوافق قطر الدائرة مع حجم البلاط.
في برنامجي ، استخدمت الوظيفة التالية:
حيث (x1 ، y1) هي نقطة المراقبة ، (x2 ، y2) هي مركز الدائرة ، ® هي نصف قطرها ، و (x3 ، y3) و (x4 ، y4) هي نقاط تقاطع الخطوط والدائرة. ترجع الدالة فقط عندما يكون المراقب خارج الدائرة.
نظرًا لأن المعالج ليس ودودًا للغاية في علم المثلثات ، فقد حاولت استخدامه إلى الحد الأدنى. يعتمد في الواقع على قاعدة بسيطة (نموذج تقريبي) ، سيخبرك الخبراء بالسبب.
(ضعيف) SIN ، COS ..> '/'، SQRT> 'DIV'، 'MOD'> 'SHR'، 'SHL'> '*'> ': ='، '+'، '-'، 'AND '،' XOR '.. (جيد)من دواعي سروري تنفيذ الجزء الرسومي من البدائيين على القماش ، فهناك العديد من المكتبات والمحركات التي تسهل العمل. عند التطوير على دلفي ، كان علي استخدام مكتبة Agg2D ، على Lazarus يوجد منفذها
(6) ، وقررت أن أدرك الفكرة. في الواقع ، المكسب من المكتبة هو أن قناة ألفا تضاف إلى ألوان RGB ، ويتم تمهيد الأوليات ، وبسبب الوصول المباشر إلى وحدات البكسل والحيل المختلفة ، تكون المعالجة أسرع بكثير من القماش.
عند رسم ظل البلاط ، كنت في الأصل سأملأ القطاع بالظل ، ولكن الصورة داخل البلاط كانت سيئة التمييز (القطاع المعني في الشكل 3. مليء باللون الأخضر). بعد تجربة العديد من الخيارات ، توقفت عن اختيار قطاع من منطقة الظل.
لرسم هذا القطاع ، نحتاج إلى زاوية بالتقدير الدائري ، لكن علم المثلثات لا يزال غير قادر على ذلك. (arctan2 - وظيفة مكتبة وحدة الرياضيات)
في الواقع ، كل شيء جاهز لتجميع الصور. نأخذ خريطة للبلاط وعلى طبقة منفصلة نطبق الظلال بالتتابع ، واحدة تلو الأخرى. بالنسبة للأشجار ، تكون الظلال أكثر قتامة ، وبالنسبة للكائنات الأخرى ، تكون الظلال أكثر شفافية.

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

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

لقد أحببت التأثير كثيرًا لدرجة أنني اضطررت إلى جعل القياس عملية ديناميكية ، من خلال معلمة تعدد معينة.

كل ما تبقى هو إنشاء جدران مبهمة وتقديم النتيجة للمجتمع.

أتطلع إلى ألعاب جديدة باستخدام هذا التأثير أو تطويره.
شكرا لك
عرض توضيحي حيث يمكنك لمس المقابض (إكس للنوافذ).
الجزء الثاني ،
الجزء الثالثالمراجع:1) habr.com/post/16927/
2) en.wikipedia.org/wiki/Roguelike
3) habr.com/post/204782/
4) habr.com/post/305252/
5) habr.com/post/319530/
6) wiki.freepascal.org/BGRABitmap
7) twitter.com/joecreates