আমি নিজেই এই সমস্যাটি গুগল করে এখানে পৌঁছেছি, সংযুক্ত নিবন্ধগুলি পড়েছি এবং একটি অপেক্ষাকৃত কমপ্যাক্ট সমাধান প্রস্তুত করেছি যা 47 টি টাইলের সাধারণ সেট তৈরি করে। এটির মতো স্বয়ংক্রিয়ভাবে ব্যবহৃত উপাদানের জন্য এটি 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) রেন্ডারিং মানচিত্রে দ্বিগুণ করতে হবে।
যাইহোক, এখানে ফলাফল (কেবলমাত্র একটি টাইল সহ, যাইহোক):