মানচিত্র টাইলিং অ্যালগরিদম


153

মানচিত্র

আমি জাভাস্ক্রিপ্টের সাথে টাইল ভিত্তিক আরপিজি বানাচ্ছি, পার্লিন শব্দের উচ্চতা ম্যাপগুলি ব্যবহার করে, তারপর শব্দের উচ্চতার উপর ভিত্তি করে একটি টাইল টাইপ বরাদ্দ করছি।

মানচিত্রগুলি এ জাতীয় কিছু দেখায় (মিনিম্যাপে দেখুন)।

এখানে চিত্র বর্ণনা লিখুন

আমার কাছে মোটামুটি সরল অ্যালগরিদম রয়েছে যা চিত্রের প্রতিটি পিক্সেল থেকে রঙের মানটি বের করে এবং এটির (0-05) এর মধ্যবর্তী অবস্থানের উপর নির্ভর করে এটি পূর্ণসংখ্যায় (0-5) রূপান্তর করে যা টাইল অভিধানে টাইলের সাথে মিল রয়েছে। এই 200x200 অ্যারেটি ক্লায়েন্টকে দেওয়া হয়।

ইঞ্জিন তারপরে অ্যারের মানগুলি থেকে টাইলগুলি নির্ধারণ করে এবং সেগুলি ক্যানভাসে টেনে নেয়। সুতরাং, আমি আকর্ষণীয় জগতগুলি দিয়ে শেষ করেছি যেখানে বাস্তবসম্মত চেহারা বৈশিষ্ট্য রয়েছে: পর্বত, সমুদ্র ইত্যাদি etc.

এখন আমি পরবর্তী কাজটি করতে চাইছিলাম এমন এক ধরণের মিশ্রিত অ্যালগরিদম প্রয়োগ করা যা টাইলসগুলি তাদের প্রতিবেশীদের মধ্যে নির্বিঘ্নে মিশে যেতে পারে, যদি প্রতিবেশী একই ধরণের না হয়। উপরের উদাহরণের মানচিত্রটি প্লেয়ারটি তাদের মিনিমেপে যা দেখছে। অনস্ক্রিনে তারা সাদা আয়তক্ষেত্র দ্বারা চিহ্নিত অংশটির একটি রেন্ডারড সংস্করণ দেখতে পান; যেখানে টাইলগুলি একক রঙের পিক্সেলের পরিবর্তে তাদের চিত্রগুলির সাথে রেন্ডার করা হয়।

এটি ব্যবহারকারী মানচিত্রে কী দেখতে পাবে তার উদাহরণ তবে এটি উপরের ভিউপোর্টের মতো একই অবস্থান নয়!

এখানে চিত্র বর্ণনা লিখুন

এই দৃষ্টিতেই আমি রূপান্তরটি ঘটতে চাই।

অ্যালগরিদম

আমি একটি সাধারণ অ্যালগরিদম নিয়ে এসেছি যা ভিউপোর্টের মধ্যে মানচিত্রটি অতিক্রম করবে এবং প্রতিটি টাইলের শীর্ষে অন্য চিত্র সরবরাহ করবে, এটি সরবরাহ করে এটি বিভিন্ন ধরণের টাইলের পাশে থাকবে। (মানচিত্র পরিবর্তন করা হচ্ছে না! কেবল কিছু অতিরিক্ত চিত্র সরবরাহ করা হচ্ছে ering) অ্যালগরিদমের ধারণাটি বর্তমান টাইলের প্রতিবেশীদের প্রোফাইল করা:

একটি টাইল প্রোফাইল উদাহরণ

এটি ইঞ্জিনটি কী রেন্ডার করতে পারে তার একটি দৃশ্যাবলী, বর্তমান টাইলটি এক্স দিয়ে চিহ্নিত করা হয়েছে with

একটি 3x3 অ্যারে তৈরি করা হয় এবং এর চারপাশের মানগুলি পড়তে হয় So সুতরাং এই উদাহরণের জন্য অ্যারের মতো দেখাবে।

[
    [1,2,2]
    [1,2,2]
    [1,1,2]
];

