পুরো মানচিত্র ডিজাইন বনাম টাইলস অ্যারে নকশা


11

আমি একটি 2 ডি আরপিজিতে কাজ করছি, যা সাধারণ অন্ধকূপ / শহর মানচিত্র (প্রাক উত্পন্ন) বৈশিষ্ট্যযুক্ত হবে।

আমি টাইলস ব্যবহার করছি, যা আমি তখন মানচিত্রগুলি তৈরি করতে একত্রিত করব। আমার আসল পরিকল্পনাটি ছিল ফটোশপ বা অন্য কোনও গ্রাফিক প্রোগ্রাম ব্যবহার করে টাইলগুলি একত্রিত করা যাতে একটি বড় ছবি যাতে আমি মানচিত্র হিসাবে ব্যবহার করতে পারি তার জন্য।

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

সর্বাধিক সাধারণ পদ্ধতি কোনটি এবং এর প্রতিটিের সুবিধাগুলি / অসুবিধাগুলি কী কী?


1
মূল ইস্যু স্মৃতি। এমন একটি টেক্সচার যা একবার 1080p স্ক্রিনটি পূরণ করে প্রায় 60 এমবি। সুতরাং কোনও চিত্র প্রতি পিক্সেল ইনট ব্যবহার করে, একটি টাইল প্রতি ইন্টি (পিক্সেল / (টাইলসাইজ * টাইলসাইজ)) ব্যবহার করে। সুতরাং যদি টাইলগুলি 32,32 হয় তবে আপনি টিক্স বনাম একটি পিক্সেল ব্যবহার করে 1024 গুণ বড় ম্যাপের প্রতিনিধিত্ব করতে পারেন। টেক্সচার অদলবদল করার সময়গুলি এত বেশি স্মৃতিতে চাপিয়ে দিতে আঘাত করতে পারে ...
ক্লাসিকথান্ডার

উত্তর:


19

প্রথমে, আমি বলতে পারি যে 2 ডি আরপিজিগুলি আমার হৃদয়ের কাছাকাছি এবং প্রিয় এবং পুরানো ডিএক্স 7 ভিবি 6 এমওআরপিজি ইঞ্জিনগুলির সাথে কাজ করছে (হাসবেন না, এটি 8 বছর আগে ছিল, এখন :-)) যা প্রথম আমাকে গেম বিকাশে আগ্রহী করেছে । সাম্প্রতিককালে, আমি এক্সএনএ ব্যবহার করতে those ইঞ্জিনগুলির মধ্যে একটিতে কাজ করেছি এমন একটি গেমটি রূপান্তর করা শুরু করি।

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

