إنشاء خرائط من ميزات الضوضاء

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


لن أشرح كيفية رسم مثل هذه البطاقات: يعتمد ذلك على اللغة ومكتبة الرسومات والمنصة وما إلى ذلك. سأشرح فقط كيفية تعبئة المصفوفة ببيانات الخرائط.

الضجيج


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

الصورة

نقوم بتعيين رقم من 0.0 إلى 1.0 لكل نقطة على الخريطة. في هذه الصورة ، 0.0 أسود و 1.0 أبيض. فيما يلي كيفية تعيين لون كل نقطة شبكة في بناء لغة لغة تشبه C:

for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { double nx = x/width - 0.5, ny = y/height - 0.5; value[y][x] = noise(nx, ny); } } 

ستعمل الحلقة بنفس الطريقة في Javascript و Python و Haxe و C ++ و C # و Java ومعظم اللغات الشائعة الأخرى ، لذلك سأعرضها في صيغة تشبه C حتى تتمكن من تحويلها إلى اللغة التي تحتاجها. في باقي البرنامج التعليمي ، سأوضح كيف يتغير نص الحلقة ( value[y][x]=… السطر value[y][x]=… ) عند إضافة وظائف جديدة. سيظهر العرض التوضيحي مثالاً كاملاً.

في بعض المكتبات ، سيكون من الضروري تغيير أو مضاعفة القيم الناتجة لإعادتها في النطاق من 0.0 إلى 1.0.

الارتفاع


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



ظل الرمز كما هو تقريبًا ، باستثناء الحلقة الداخلية. الآن يبدو هذا:

 elevation[y][x] = noise(nx, ny); 

نعم ، هذا كل شيء. ظلت بيانات الخريطة كما هي ، ولكن الآن elevation عليها elevation (الارتفاع) ، وليس value .

لدينا الكثير من التلال ، ولكن ليس أكثر. ما الخطب؟

التردد


يمكن توليد الضوضاء بأي تردد . حتى الآن اخترت تردد واحد فقط. دعونا نرى كيف يؤثر ذلك.

حاول تغيير القيمة باستخدام شريط التمرير (في المقالة الأصلية) وشاهد ما يحدث بترددات مختلفة:


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

 elevation[y][x] = noise(freq * nx, freq * ny); 

من المفيد في بعض الأحيان أيضًا تذكر الطول الموجي ، وهو المقابل المتبادل للحجم. عندما يتم مضاعفة التردد ، يتم تقليل الحجم إلى النصف فقط. مضاعفة الطول الموجي كل الزوجي. الطول الموجي هو المسافة المقاسة بالبكسل / البلاط / الأمتار أو أي وحدات أخرى حددتها للخرائط. وهو مرتبط بالتردد: wavelength = map_size / frequency .

ثمانيّات


لجعل خريطة الارتفاع أكثر إثارة للاهتمام ، سنضيف ضوضاء بترددات مختلفة :



 elevation[y][x] = 1 * noise(1 * nx, 1 * ny); + 0.5 * noise(2 * nx, 2 * ny); + 0.25 * noise(4 * nx, 2 * ny); 

دعونا نمزج التلال الكبيرة منخفضة التردد مع التلال الصغيرة عالية التردد في خريطة واحدة. حرك المنزلق (في المقالة الأصلية) لإضافة تلال صغيرة إلى المزيج:


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

إعادة التوزيع


تعطينا وظيفة الضجيج قيمًا بين 0 و 1 (أو من -1 إلى +1 ، اعتمادًا على المكتبة). لإنشاء سهول مسطحة ، يمكننا رفع الارتفاع إلى قوة . حرك المنزلق (في المقالة الأصلية) للحصول على درجات مختلفة.


 e = 1 * noise(1 * nx, 1 * ny); + 0.5 * noise(2 * nx, 2 * ny); + 0.25 * noise(4 * nx, 4 * ny); elevation[y][x] = Math.pow(e, exponent); 

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

الآن بعد أن أصبح لدينا خريطة ارتفاع واقعية ، دعنا نضيف مناطق أحيائية!

المناطق الأحيائية


الضوضاء تعطي أرقامًا ، لكننا بحاجة إلى خريطة تضم الغابات والصحاري والمحيطات. أول شيء يمكنك القيام به هو تحويل المرتفعات الصغيرة إلى ماء:


 function biome(e) { if (e < waterlevel) return WATER; else return LAND; } 