আমার ধারণাটি তখন সম্ভাব্য টাইল কনফিগারেশনের জন্য কয়েকটি সিরিজের কাজ করা। খুব সাধারণ স্তরে:

if(profile[0][1] != profile[1][1]){
     //draw a tile which is half sand and half transparent
     //Over the current tile -> profile[1][1]
     ...
}

যা এই ফলাফল দেয়:

ফলাফল

কোন জায়গা থেকে একটি রূপান্তরটি হিসাবে কাজ করে [0][1]যাও [1][1], কিন্তু কাছ থেকে না [1][1]করার [2][1], যেখানে একটি হার্ড প্রান্ত দেহাবশেষ। সুতরাং আমি অনুভব করেছি যে সেই পরিস্থিতিতে একটি কোণার টাইল ব্যবহার করতে হবে। আমি দুটি 3x3 স্প্রাইট শিট তৈরি করেছি যা আমি ভেবেছিলাম যে টাইলগুলির সম্ভাব্য সংমিশ্রণগুলি রাখা সম্ভব। তারপরে আমি গেমটিতে থাকা সমস্ত টাইলগুলির জন্য এটি প্রতিলিপি করেছি (সাদা অঞ্চলগুলি স্বচ্ছ)। এটি প্রতিটি ধরণের টাইলের 16 টি টাইল হয়ে শেষ হয় (প্রতিটি স্প্রিটশিটে কেন্দ্রের টাইল ব্যবহার করা হয় না))

বালিSand2

আদর্শ ফলাফল

সুতরাং, এই নতুন টাইলস এবং সঠিক অ্যালগরিদম সহ, উদাহরণ বিভাগটি দেখতে এইরকম হবে:

ঠিক

আমার প্রতিটি চেষ্টা যদিও ব্যর্থ হয়েছে, অ্যালগরিদমে সর্বদা কিছু ত্রুটি থাকে এবং নিদর্শনগুলি আজব হয়ে যায়। আমি সমস্ত কেস সঠিকভাবে পেয়েছি বলে মনে করতে পারি না এবং সামগ্রিকভাবে এটি এটি করার মতো একটি খারাপ পদ্ধতি বলে মনে হচ্ছে।

একটি সমাধান?

সুতরাং, আমি কীভাবে এই প্রভাব তৈরি করতে পারি বা প্রোফাইলিং অ্যালগরিদম লেখার জন্য কোন দিকনির্দেশনা দিতে পারি তার বিকল্প সমাধান যদি কেউ দিতে পারে তবে আমি খুব কৃতজ্ঞ হব!


7
কটাক্ষপাত আছে এই নিবন্ধটি এবং পাশাপাশি লিঙ্ক নিবন্ধ, বিশেষত এই এক । ব্লগ নিজেই অনেকগুলি ধারণাগুলি ধারণ করে যা একটি প্রাথমিক পয়েন্ট হিসাবে কাজ করতে পারে। এখানে একটি ওভারভিউ দেওয়া হয়।
দারচারা

আপনার আপনার অ্যালগোরিদম সরল করা উচিত। এটি দেখুন: দ্বি-মাত্রিক-সেলুলার-
অটোমাতা

উত্তর:


117

এই অ্যালগরিদমের প্রাথমিক ধারণাটি সমস্ত প্রান্তগুলি অনুসন্ধান করার জন্য প্রাক-প্রসেসিং পদক্ষেপটি ব্যবহার করা এবং তারপরে প্রান্তের আকৃতি অনুসারে সঠিক স্মুথিং টাইল নির্বাচন করা।

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

এজ টাইলস

একবার সমস্ত প্রান্তের টাইলগুলি সনাক্ত হয়ে গেলে পরবর্তী কাজটি প্রতিটি প্রান্ত টাইলের জন্য সঠিক স্মুথিং টাইল নির্বাচন করা। আপনার স্মুথ টাইলসের আমার উপস্থাপনা এখানে।

স্মাইলিং টাইলস