বাস্তবায়ন যতদূর যায়, আমি এখানে গেমডেভ.এসই এবং আমার ব্লগে (নীচে উভয় লিঙ্কযুক্ত) কয়েকটি প্রশ্নে এটি কীভাবে পরিচালনা করেছি সে সম্পর্কে আমি বিশদভাবে গিয়েছিলাম এবং আপনি ঠিক তাই বলছেন না তাই আমি ঠিক এখানে বেসিক মধ্যে যান। আমি টাইলগুলির বৈশিষ্ট্যগুলিও নোট করব যা সেগুলি বেশ কয়েকটি বৃহত প্রাক-রেন্ডার করা চিত্র লোড করার জন্য উপকারী করে তোলে। যদি কিছু পরিষ্কার না হয় তবে আমাকে জানান।

  1. আপনাকে প্রথমে যা করতে হবে তা হল একটি টাইলশীট তৈরি করা। এটি কেবলমাত্র একটি বৃহত চিত্র যা আপনার সমস্ত টাইল গ্রিডে প্রান্তিক করে রাখে। এটি (এবং টাইলসের সংখ্যার উপর নির্ভর করে অতিরিক্ত একটি) আপনার কেবলমাত্র লোড করার প্রয়োজন হবে। মাত্র 1 চিত্র! আপনি প্রতি মানচিত্রে 1 বা গেমের প্রতিটি টাইল সহ একটি লোড করতে পারেন; যাই হোক না কেন সংস্থা আপনার জন্য কাজ করে।
  2. এর পরে, আপনাকে কীভাবে সেই "শীট" নিতে হবে এবং প্রতিটি টাইলকে একটি সংখ্যায় অনুবাদ করতে হবে তা বুঝতে হবে। এটি কিছু সাধারণ গণিত সহ বেশ সোজা। নোট করুন যে এখানে বিভাগটি পূর্ণসংখ্যা বিভাগ , সুতরাং দশমিক স্থানগুলি বাদ পড়ে (অথবা আপনি যদি চান তবে বৃত্তাকার)। স্থানাঙ্কগুলি এবং পিছনে কীভাবে ঘরগুলি রূপান্তর করা যায়।
  3. ঠিক আছে, এখন আপনি টাইলসীটটি কোষের একটি সংখ্যা (সংখ্যার) মধ্যে ভেঙে ফেলেছেন, আপনি এই নম্বরগুলি নিতে এবং আপনার পছন্দসই ধারকটিতে প্লাগ করতে পারেন। সরলতার স্বার্থে আপনি কেবল একটি 2 ডি অ্যারে ব্যবহার করতে পারেন।

    int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
  4. এর পরে, আপনি এগুলি আঁকতে চান। আপনি এটিকে আরও কার্যকর করার একটি উপায় (মানচিত্রের আকারের উপর নির্ভর করে) কেবল ক্যামেরা যা দেখছেন এবং সেগুলির মধ্য দিয়ে লুপ করছেন কেবল সেগুলি গণনা করা। আপনি ক্যামেরার শীর্ষ-বাম ( tl) এবং নীচে-ডান ( br) কোণগুলির মানচিত্র টাইল অ্যারের স্থানাঙ্কগুলি এনে এটি করতে পারেন । তারপরে এগুলি আঁকতে tl.X to br.X, নেস্টেড লুপ থেকে এবং লুপ tl.Y to br.Yকরুন। নীচের উদাহরণ কোড:

    for (int x = tl.X; x <= br.X;x++) {
        for (int y = tl.Y; y <= br.Y;y++) {
            //Assuming tileset setup from image
            Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
            //Draw 32x32 tile using tilesetCoordinate as the source x,y
        }
    }
  5. জ্যাকপট! এটি টাইল ইঞ্জিনের মূল কথা। আপনি দেখতে পাচ্ছেন যে খুব বেশি ওভারহেড না থাকলেও 1000x1000 মানচিত্র থাকা সহজ। এছাড়াও, যদি আপনার 255 টিরও কম টাইল থাকে তবে আপনি প্রতি ঘরে প্রতি বাইট 3 টি মেমরি কাটতে একটি বাইট অ্যারে ব্যবহার করতে পারেন। যদি বাইটটি খুব ছোট হয় তবে একটি উত্তরোত্তর সম্ভবত আপনার প্রয়োজনের জন্য যথেষ্ট হবে।

দ্রষ্টব্য: আমি ওয়ার্ল্ড কোঅর্ডিনেটের ধারণাটি ছেড়ে দিয়েছি (যা আপনার ক্যামেরার অবস্থানের ভিত্তিতে হবে) যেহেতু আমার ধারণা, এই উত্তরটির বাইরে নয়। আপনি এখানে গেমডেভ.এসইতে পড়তে পারেন।