واو ، لقد أصبح هذا بالفعل مثل عالم تم إنشاؤه إجرائيا! لدينا ماء وعشب وثلج. ولكن ماذا لو احتجنا المزيد؟ دعونا نصنع سلسلة من الماء والرمل والعشب والغابات والسافانا والصحراء والثلج:



الإغاثة على أساس الارتفاع

 function biome(e) { if (e < 0.1) return WATER; else if (e < 0.2) return BEACH; else if (e < 0.3) return FOREST; else if (e < 0.5) return JUNGLE; else if (e < 0.7) return SAVANNAH; else if (e < 0.9) return DESERT; else return SNOW; } 

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



أعلاه ضجيج المرتفعات. ضجيج الرطوبة القاع

الآن دعونا نستخدم الارتفاع والرطوبة معًا . في الصورة الأولى الموضحة أدناه ، المحور ص هو الارتفاع (مأخوذ من الصورة أعلاه) ، والمحور س هو الرطوبة (الصورة الثانية أعلى). هذا يعطينا خريطة مقنعة:



تخفيف على أساس قيمتي ضوضاء

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

 function biome(e, m) { if (e < 0.1) return OCEAN; if (e < 0.12) return BEACH; if (e > 0.8) { if (m < 0.1) return SCORCHED; if (m < 0.2) return BARE; if (m < 0.5) return TUNDRA; return SNOW; } if (e > 0.6) { if (m < 0.33) return TEMPERATE_DESERT; if (m < 0.66) return SHRUBLAND; return TAIGA; } if (e > 0.3) { if (m < 0.16) return TEMPERATE_DESERT; if (m < 0.50) return GRASSLAND; if (m < 0.83) return TEMPERATE_DECIDUOUS_FOREST; return TEMPERATE_RAIN_FOREST; } if (m < 0.16) return SUBTROPICAL_DESERT; if (m < 0.33) return GRASSLAND; if (m < 0.66) return TROPICAL_SEASONAL_FOREST; return TROPICAL_RAIN_FOREST; } 

إذا لزم الأمر ، يمكنك تغيير كل هذه القيم وفقًا لمتطلبات لعبتك.

إذا لم نكن بحاجة إلى مناطق أحيائية ، فإن التدرجات الناعمة (انظر هذه المقالة ) يمكن أن تخلق الألوان:



بالنسبة لكل من المناطق الحيوية والتدرجات ، لا توفر قيمة الضجيج المنفردة تغيرًا كافيًا ، لكن اثنتين تكفيان.

المناخ


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


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

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

الجزر


في بعض المشاريع ، كنت بحاجة إلى حدود الخريطة لتكون المياه. هذا يحول العالم إلى جزيرة واحدة أو أكثر. هناك العديد من الطرق للقيام بذلك ، لكنني استخدمت حلًا بسيطًا إلى حد ما في منشئ الخريطة المضلع: لقد قمت بتغيير الارتفاع كـ e = e + a - b*d^c ، حيث d هي المسافة من المركز (على مقياس 0-1). خيار آخر هو تغيير e = (e + a) * (1 - b*d^c) . يرفع الثابت a كل شيء للأعلى ، ويخفض b الحواف لأسفل ، ويتحكم c في معدل الانخفاض.


لست راضيا تماما عن هذا ولا يزال هناك الكثير مما يتعين استكشافه. يجب أن تكون المسافة مانهاتن أو الإقليدية؟ هل يجب أن تعتمد على المسافة إلى المركز أو المسافة إلى الحافة؟ هل يجب أن تكون المسافة مربعة أم خطية أم تحمل درجة أخرى؟ هل يجب أن يكون الجمع / الطرح أو الضرب / القسمة أو أي شيء آخر؟ في المقالة الأصلية ، جرب Add ، a = 0.1 ، b = 0.3 ، c = 2.0 أو جرب Multiply ، a = 0.05 ، b = 1.00 ، c = 1.5. الخيارات التي تناسبك تعتمد على مشروعك.

لماذا تلتزم بوظائف الرياضيات القياسية على الإطلاق؟ كما قلت في مقالتي حول الضرر في RPG ( الترجمة على حبري) ، يستخدم الجميع (بما في ذلك أنا) الوظائف الرياضية ، مثل كثيرات الحدود ، والتوزيع الأسي ، وما إلى ذلك ، ولكن على الكمبيوتر لا يمكننا أن يقتصر عليهم. يمكننا أخذ أي وظيفة تشكيل واستخدامها هنا ، باستخدام جدول البحث e = e + height_adjust[d] . حتى الآن لم أدرس هذه القضية.