নোট করুন যে টাইলগুলি বিভিন্ন ধরণের আসলে নেই। আমাদের 3x3 স্কোয়ারগুলির একটি থেকে আটটি বহিরাগত টাইলস প্রয়োজন তবে অন্যটি থেকে কেবল চার কোণার স্কোয়ারগুলির জন্য যেহেতু প্রথম বর্গক্ষেত্রে সরল-প্রান্তের টাইলগুলি ইতিমধ্যে পাওয়া গেছে। এর অর্থ হল মোট 12 টিরকম ক্ষেত্রে আমাদের মধ্যে পার্থক্য করতে হবে।

এখন, একটি প্রান্তের টাইলের দিকে তাকিয়ে আমরা নির্ধারণ করতে পারি যে এর চারটি নিকটতম প্রতিবেশী টাইলস দেখে সীমানাটি কোন দিকে ঘুরছে। এক্সের সাথে একটি এজ টাইল চিহ্নিত করা ঠিক আমাদের উপরে নিম্নলিখিত ছয়টি পৃথক কেস রয়েছে।

ছয়টি মামলা।

এই কেসগুলি সম্পর্কিত স্মুথিং টাইল নির্ধারণ করতে ব্যবহৃত হয় এবং আমরা সেই অনুসারে স্মুথিং টাইলগুলি সংখ্যায়িত করতে পারি।

সংখ্যা সহ ধীর টাইলস।

প্রতিটি মামলার জন্য এখনও একটি বা বিয়ের পছন্দ রয়েছে। এটি ঘাসটি কোন দিকে রয়েছে তার উপর নির্ভর করে। এটি নির্ধারণ করার একটি উপায় হ'ল সীমানাটির ওরিয়েন্টেশনটি ট্র্যাক করা তবে সম্ভবত এটি করার সহজতম উপায় হ'ল প্রান্তের পাশে একটি টাইল বাছাই করা এবং এটির রঙ কী তা দেখুন। নীচের চিত্রটি 5 এ) এবং 5 বি) দুটি ক্ষেত্রে দেখায় যা উপরের ডান টাইলের রঙ পরীক্ষা করে উদাহরণস্বরূপ পার্থক্য করা যায়।

5 এ বা 5 বি নির্বাচন করা।

মূল উদাহরণের জন্য চূড়ান্ত গণনাটি এর পরে দেখতে হবে।

চূড়ান্ত গণনা

এবং সম্পর্কিত প্রান্তটি টাইল নির্বাচন করার পরে সীমান্তটি এরকম কিছু দেখাচ্ছে।

সর্বশেষ ফলাফল.

চূড়ান্ত নোট হিসাবে আমি বলতে পারি যে সীমাটি কিছুটা নিয়মিত হওয়ার পরে এটি কাজ করবে। আরও স্পষ্টভাবে, প্রান্ত টাইলগুলির সাথে ঠিক যেমন দুটি প্রান্তের টাইল নেই তাদের প্রতিবেশীদের আলাদাভাবে চিকিত্সা করতে হবে। এটি মানচিত্রের প্রান্তে প্রান্ত টাইলগুলির জন্য ঘটবে যার একক প্রান্তের প্রতিবেশী এবং ভূখণ্ডের খুব সরু টুকরোগুলির জন্য যেখানে প্রতিবেশী প্রান্ত টাইলসের সংখ্যা তিন বা চারটি হতে পারে।


1
এটি আমার পক্ষে দুর্দান্ত এবং খুব সহায়ক। আমি এমন একটি মামলা নিয়ে কাজ করছি যেখানে কিছু টাইলস সরাসরি অন্যের মধ্যে রূপান্তর করতে পারে না। উদাহরণস্বরূপ, "ময়লা" টাইলগুলি "হালকা ঘাস" এবং "হালকা ঘাস" এ "মাঝারি ঘাসে" রূপান্তর করতে পারে। টাইল্ড (mapeditor.org) ভূখণ্ডের ব্রাশের জন্য এক প্রকার গাছ অনুসন্ধান প্রয়োগ করে এটি পরিচালনা করার দুর্দান্ত কাজ করে; যদিও আমি এখনও এটি পুনরুত্পাদন করতে সক্ষম হতে পারি।
ক্লে

12

