আইসোমেট্রিক রেন্ডারিং এবং পিকিং?


23

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


ব্যবহৃত সঠিক পদ্ধতি এবং সূত্রটি আপনার টাইলসের আকারের উপরে এবং সম্ভবত আপনি কীভাবে মানচিত্রটি আঁকছেন তার কিছুটা নির্ভর করে (শীর্ষে, নীচে বা মানচিত্রের কোনও একদিকে 0,0) আরও বিশদ আপনার সমস্যা সম্পর্কে সাহায্য করবে।
thedaian

1
টাইলস 2: 1 (আরও নির্দিষ্টভাবে, 64x32)। আমি সম্পাদক লিখছি বলে স্থানাঙ্ক ব্যবস্থার কোনও বিষয় নেই। (শীর্ষে বা বামে 0,0 তবে বুদ্ধিমান মনে হয়))
mpnk121

প্রশ্নের খুব দেরি হয়ে গেছে এবং আমার কাছে একটি সম্পূর্ণ উত্তরও নেই, তবে এই সুনির্দিষ্ট বিষয়ে খুব ভাল গুগল টেক টক ছিল। তাদের সেটআপের মধ্যে স্বেচ্ছাসেবী চিত্রগুলির স্বচ্ছ অংশ বাছাই করা অন্তর্ভুক্ত রয়েছে (জাভাস্ক্রিপ্টে, কম নয়)। youtube.com/watch?v=_RRnyChxijA
শেঠ ব্যাটিন

উত্তর:


21

আপনার মন্তব্যের ভিত্তিতে, এখানে কোডটি আমি টাইল এক্স, y মানকে স্ক্রিন স্থানাঙ্কে রূপান্তর করতে ব্যবহার করছি। এখন, এটি "3 ডি টাইলস" বিবেচনায় নেয় না, সমস্ত কিছু একই বিমানে থাকা হিসাবে বিবেচিত হয়, তাই আপনি যদি এমন কোনও গেম লেখেন যেখানে এটি গুরুত্বপূর্ণ, এই কোডটি কার্যকর হবে না।

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

পয়েন্টটি কেবলমাত্র x এবং y ইন্টি সমন্বিত একটি কাঠামো, আপনার ক্ষেত্রে TILE_WIDTH 64৪ হবে, টাইপ_ডিপিটিএইচটি নাম খারাপভাবে নাম করা হয়েছে (এটি আসলে টাইল গ্রাফিক্সের উচ্চতা) তবে এটি আপনার ক্ষেত্রে 32 হবে। অফসেটগুলি হ'ল যদি আপনি আপনার টাইল মানচিত্রটি অন্য কোনও এক্স, ওয়াই অবস্থানের "শুরু" করতে চান (যেমন আপনি যদি টাইলস অন্য টাইলের সেট থেকে উপরে থাকতে চান)। সাধারণত অফসেট 0,0 হতে পারে।

এটি শীর্ষে, মাঝের দিকে 0,0 সহ একটি মানচিত্র তৈরি করবে:

        0,0
    0,1     1,0
0,2     1,1     2,1

কার্সারের টাইল x, y সন্ধান করার জন্য:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

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

আবার, এটি একটি ফ্ল্যাট 2 ডি আইসোমেট্রিক টাইল মানচিত্র ধরে নিয়েছে। আপনি যদি মানচিত্রের একটি আধা -3 ডি ভিউ ব্যবহার করতে চান তবে কিছু অতিরিক্ত কাজ রয়েছে এবং এটি সমস্তই ধরে নেয় যে আপনি যেভাবেই 2 ডি তে কাজ করছেন।


1
ধন্যবাদ! - এটি ফ্ল্যাট মানচিত্রের জন্য দুর্দান্ত কাজ করে। এখন, আপনি কীভাবে আমি অন্য স্তরে থাকা ইচ্ছামত আকারের (যেমন জেড গভীরতার সাথে) টাইলগুলি যুক্ত করতে পারি সে সম্পর্কে আমাকে আরও কিছু বলতে পারেন? (যেমন কোনও কূপের মতো
প্রপস

2
আপনি যখন অফসেটওয়াই এবং অফসেট এক্স মান ব্যবহার করেন তখনই। যদি আপনার স্ট্রিটলাইটটি 64x64 হয়, তবে অফসেটওয়াই মানটির জন্য নেতিবাচক 32 এ যাওয়ার জন্য এটি সঠিক জায়গায় উপস্থিত হওয়া উচিত। আশা করি আপনি শুরু করার জন্য এটি যথেষ্ট।
thedaian

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