ضجيج شائك


بدلاً من رفع الارتفاع إلى قوة ، يمكننا استخدام القيمة المطلقة لإنشاء قمم حادة:

 function ridgenoise(nx, ny) { return 2 * (0.5 - abs(0.5 - noise(nx, ny))); } 

لإضافة أوكتاف ، يمكننا تغيير اتساع الترددات العالية بحيث تتلقى الجبال فقط الضوضاء المضافة:

 e0 = 1 * ridgenoise(1 * nx, 1 * ny); e1 = 0.5 * ridgenoise(2 * nx, 2 * ny) * e0; e2 = 0.25 * ridgenoise(4 * nx, 4 * ny) * (e0+e1); e = e0 + e1 + e2; elevation[y][x] = Math.pow(e, exponent); 


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

التراسات


إذا قرّبنا الارتفاع إلى المستويات n التالية ، نحصل على تراسات:


هذا هو نتيجة تطبيق دالة إعادة توزيع الارتفاع في النموذج e = f(e) . أعلاه ، استخدمنا e = Math.pow(e, exponent) لشحذ قمم الجبال ؛ هنا نستخدم e = Math.round(e * n) / n لإنشاء تراسات. إذا كنت تستخدم وظيفة غير خطوة ، فيمكن تقريب المدرجات أو حدوثها عند ارتفاعات معينة فقط.