নিম্নলিখিত বর্গটি একটি ধাতব প্লেট প্রতিনিধিত্ব করে। উপরের ডানদিকে একটি "হিট ভেন্ট" রয়েছে। আমরা দেখতে পারি যে কীভাবে এই বিন্দুটির তাপমাত্রা স্থির থাকে, ধাতব প্লেট প্রতিটি বিন্দুতে স্থির তাপমাত্রায় রূপান্তরিত হয়, স্বাভাবিকভাবে শীর্ষের কাছাকাছি গরম থাকে:

heatplate

প্রতিটি পয়েন্টে তাপমাত্রা সন্ধান করার সমস্যাটিকে "সীমানা মান সমস্যা" হিসাবে সমাধান করা যেতে পারে। তবে প্রতিটি পয়েন্টে তাপটি কাজ করার সহজ উপায় হ'ল প্লেটটিকে গ্রিড হিসাবে মডেল করা। আমরা স্থির তাপমাত্রায় গ্রিডের পয়েন্টগুলি জানি। আমরা অজানা সমস্ত পয়েন্টের তাপমাত্রাকে ঘরের তাপমাত্রা হিসাবে সেট করেছিলাম (যেন ভেন্টটি কেবলমাত্র চালু ছিল)। আমরা তখন প্লেটটি দিয়ে তাপটি ছড়িয়ে পড়ি যতক্ষণ না আমরা অভিমুখে পৌঁছায়। এটি পুনরাবৃত্তি দ্বারা সম্পন্ন হয়: আমরা প্রতিটি (i, j) পয়েন্টের মাধ্যমে পুনরাবৃত্তি করি। আমরা বিন্দু (i, j) = (পয়েন্ট (i + 1, j) + পয়েন্ট (আই -1, জে) + পয়েন্ট (i, j + 1) + পয়েন্ট (i, জে -1)) / 4 নির্ধারণ করি [যদি না বিন্দু (আই, জে) এর ধ্রুবক তাপমাত্রার উত্তাপ প্রবাহ থাকে]

আপনি যদি আপনার সমস্যার সাথে এটি প্রয়োগ করেন তবে এটি খুব মিল, তাপমাত্রার পরিবর্তে কেবল গড় রঙ। আপনার সম্ভবত প্রায় 5 টি পুনরাবৃত্তি প্রয়োজন হবে। আমি 400x400 গ্রিড ব্যবহার করার পরামর্শ দিচ্ছি। Thats 400x400x5 = 1 মিলিয়ন এরও কম পুনরাবৃত্তি যা দ্রুত হবে। আপনি যদি কেবল 5 টি পুনরাবৃত্তি ব্যবহার করেন তবে আপনার সম্ভবত কোনও পয়েন্ট ধ্রুবক রঙ ধারণ করার বিষয়ে চিন্তা করার দরকার পড়বে না, কারণ তারা তাদের মূল থেকে খুব বেশি স্থানান্তরিত করবেন না (বাস্তবে রঙ থেকে কেবল 5 দূরত্বের মধ্যে পয়েন্টগুলি রঙ দ্বারা প্রভাবিত হতে পারে)। সুডোকোড:

iterations = 5
for iteration in range(iterations):
    for i in range(400):
        for j in range(400):
            try:
                grid[i][j] = average(grid[i+1][j], grid[i-1][j],
                                     grid[i][j+1], grid[i][j+1])
            except IndexError:
                pass

আপনি এই আরও কিছুটা প্রসারিত করতে পারেন? আমি কৌতূহলী, এবং আমি আপনার ব্যাখ্যা বুঝতে পারি না। আপনার পুনরাবৃত্তিগুলি শেষ করার পরে কেউ কীভাবে গড় রঙের মানটি ব্যবহার করে?
চিআই

1
প্রতিটি গ্রিড পয়েন্ট গ্রিড [i] [j] উপযুক্ত রঙের একটি ছোট আয়তক্ষেত্র (বা স্বতন্ত্র পিক্সেল) হিসাবে ক্যানভাসে আঁকতে পারে।
রবার্ট কিং

5