আমার টাইল-ইঞ্জিন সংস্থানসমূহ
নোট: এগুলি সমস্ত এক্সএনএ-তে টার্গেট করা হয়েছে তবে এটি কোনও কিছুর ক্ষেত্রে প্রযোজ্য - আপনাকে কেবল ড্র কলগুলি পরিবর্তন করতে হবে।

  • এই প্রশ্নের উত্তরের উত্তরটি কীভাবে আমি আমার গেমটিতে মানচিত্রের ঘরগুলি এবং স্তরগুলি পরিচালনা করি। (তৃতীয় লিঙ্কটি দেখুন))
  • এই প্রশ্নের আমার উত্তরটি ব্যাখ্যা করে যে আমি কীভাবে ডেটা বাইনারি ফর্ম্যাটে ডেটা সঞ্চয় করি।
  • এই প্রথম (ভাল, টেকনিক্যালি দ্বিতীয়, কিন্তু প্রথম "প্রযুক্তিগত") ব্লগ খেলা আমি কাজ ছিল উন্নয়নের পোস্ট। পুরো সিরিজে পিক্সেল শেডার, আলো, টাইলের আচরণ, চলাফেরার মতো সমস্ত জিনিস এবং মজাদার উপাদান সম্পর্কিত তথ্য রয়েছে। আমি উপরে পোস্ট করা প্রথম লিঙ্কটিতে আমার উত্তরটির বিষয়বস্তু অন্তর্ভুক্ত করার জন্য আমি পোস্টটি প্রকৃতপক্ষে আপডেট করেছি, সুতরাং আপনি এটি পরিবর্তে পড়তে চাইতে পারেন (আমি কিছু জিনিস যুক্ত করে থাকতে পারি)। আপনার যদি কোনও প্রশ্ন থাকে তবে আপনি সেখানে বা এখানে একটি মন্তব্য ফেলতে পারেন এবং আমি সাহায্য করে খুশি হব।

অন্যান্য টালি ইঞ্জিন সংস্থানসমূহ

  • এই সাইট থেকে টাইল ইঞ্জিনের টিউটোরিয়াল আমাকে আমার মানচিত্র তৈরির জন্য যে ভিত্তিটি ব্যবহার করেছিল তা দিয়েছিল।
  • আমি এই ভিডিও টিউটোরিয়ালগুলি এখনও দেখিনি কারণ আমার সময় নেই, তবে তারা সম্ভবত সহায়ক। :) আপনি যদিও এক্সএনএ ব্যবহার করছেন তবে এগুলি পুরানো হতে পারে।
  • এই সাইটে আরও কয়েকটি টিউটোরিয়াল রয়েছে যা (আমার মনে হয়) উপরের ভিডিওগুলির উপর ভিত্তি করে। এটি চেক আউট মূল্য হতে পারে।

বাহ, এটি আমার জিজ্ঞাসার চেয়ে দ্বিগুণ তথ্য এবং আমি জিজ্ঞাসা করি না এমন সমস্ত প্রশ্নের উত্তর অনেক, দুর্দান্ত, ধন্যবাদ :)
যতগুলি সেগুলির ক্রাইস্টল.জিডিএম

@ মিকালিচভ - খুশী আমি সাহায্য করতে পারি! :)
রিচার্ড মার্স্কেল - ড্র্যাকির

সাধারণত একটি 2 ডি অ্যারের সাথে আপনি প্রথমটি আপনার ওয়াই হিসাবে এবং পরবর্তীটি আপনার এক্স হিসাবে ব্যবহার করতে চান memory মেমরিতে একটি অ্যারে ক্রমান্বয়ে 0,0-i হতে চলেছে তারপর 1,0-i। আপনি যদি এক্স ফার্স্ট মুরগির সাহায্যে নেস্টেড লুপগুলি করেন তবে আপনি পড়ার ক্রমগত অনুসরণের পরিবর্তে স্মৃতিতে পিছনে পিছনে ঝাঁপিয়ে পড়ছেন। সর্বদা (y) এর জন্য তারপর (x) এর জন্য।
ব্রেট ডাব্লু