وضع الشجرة


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


 for (int yc = 0; yc < height; yc++) { for (int xc = 0; xc < width; xc++) { double max = 0; //     for (int yn = yc - R; yn <= yc + R; yn++) { for (int xn = xc - R; xn <= xc + R; xn++) { double e = value[yn][xn]; if (e > max) { max = e; } } } if (value[yc][xc] == max) { //    xc,yc } } } 

باختيار R مختلف لكل منطقة بيولوجية ، يمكننا الحصول على كثافة متغيرة من الأشجار:



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

إلى ما لا نهاية وما بعدها


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



التنفيذ


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

  • جافا سكريبت:

     let gen = new SimplexNoise(); function noise(nx, ny) { // Rescale from -1.0:+1.0 to 0.0:1.0 return gen.noise2D(nx, ny) / 2 + 0.5; } let value = []; for (let y = 0; y < height; y++) { value[y] = []; for (let x = 0; x < width; x++) { let nx = x/width - 0.5, ny = y/height - 0.5; value[y][x] = noise(nx, ny); } } 
  • C ++:

     module::Perlin gen; double noise(double nx, double ny) { // Rescale from -1.0:+1.0 to 0.0:1.0 return gen.GetValue(nx, ny, 0) / 2.0 + 0.5; } double value[height][width]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { double nx = x/width - 0.5, ny = y/height - 0.5; value[y][x] = noise(nx, ny); } } 
  • بايثون:

     from opensimplex import OpenSimplex gen = OpenSimplex() def noise(nx, ny): # Rescale from -1.0:+1.0 to 0.0:1.0 return gen.noise2d(nx, ny) / 2.0 + 0.5 value = [] for y in range(height): value.append([0] * width) for x in range(width): nx = x/width - 0.5 ny = y/height - 0.5 value[y][x] = noise(nx, ny) 

جميع مكتبات الضوضاء متشابهة إلى حد كبير. جرب openimplex لـ Python أو libnoise لـ C ++ أو الضوضاء البسيطة لـ Javascript. بالنسبة للغات الأكثر شيوعًا ، هناك العديد من مكتبات الضوضاء. أو يمكنك معرفة كيفية عمل ضجيج بيرلين أو إدراك الضوضاء بنفسك. لم أفعل ذلك.

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

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

يعتمد عرض الخريطة على النظام الأساسي واللعبة ، لذلك لم أقم بتنفيذها ؛ هذا الرمز مطلوب فقط لتوليد الارتفاعات والبيوميات ، والتي يعتمد تقديمها على النمط المستخدم في اللعبة. يمكنك نسخه ونقله واستخدامه في مشاريعك.

التجارب


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


هنا رمز عينة:

 var rng1 = PM_PRNG.create(seed1); var rng2 = PM_PRNG.create(seed2); var gen1 = new SimplexNoise(rng1.nextDouble.bind(rng1)); var gen2 = new SimplexNoise(rng2.nextDouble.bind(rng2)); function noise1(nx, ny) { return gen1.noise2D(nx, ny)/2 + 0.5; } function noise2(nx, ny) { return gen2.noise2D(nx, ny)/2 + 0.5; } for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var nx = x/width - 0.5, ny = y/height - 0.5; var e = (1.00 * noise1( 1 * nx, 1 * ny) + 0.50 * noise1( 2 * nx, 2 * ny) + 0.25 * noise1( 4 * nx, 4 * ny) + 0.13 * noise1( 8 * nx, 8 * ny) + 0.06 * noise1(16 * nx, 16 * ny) + 0.03 * noise1(32 * nx, 32 * ny)); e /= (1.00+0.50+0.25+0.13+0.06+0.03); e = Math.pow(e, 5.00); var m = (1.00 * noise2( 1 * nx, 1 * ny) + 0.75 * noise2( 2 * nx, 2 * ny) + 0.33 * noise2( 4 * nx, 4 * ny) + 0.33 * noise2( 8 * nx, 8 * ny) + 0.33 * noise2(16 * nx, 16 * ny) + 0.50 * noise2(32 * nx, 32 * ny)); m /= (1.00+0.75+0.33+0.33+0.33+0.50); /* draw biome(e, m) at x,y */ } } 

هناك صعوبة: من أجل ضجيج المرتفعات والرطوبة ، من الضروري استخدام بذرة مختلفة ، وإلا فستكون هي نفسها ، ولن تبدو البطاقات مثيرة للاهتمام. في جافا سكريبت ، أستخدم مكتبة prng-parkmiller ؛ في C ++ ، يمكنك استخدام كائنين خطيين منفصلين لمحرك_الخط ؛ في Python ، يمكنك إنشاء مثيلين منفصلين لفئة عشوائية .

أفكار


أنا أحب هذا النهج لتكوين الخريطة لبساطته . إنه سريع ويتطلب القليل من التعليمات البرمجية لتحقيق نتائج لائقة.

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

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

معلومات إضافية


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

تأثر هذا المشروع بمشاريع إنشاء الخرائط السابقة:

  • لقد استخدمت ضجيج بيرلين العام لأول مولد لبطاقة Mad God of Mad God . استخدمناها في الأشهر الستة الأولى من اختبار ألفا ، ثم استبدلناها بمولد خريطة على مضلعات Voronoi ، تم إنشاؤها خصيصًا لمتطلبات اللعب التي حددناها أثناء اختبار ألفا. تؤخذ المناطق الحيوية وألوانها للمقال من هذه المشاريع.
  • عند دراسة معالجة الإشارات الصوتية ، كتبت برنامجًا تعليميًا للضوضاء يشرح مفاهيم مثل التردد والسعة والأوكتافات و "لون" الضوضاء. تنطبق نفس المفاهيم التي تعمل من أجل الصوت أيضًا على توليد البطاقات القائمة على الضوضاء. في ذلك الوقت ، قمت بإنشاء بعض جيل الإغاثة التجريبي التجريبي ، لكنني لم أكملهم.
  • أحيانًا أجرب للعثور على الحدود. كنت أرغب في معرفة مقدار الرمز الأدنى المطلوب لإنشاء خرائط جذابة. في هذا المشروع المصغر ، وصلت إلى صفر سطر من التعليمات البرمجية - يتم كل شيء باستخدام مرشحات الصور (الاضطراب ، العتبات ، تدرجات الألوان). هذا جعلني سعيدا وحزينا. إلى أي مدى يمكن تنفيذ إنشاء الخرائط بواسطة مرشحات الصور؟ بشكل كبير بما فيه الكفاية. كل ما تم وصفه أعلاه حول "مخطط التدرجات اللونية الناعمة" مأخوذ من هذه التجربة. طبقة الضوضاء عبارة عن مرشح صورة مضطرب ؛ الأوكتافات هي صور متراكبة على بعضها البعض ؛ تسمى أداة الدرجة "تصحيح المنحنى" في Photoshop.

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

هناك العديد من الأشياء التي يمكن القيام بها بالضوضاء ، في المقالة التي ذكرتها فقط القليل. جرب Noise Studio لاختبار الميزات المختلفة بشكل تفاعلي.

Source: https://habr.com/ru/post/ar430384/


All Articles