ঠিক আছে, তাই প্রথম চিন্তাগুলি হ'ল সমস্যাটির একটি নিখুঁত সমাধান স্বয়ংক্রিয়করণের জন্য কিছু পরিবর্তে মাংসযুক্ত ইন্টারপোলেশন গণিতের প্রয়োজন। আপনি প্রাক-রেন্ডার করা টাইল ইমেজ উল্লেখ করেছেন এমন তথ্যের ভিত্তিতে, আমি ধরে নিয়েছি যে এখানে সম্পূর্ণ ইন্টারপোলেশন দ্রবণটি সাজানো নেই।

অন্যদিকে যেমনটি আপনি বলেছেন, হাত দিয়ে মানচিত্রটি সমাপ্ত করা একটি ভাল ফলাফলের দিকে নিয়ে যাবে ... তবে আমি এটাও ধরে নিয়েছি যে গ্লিটস ঠিক করার জন্য কোনও ম্যানুয়াল প্রক্রিয়াও কোনও বিকল্প নয়।

এখানে একটি সাধারণ অ্যালগরিদম যা নিখুঁত ফলাফল দেয় না, তবে এটি যে স্বল্প প্রচেষ্টা নেয় তার ভিত্তিতে এটি অত্যন্ত ফলপ্রসূ।

প্রত্যেকটি এজ টাইল মিশ্রিত করার চেষ্টা করার পরিবর্তে, (যার অর্থ হল আপনাকে আগে সংলগ্ন টাইলগুলি মিশ্রণের ফলাফলটি জানতে হবে - ইন্টারপোলেশন, অথবা আপনাকে পুরো মানচিত্রটি বেশ কয়েকবার পরিমার্জন করতে হবে এবং প্রাক উত্পন্ন টাইলগুলির উপর নির্ভর করতে পারবেন না) বিকল্প চেকার-বোর্ড প্যাটার্নে টাইলগুলি কেন মিশ্রণ করা যায় না?

[1] [*] [2]
[*] [1] [*]
[1] [*] [2]

অর্থাৎ উপরের ম্যাট্রিক্সে অভিনীত টাইলগুলি শুধুমাত্র মিশ্রণ করছেন?

ধরে নিই যে মানের একমাত্র অনুমোদিত পদক্ষেপগুলি একসাথে এক সময়, আপনার কাছে ডিজাইনের জন্য কয়েকটি টাইল রয়েছে ...

A    [1]      B    [2]      C    [1]      D    [2]      E    [1]           
 [1] [*] [1]   [1] [*] [1]   [1] [*] [2]   [1] [*] [2]   [1] [*] [1]   etc.
     [1]           [1]           [1]           [1]           [2]           

মোট 16 টি নিদর্শন থাকবে। আপনি যদি ঘোরান এবং প্রতিফলনমূলক প্রতিসাম্যের সুবিধা গ্রহণ করেন তবে আরও কম হবে।

'এ' একটি সমতল [1] টাইল হবে। 'ডি' একটি তির্যক হবে।

টাইলসের কোণে ছোট ছোট বিচ্ছিন্নতা থাকবে, তবে আপনি যে উদাহরণ দিয়েছেন তার তুলনায় এগুলি গৌণ হবে।

আমি পারলে আমি এই পোস্টটি ইমেজ সহ পরে আপডেট করব।


এটি দুর্দান্ত শোনায়, আপনি কী বোঝাতে চেয়েছেন সে সম্পর্কে আরও ভাল ধারণা পেতে আমি কিছু চিত্র সহ এটি দেখতে আগ্রহী।
ড্যান যুবরাজ

আমি কোনও ছবি একসাথে রাখতে পারি না কারণ আমার কাছে যে সফ্টওয়্যারটি ছিল বলে আমি মনে করি তা ছিল না ... তবে আমি ভাবছিলাম এবং এটি সমাধানের মতো ভাল নয়। আপনি অবশ্যই করণীয় ট্রানজিশনগুলি করতে পারেন, তবে অন্যান্য রূপান্তরগুলি এই স্মুথিং অ্যালগরিদম দ্বারা সত্যই সহায়তা করে না। আপনি এমনকি গ্যারান্টি দিতে পারবেন না যে আপনার মানচিত্রে কোনও 90 ডিগ্রি স্থানান্তর থাকবে। দুঃখিত, আমার ধারণা এইটি কিছুটা নিচে নামা।
পারফেকশনিস্ট