@ ব্রেটডাব্লু - একটি বৈধ পয়েন্ট। ধন্যবাদ। এটি আমাকে বিস্মিত করে তুলেছে যে কীভাবে 2 ডি অ্যারেগুলিতে নেট।। (সারি-প্রধান ক্রম। আজ নতুন কিছু শিখেছে! :-))। যাইহোক, আমার কোড আপডেট করার পরে, আমি বুঝতে পেরেছিলাম যে এটি ঠিক যেমন ভ্যারিয়েবলগুলি স্যুইচ করেছে ঠিক তেমনই আপনি বর্ণনা করছেন। পার্থক্যটি হ'ল টাইলগুলি কী ক্রমে আঁকা। আমার বর্তমান উদাহরণ কোডটি উপরের থেকে নীচে, বাম থেকে ডানে আঁকেন যেখানে আপনি যা বর্ণনা করছেন সেটি বাম থেকে ডানে, উপর থেকে নীচে আঁকবে। সুতরাং, সরলতার স্বার্থে, আমি এটিকে মূলটিতে ফিরিয়ে দেওয়ার সিদ্ধান্ত নিয়েছি। :-)
রিচার্ড মার্স্কেল - ড্র্যাকির

6

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

বলা হচ্ছে যে উভয় সিস্টেমই পৃথকভাবে বা একসাথে ব্যবহার করা যায়।

একটি স্ট্যান্ডার্ড টাইল ভিত্তিক সিস্টেমের নিম্নলিখিত শক্তি রয়েছে:

  • টাইলসের সাধারণ 2D অ্যারে
  • প্রতিটি টালি একটি একক উপাদান আছে
    • এই উপাদানটি একক টেক্সচার, একাধিক বা আশেপাশের টাইলগুলির সাথে মিশ্রিত হতে পারে
    • সম্পদ তৈরি এবং পুনরায় কাজ হ্রাস করে, এই ধরণের সমস্ত টাইলগুলির জন্য টেক্সচার পুনরায় ব্যবহার করতে পারেন
  • প্রতিটি টাইল প্রবেশযোগ্য বা না হতে পারে (সংঘর্ষ সনাক্তকরণ)
  • মানচিত্রের অংশগুলি রেন্ডার এবং সনাক্ত করা সহজ
    • অক্ষরের অবস্থান এবং মানচিত্রের অবস্থান পরম স্থানাঙ্ক
    • স্ক্রিন অঞ্চলের জন্য প্রাসঙ্গিক টাইলগুলির মধ্য দিয়ে লুপ থেকে সহজ

টাইলসের অসুবিধা হ'ল আপনাকে এই টাইল ভিত্তিক ডেটা তৈরির জন্য একটি সিস্টেম তৈরি করতে হবে। আপনি এমন একটি চিত্র তৈরি করতে পারেন যা প্রতিটি পিক্সেল টাইল হিসাবে ব্যবহার করে, এইভাবে একটি টেক্সচার থেকে আপনার 2D অ্যারে তৈরি করে। আপনি মালিকানা বিন্যাসও তৈরি করতে পারেন। বিটফ্ল্যাগগুলি ব্যবহার করে আপনি মোটামুটি ছোট জায়গাতে টাইল প্রতি বিশাল সংখ্যক ডেটা সঞ্চয় করতে পারেন।

বেশিরভাগ লোক টাইলস করার প্রাথমিক কারণ হ'ল এটি তাদের ছোট সম্পদ তৈরি করতে এবং তাদের পুনরায় ব্যবহার করতে দেয়। এটি আপনাকে আরও বৃহত্তর ছবিটি ছোট ছোট টুকরো তৈরি করতে দেয়। এটি পুনরায় কাজ হ্রাস করে কারণ আপনি একটি সামান্য পরিবর্তন করতে পুরো বিশ্বের মানচিত্র পরিবর্তন করছেন না। উদাহরণস্বরূপ আপনি যদি সমস্ত ঘাসের ছায়া পরিবর্তন করতে চান। একটি বড় ছবিতে আপনাকে সমস্ত ঘাস পুনরায় রঙ করতে হবে। একটি টাইল সিস্টেমে আপনি কেবল গ্রাস টাইলগুলি আপডেট করুন।

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

