মার্জিত অটোটিলিং


10

লোকেরা কীভাবে তাদের টাইল-ভিত্তিক গেমগুলিতে স্বতঃপরিচয় প্রয়োগ করে সে সম্পর্কে আমি তথ্য খুঁজছি। এখনও অবধি আমি সবসময় এটিকে "যদি ... অন্য ..." বিবৃতি দিয়ে কিছু সংখ্যক হার্ডকোডযুক্ত দিয়ে তৈরি করেছি এবং এখন আমি স্থির করেছি যে আরও কিছু মার্জিত সমাধানের সন্ধানের সময় এসেছে। আমি স্বয়ংক্রিয়করণ বাস্তবায়ন এবং বিষয়টিতে আলোচনার উদাহরণগুলির জন্য ইন্টারনেটে অনুসন্ধান করতে গিয়েছিলাম, তবে আমি কেবল তিনটি নিবন্ধ নিয়ে এসেছি:

(বিশেষত শেষটিটি ব্যাপক এবং অত্যন্ত সহায়ক))

আমি লাইব্রেরির বিভিন্ন বাস্তবায়ন এবং ডকুমেন্টেশনগুলিও দেখেছি, এটি এটি প্রয়োগ করে, উদাহরণস্বরূপ, ফ্লিক্সেল: http://www.flixel.org/features.html#tilmaps

দুঃখের বিষয়, আমি যে সমস্ত সমাধানগুলি সন্ধান করতে পারি সেগুলি হ'ল ঠিক তেমন ইমপ্রুভড এবং হাফিজার্ড, যা আমি শুরু করেছিলাম এবং প্রায় সবই সম্ভাব্য কেসগুলি কভার করে না।

আমি স্বতঃকরণ প্রয়োগের একটি মার্জিত উদাহরণ খুঁজছি যা থেকে আমি শিখতে পারি।

উত্তর:


10

আমি টাইলম্যাপ প্রয়োগ করার জন্য একটি বিটওয়াস পদ্ধতি ব্যবহার করেছি এবং এটি একটি খুব মার্জিত সমাধান হিসাবে পেয়েছি। নিবন্ধটি একটি দৃ concrete় উদাহরণ সরবরাহ করে এবং একাধিক ভূখণ্ডের প্রকারগুলি পরিচালনা করতে কীভাবে অ্যালগরিদমকে প্রসারিত করা যায় তা আলোচনা করে।


এটি দেখতে অ্যালগরিদমের মতো দেখতে ফ্লিক্সেল "অটো" মোড অটোোটাইলিংয়ের দ্বারা ব্যবহৃত। আপনাকে ধন্যবাদ, আমি এটিকে আমার তালিকায় যুক্ত করছি।
রেডোমির ডপিরালস্কি

3

আমি নিজেই এই সমস্যাটি গুগল করে এখানে পৌঁছেছি, সংযুক্ত নিবন্ধগুলি পড়েছি এবং একটি অপেক্ষাকৃত কমপ্যাক্ট সমাধান প্রস্তুত করেছি যা 47 টি টাইলের সাধারণ সেট তৈরি করে। এটির মতো স্বয়ংক্রিয়ভাবে ব্যবহৃত উপাদানের জন্য এটি 2x3 টাইলসেটের প্রয়োজন:একটি 2x3 অটোটাইল টাইলসেট

উপরের বামে একক টাইল বৈকল্পিক সহ, উপরের ডানদিকে অভ্যন্তরীণ কোণ এবং নীচে চারটি বহিরাগত কোণার টাইলস (আপনি আরপিজি মেকারের কাছ থেকে এই ব্যবস্থাটি সনাক্ত করতে পারেন)।

কৌশলটি হ'ল প্রতিটি "লজিকাল" মানচিত্রের টাইলকে রেন্ডারিংয়ের জন্য 4 টি অর্ধ-টাইলসে বিভক্ত করা। তদ্ব্যতীত, টাইলসেটের একটি অর্ধ-টালি কেবল উত্পন্ন টাইলের মধ্যে সেই অবস্থানে থাকতে পারে , সুতরাং উপরের-বাম অর্ধেক টাইলটি কেবল উপরের-বাম অবস্থানে ব্যবহার করা যেতে পারে।

এই বিধিনিষেধের অর্থ হ'ল প্রতি 8 টি প্রতিবেশী টাইলের পরিবর্তে আপনার কেবল অর্ধ-টাইলের জন্য 3 টি ফুল-টাইল প্রতিবেশী পরীক্ষা করতে হবে।

আমি এই ধারণাটি এটির পরীক্ষার জন্য দ্রুত প্রয়োগ করেছি। এখানে প্রি-অফ কনসেপ্ট কোড (টাইপস্ক্রিপ্ট):

//const dirs = { N: 1, E: 2, S: 4, W:8, NE: 16, SE: 32, SW: 64, NW: 128 };
const edges = { A: 1+8+128, B: 1+2+16, C: 4+8+64, D: 4+2+32 };
const mapA = { 0:8, 128:8, 1:16, 8:10, 9:2, 137:18, 136:10, 129:16 };
const mapB = { 0:11, 16:11, 1:19, 2:9, 3:3, 19:17, 18:9, 17:19 };
const mapC = { 0:20, 64:20, 4:12, 8:22, 12:6, 76:14, 72:22, 68:12 };
const mapD = { 0:23, 32:23, 4:15, 2:21, 6:7, 38:13, 34:21, 36:15 };