3

আমি এর সাথে মিলেমিশে কিছু নিয়ে খেলছিলাম, বেশ কয়েকটি কারণে এটি শেষ হয়নি; তবে মূলত এটি 0 এবং 1, 0 এর ম্যাট্রিক্সটি স্থল এবং 1 টি ফ্ল্যাশ-এ একটি গোলকধাঁধা জেনারেটর অ্যাপ্লিকেশনের প্রাচীর হয়ে উঠবে। যেহেতু এএস 3 জাভাস্ক্রিপ্টের অনুরূপ, জেএস-তে পুনরায় লিখতে অসুবিধা হবে না।

var tileDimension:int = 20;
var levelNum:Array = new Array();

levelNum[0] = [1, 1, 1, 1, 1, 1, 1, 1, 1];
levelNum[1] = [1, 0, 0, 0, 0, 0, 0, 0, 1];
levelNum[2] = [1, 0, 1, 1, 1, 0, 1, 0, 1];
levelNum[3] = [1, 0, 1, 0, 1, 0, 1, 0, 1];
levelNum[4] = [1, 0, 1, 0, 0, 0, 1, 0, 1];
levelNum[5] = [1, 0, 0, 0, 0, 0, 0, 0, 1];
levelNum[6] = [1, 0, 1, 1, 1, 1, 0, 0, 1];
levelNum[7] = [1, 0, 0, 0, 0, 0, 0, 0, 1];
levelNum[8] = [1, 1, 1, 1, 1, 1, 1, 1, 1];