কোড উদাহরণ সরবরাহ করতে আপনাকে আপনার পরিবেশ / ইঞ্জিন / ভাষা সম্পর্কে আরও সুনির্দিষ্ট সরবরাহ করতে হবে।


ধন্যবাদ! আমি সি # এর অধীনে কাজ করছি এবং ফাইনাল ফ্যান্টাসি 6 (বা মূলত বেশিরভাগ স্কয়ার এসএনইএস আরপিজি) এর অনুরূপ (তবে কম প্রতিভাবান) সংস্করণে যাচ্ছি, সুতরাং মেঝে টাইলস এবং কাঠামোর টাইলস (যেমন ঘর) houses আমার সবচেয়ে বড় উদ্বেগ হ'ল আমি দেখতে পাচ্ছি না যে কীভাবে 2 ডি অ্যারে তৈরি করা যায় তা ঘন্টাক্ষণ পরীক্ষা না করে "সেখানে সেখানে একটি ঘাসের কোণা রয়েছে, তারপরে তিনটি সোজা অনুভূমিক, তারপরে একটি ঘরের কোণা, তারপরে ..", পাশাপাশি সম্ভাব্য অনেকগুলি ভুল রয়েছে with উপায়।
ক্রিস্টল.জিডিএম

দেখে মনে হচ্ছে রিচার্ড কোনও কোড সুনির্দিষ্ট শর্তাদি সম্পর্কে আবৃত করেছেন personally আমি ব্যক্তিগতভাবে টাইলের ধরণের একটি এনাম ব্যবহার করব এবং টাইলের মান সনাক্ত করতে বিটফ্ল্যাগ ব্যবহার করব। এটি আপনাকে গড় পূর্ণসংখ্যায় 32+ মান সংরক্ষণ করতে দেয়। আপনি টাইল প্রতি একাধিক পতাকা সংরক্ষণ করতে সক্ষম হবেন। সুতরাং আপনি পৃথক ভেরিয়েবলগুলি ছাড়াই গ্রাস = সত্য, ওয়াল = সত্য, সংঘর্ষ = সত্য, ইত্যাদি বলতে পারেন। তারপরে আপনি কেবল "থিমস" নির্ধারণ করুন যা সেই নির্দিষ্ট মানচিত্র অঞ্চলের গ্রাফিকগুলির জন্য টাইলশীট নির্ধারণ করে।
ব্রেট ডব্লু

3

মানচিত্র অঙ্কন: ইঞ্জিনে টাইলগুলি সহজ, কারণ তখন মানচিত্রটি টাইল সূচকগুলির একটি বিশাল অ্যারে হিসাবে উপস্থাপিত হতে পারে। অঙ্কন কোডটি কেবল নেস্টেড লুপ:

for i from min_x to max_x:
    for j from min_y to max_y:
        Draw(Tiles[i][j], getPosition(i,j))

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

উদাহরণস্বরূপ সংঘর্ষের জন্য টাইল তথ্য পুনরায় ব্যবহার করাও সহজ। উদাহরণস্বরূপ, চরিত্রের স্প্রিটের উপরের-বাম কোণে টেরিট টাইল পেতে:

let x,y = character.position
let i,j = getTileIndex(x,y) // <- getTileIndex is the opposite function of getPosition
let tile = Tiles[i][j]

মনে করুন আপনার পাথর / গাছ ইত্যাদির সাথে সংঘর্ষের জন্য পরীক্ষা করার প্রয়োজন আছে আপনি টাইলটি (চরিত্রের অবস্থান + চরিত্রের স্প্রাইটের আকার + বর্তমান দিক) এর অবস্থানে পেতে পারেন এবং এটি হাঁটার যোগ্য হিসাবে চিহ্নিত হয়েছে কিনা তা পরীক্ষা করতে পারেন।

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