export function GenerateAutotileMap(_map: number[][], _tile: integer): number[][]
{
    var result = [];
    for (var y=0; y < _map.length; y++) {
        const row = _map[y];
        const Y = y*2;
        // half-tiles
        result[Y] = [];
        result[Y+1] = [];
        // each row
        for (var x=0; x < row.length; x++) {
            // get the tile
            const t = row[x];
            const X = x*2;
            if (t != _tile) continue;
            // Check nearby tile materials.
            const neighbors = (North(_map, x, y) == t? 1:0)
                + (East(_map, x, y) == t? 2:0)
                + (South(_map, x, y) == t? 4:0)
                + (West(_map, x, y) == t? 8:0)
                + (NorthEast(_map, x, y) == t? 16:0)
                + (SouthEast(_map, x, y) == t? 32:0)
                + (SouthWest(_map, x, y) == t? 64:0)
                + (NorthWest(_map, x, y) == t? 128:0);
            // Isolated tile
            if (neighbors == 0) {
                result[Y][X] = 0;
                result[Y][X+1] = 1;
                result[Y+1][X] = 4;
                result[Y+1][X+1] = 5;
                continue;
            }
            // Find half-tiles.
            result[Y][X] = mapA[neighbors & edges.A];
            result[Y][X+1] = mapB[neighbors & edges.B];
            result[Y+1][X] = mapC[neighbors & edges.C];
            result[Y+1][X+1] = mapD[neighbors & edges.D];
        }
    }
    return result;
}    

ব্যাখ্যা:

  • Aটাইলের উপরের বাম অংশ, Bউপরের ডানদিকে, Cনীচের বামে, Dনীচের ডানদিকে।
  • edges এগুলির প্রত্যেকের জন্য বিটমাস্ক রয়েছে, সুতরাং আমরা কেবল প্রাসঙ্গিক প্রতিবেশী তথ্য গ্রহন করতে পারি।
  • map* টাইলসেট চিত্রের (0..24) গ্রাফিক সূচকগুলিতে প্রতিবেশী রাষ্ট্রগুলির ম্যাপিংয়ের অভিধানগুলি।
    • যেহেতু প্রতিটি অর্ধ-টাইল 3 প্রতিবেশী যাচাই করে, প্রত্যেকের 2 ^ 3 = 8 টি স্থিতি রয়েছে।
  • _tile স্বয়ংচালিত জন্য লক্ষ্যযুক্ত টাইল হয়।
  • যেহেতু আমাদের লজিকাল টাইলগুলি আমাদের রেন্ডারিং টাইলগুলির দ্বিগুণ বড়, তাই সমস্ত অটোোটাইল কর্ড (x, y) রেন্ডারিং মানচিত্রে দ্বিগুণ করতে হবে।

যাইহোক, এখানে ফলাফল (কেবলমাত্র একটি টাইল সহ, যাইহোক):এখানে চিত্র বর্ণনা লিখুন


0

আমি বেশিরভাগ লিঙ্কগুলি পড়েছি এবং কিছু সময় ব্যয় করেছি যাতে অন্য একটি সমাধান আসে। আমি জানি না এটি ভাল কিনা বা না, তবে আরপিজি নির্মাতা ভিএক্স এস -এর অটো-টাইল আচরণ (47 টাইলস) অনুকরণ করার জন্য আমি এরকম কিছু করতে শুরু করেছি:

(বাম 0 বা 1) + (ডান 0 বা 1) + (0 বা 1 আপ) + (0 বা 1 নীচে) এখন আমার 5 টি কেস রয়েছে।

যদি 4 = টাইল 46 স্থাপন করা হয়

যদি 3 বোর্ডার =

যদি 2 4 কেস + 2 ক্ষেত্রে অ্যালগরিদম সম্পর্কে নিশ্চিত না হয় তবে খুব বেশি শাখা তৈরি করতে হয় না।

যদি 1 = এটিতে কাজ করে তবে প্রতিটি দিক 4 টি ক্ষেত্রে শেষ হতে পারে

যদি 0 = আমি 1, 2, 4, 8 এর লিঙ্কগুলিতে দেখানো নম্বরটি অ্যালগরিদম ব্যবহার করতে পারি এবং 1 থেকে 15 পর্যন্ত আইডি পেয়ে আমি সরাসরি ব্যবহার করতে পারি।

আমি কোনও প্রোগ্রামার নই এবং গণিতের অ্যালগরিদমগুলির সাথে সেরাও নই এবং 1, 2, 4, 8, 16, 32, 64, 128 সমাধানটি আমি খুব পছন্দ করি না।

হয়তো আমার পদ্ধতির চেয়ে কমপক্ষে ভাল।


1
আমি নিশ্চিত নই যে এই উত্তরটি পুরোপুরি প্রশ্নের উত্তর দিয়েছে, আপনি কি আরও কিছু ব্যাখ্যা করতে পারবেন? আপনি যদি অন্য কোনও বিষয় উল্লেখ করেন তবে আপনি কি এটির সাথে অন্তত লিঙ্ক করতে পারেন?
ভাইল্যানকোর্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.