for (var rows:int = 0; rows < levelNum.length; rows++)
{
    for (var cols:int = 0; cols < levelNum[rows].length; cols++)
    {
        // set up neighbours
        var toprow:int = rows - 1;
        var bottomrow:int = rows + 1;

        var westN:int = cols - 1;
        var eastN:int = cols + 1;

        var rightMax =  levelNum[rows].length;
        var bottomMax = levelNum.length;

        var northwestTile =     (toprow != -1 && westN != -1) ? levelNum[toprow][westN] : 1;
        var northTile =         (toprow != -1) ? levelNum[toprow][cols] : 1;
        var northeastTile =     (toprow != -1 && eastN < rightMax) ? levelNum[toprow][eastN] : 1;

        var westTile =          (cols != 0) ? levelNum[rows][westN] : 1;
        var thistile =          levelNum[rows][cols];
        var eastTile =          (eastN == rightMax) ? 1 : levelNum[rows][eastN];

        var southwestTile =     (bottomrow != bottomMax && westN != -1) ? levelNum[bottomrow][westN] : 1;
        var southTile =         (bottomrow != bottomMax) ? levelNum[bottomrow][cols] : 1;
        var southeastTile =     (bottomrow != bottomMax && eastN < rightMax) ? levelNum[bottomrow][eastN] : 1;

        if (thistile == 1)
        {
            var w7:Wall7 = new Wall7();
            addChild(w7);
            pushTile(w7, cols, rows, 0);

            // wall 2 corners

            if      (northTile === 0 && northeastTile === 0 && eastTile === 1 && southeastTile === 1 && southTile === 1 && southwestTile === 0 && westTile === 0 && northwestTile === 0)
            {
                var w21:Wall2 = new Wall2();
                addChild(w21);
                pushTile(w21, cols, rows, 270);
            }

            else if (northTile === 0 && northeastTile === 0 && eastTile === 0 && southeastTile === 0 && southTile === 1 && southwestTile === 1 && westTile === 1 && northwestTile === 0)
            {
                var w22:Wall2 = new Wall2();
                addChild(w22);
                pushTile(w22, cols, rows, 0);
            }

            else if (northTile === 1 && northeastTile === 0 && eastTile === 0 && southeastTile === 0 && southTile === 0 && southwestTile === 0 && westTile === 1 && northwestTile === 1)
            {
                var w23:Wall2 = new Wall2();
                addChild(w23);
                pushTile(w23, cols, rows, 90);
            }

            else if (northTile === 1 && northeastTile === 1 && eastTile === 1 && southeastTile === 0 && southTile === 0 && southwestTile === 0 && westTile === 0 && northwestTile === 0)
            {
                var w24:Wall2 = new Wall2();
                addChild(w24);
                pushTile(w24, cols, rows, 180);
            }           

            //  wall 6 corners

            else if (northTile === 1 && northeastTile === 1 && eastTile === 1 && southeastTile === 0 && southTile === 1 && southwestTile === 1 && westTile === 1 && northwestTile === 1)
            {
                var w61:Wall6 = new Wall6();
                addChild(w61);
                pushTile(w61, cols, rows, 0); 
            }

            else if (northTile === 1 && northeastTile === 1 && eastTile === 1 && southeastTile === 1 && southTile === 1 && southwestTile === 0 && westTile === 1 && northwestTile === 1)
            {
                var w62:Wall6 = new Wall6();
                addChild(w62);
                pushTile(w62, cols, rows, 90); 
            }

            else if (northTile === 1 && northeastTile === 1 && eastTile === 1 && southeastTile === 1 && southTile === 1 && southwestTile === 1 && westTile === 1 && northwestTile === 0)
            {
                var w63:Wall6 = new Wall6();
                addChild(w63);
                pushTile(w63, cols, rows, 180);
            }

            else if (northTile === 1 && northeastTile === 0 && eastTile === 1 && southeastTile === 1 && southTile === 1 && southwestTile === 1 && westTile === 1 && northwestTile === 1)
            {
                var w64:Wall6 = new Wall6();
                addChild(w64);
                pushTile(w64, cols, rows, 270);
            }

            //  single wall tile

            else if (northTile === 0 && northeastTile === 0 && eastTile === 0 && southeastTile === 0 && southTile === 0 && southwestTile === 0 && westTile === 0 && northwestTile === 0)
            {
                var w5:Wall5 = new Wall5();
                addChild(w5);
                pushTile(w5, cols, rows, 0);
            }

            //  wall 3 walls

            else if (northTile === 0 && eastTile === 1 && southTile === 0 && westTile === 1)
            {
                var w3:Wall3 = new Wall3();
                addChild(w3);
                pushTile(w3, cols, rows, 0);
            }

            else if (northTile === 1 && eastTile === 0 && southTile === 1 && westTile === 0)
            {
                var w31:Wall3 = new Wall3();
                addChild(w31);
                pushTile(w31, cols, rows, 90);
            }

            //  wall 4 walls

            else if (northTile === 0 && eastTile === 0 && southTile === 1 && westTile === 0)
            {
                var w41:Wall4 = new Wall4();
                addChild(w41);
                pushTile(w41, cols, rows, 0);
            }

            else if (northTile === 1 && eastTile === 0 && southTile === 0 && westTile === 0)
            {
                var w42:Wall4 = new Wall4();
                addChild(w42);
                pushTile(w42, cols, rows, 180);
            }

            else if (northTile === 0 && northeastTile === 0 && eastTile === 1 && southeastTile === 0 && southTile === 0 && southwestTile === 0 && westTile === 0 && northwestTile === 0)
            {
                var w43:Wall4 = new Wall4();
                addChild(w43);
                pushTile(w43, cols, rows, 270);
            }

            else if (northTile === 0 && northeastTile === 0 && eastTile === 0 && southeastTile === 0 && southTile === 0 && southwestTile === 0 && westTile === 1 && northwestTile === 0)
            {
                var w44:Wall4 = new Wall4();
                addChild(w44);
                pushTile(w44, cols, rows, 90);
            }

            //  regular wall blocks

            else if (northTile === 1 && eastTile === 0 && southTile === 1 && westTile === 1)
            {
                var w11:Wall1 = new Wall1();
                addChild(w11);
                pushTile(w11, cols, rows, 90);
            }

            else if (northTile === 1 && eastTile === 1 && southTile === 1 && westTile === 0)
            {
                var w12:Wall1 = new Wall1();
                addChild(w12);
                pushTile(w12, cols, rows, 270);
            }

            else if (northTile === 0 && eastTile === 1 && southTile === 1 && westTile === 1)
            {
                var w13:Wall1 = new Wall1();
                addChild(w13);
                pushTile(w13, cols, rows, 0);
            }

            else if (northTile === 1 && eastTile === 1 && southTile === 0 && westTile === 1)
            {
                var w14:Wall1 = new Wall1();
                addChild(w14);
                pushTile(w14, cols, rows, 180);
            }

        }
        // debug === // trace('Top Left: ' + northwestTile + ' Top Middle: ' + northTile + ' Top Right: ' + northeastTile + ' Middle Left: ' + westTile + ' This: ' + levelNum[rows][cols] + ' Middle Right: ' + eastTile + ' Bottom Left: ' + southwestTile + ' Bottom Middle: ' + southTile + ' Bottom Right: ' + southeastTile);
    }
}

function pushTile(til:Object, tx:uint, ty:uint, degrees:uint):void
{
    til.x = tx * tileDimension;
    til.y = ty * tileDimension;
    if (degrees != 0) tileRotate(til, degrees);
}

function tileRotate(tile:Object, degrees:uint):void
{
    // http://www.flash-db.com/Board/index.php?topic=18625.0
    var midPoint:int = tileDimension/2;
    var point:Point=new Point(tile.x+midPoint, tile.y+midPoint);
    var m:Matrix=tile.transform.matrix;
    m.tx -= point.x;
    m.ty -= point.y;
    m.rotate (degrees*(Math.PI/180));
    m.tx += point.x;
    m.ty += point.y;
    tile.transform.matrix=m;
}

মূলত এই চারপাশের প্রতিটি টাইলগুলি বাম থেকে ডানে, নীচে থেকে নীচে পর্যন্ত যাচাই করে এবং ধরে নেওয়া হয় যে প্রান্ত টাইলগুলি সর্বদা 1 থাকে key

ওয়াল টাইলস

এটি অসম্পূর্ণ এবং সম্ভবত এটি অর্জনের একটি হ্যাকি উপায়, তবে আমি ভেবেছিলাম এটি কিছুটা উপকারী হতে পারে।

সম্পাদনা করুন: কোডটির ফলাফলের স্ক্রিনশট।

উত্পন্ন ফলাফল


1

আমি কয়েকটি বিষয় প্রস্তাব করব:

  • "কেন্দ্র" টাইল কি তা বিবেচ্য নয়, তাই না? এটি 2 হতে পারে, তবে অন্য সমস্ত 1 হয়, এটি 1 দেখায়?

  • এটি কেবল কোণগুলি কী তা বিবেচনা করে, যখন উপরে বা পাশে নিকটবর্তী প্রতিবেশীদের মধ্যে পার্থক্য রয়েছে। সমস্ত নিকটবর্তী প্রতিবেশী যদি 1 হয় এবং কোনও কোণ 2 হয় তবে এটি 1 দেখায়।

  • আমি সম্ভবত প্রতিবেশীদের সমস্ত সম্ভাব্য সংমিশ্রণের প্রাক্কলন করব, উপরের / নীচের প্রতিবেশীদের মানকে নির্দেশ করে প্রথম চারটি দিয়ে একটি 8 সূচক অ্যারে তৈরি করব এবং দ্বিতীয়টিটি তির্যকটি নির্দেশ করবে:

প্রান্ত [এন] [ই] [এস] [এস] [ডাব্লু] [এনই] [এসই] [এসডাব্লু] [এনডাব্লু] = স্প্রাইটে যাই হোক না কেন অফসেট

সুতরাং আপনার ক্ষেত্রে, [2] [2] [1] [1] [2] [2] [1] [1] = 4 (5 তম স্প্রাইট)।

এই ক্ষেত্রে, [1] [1] [1] [1] 1 হবে, [2] [2] [2] [2] 2 হবে, এবং বাকীগুলি কাজ করতে হবে। তবে একটি নির্দিষ্ট টাইলের জন্য অনুসন্ধান তুচ্ছ হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.