পিক্সেলগুলিতে "রিয়েল ইউনিট" স্কেল করার সাধারণ প্যাটার্ন?


10

এই একটি ফলো-আপ প্রশ্ন হল এই অন্যটি

আমি এটি জানতে চাই যে বিশ্বের আমার প্রতিনিধিত্ব (বর্তমানে 160Kmx160Km) এটি অঙ্কন অঞ্চলে (বর্তমানে 800x600 পিক্সেল) ফিট করার জন্য কোন সাধারণ / সাধারণ / সেরা প্যাটার্ন রয়েছে কিনা ?

আমি কমপক্ষে চারটি ভিন্ন পদ্ধতির কথা ভাবতে পারি:

ন্যাভভ ওয়ান (আমি এ পর্যন্ত এটি যেভাবে করেছি) আমি একটি বিশ্বব্যাপী ফাংশন বাস্তবায়ন করেছি sc(vector)যা কেবল ভেক্টরের পাস করা একটি ছোট আকারের অনুলিপি ফিরে আসবে This এটি অবশ্যই কাজ করে তবে আমাকে কোড লিখতে বাধ্য করে:

drawCircle(sc(radius), sc(position))

মোড়ানো কার্যাদি । আমি বেশ কয়েকটি ফাংশন সংজ্ঞায়িত করতে পারি, তাদের প্রত্যেকটি আসল মিডলওয়্যারটি মোড়ানো। উদাহরণস্বরূপ, আমি সংজ্ঞায়িত করতে পারি myDrawCircleযা প্রথমে স্কেলিংয়ের প্রয়োজন যুক্তিগুলি স্কেল করবে এবং তারপরে drawCircleপরবর্তীগুলির সাথে কল করবে। এটি আমার কোডটি সম্ভবত আরও পঠনযোগ্য এবং বজায় রাখা সহজ করে তুলবে, তবে আমার প্রচুর মোড়ক ফাংশন লিখতে হবে যা মূর্খ sound

ফাংশন সাজসজ্জা । আমি কেবল বিদ্যমান মিডলওয়্যার ফাংশনগুলি সজ্জিত করতে পারতাম, যা ক্লাসের ইনস্ট্যান্টেশন হিসাবে সমস্ত পরামিতিগুলির জন্য স্বয়ংক্রিয় স্কেলিং সরবরাহ করে Vector3D, তবে সমস্যাটি হ'ল সেই ফাংশনগুলি একই পরামিতিগুলির উপস্থিতি listবা Vector2Dখুব বেশি কাজ করে এবং ডেকরেটারকে জানার কোনও উপায় থাকত না কোন তালিকাগুলি ছোট করতে হবে (উদাহরণস্বরূপ ব্যাসার্ধ) এবং কোনটি নয় (আরজিবি মান))

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

... যাইহোক: যেহেতু এটি একটি খুব সাধারণ সমস্যা, আমি অবাক হই যে যদি এমন কোনও প্রতিষ্ঠিত প্যাটার্ন রয়েছে যা এই সমস্যাটিকে মার্জিতভাবে সমাধান করে যা আমি খুঁজে পেতে ব্যর্থ হয়েছি।

পিএস: এই প্রকল্পের জন্য আমি পাইথনটি ব্যবহার করছি ( পাইগামের সাথে ) তবে - যদিও পাইথন / পাইগাম-নির্দিষ্ট উত্তরটি প্রশংসিত হয়েছে, তবে আমি নিদর্শনটির সাধারণ / উচ্চ-স্তরের বর্ণনায় এর কংক্রিট বাস্তবায়নের চেয়ে বেশি আগ্রহী।

আপনার সময় এবং দক্ষতার জন্য আপনাকে আগাম ধন্যবাদ।

উত্তর:


6

এটি করার প্রমিত উপায় হ'ল রেন্ডারিংয়ের সময় রূপান্তরটি করার জন্য ট্রান্সফর্ম ম্যাট্রিক্স সেটআপ করা। থ্রিডি রেন্ডারিংয়ের জন্য এটি ক্যামেরার জন্য মেট্রিক্সের রূপটি রূপান্তর করে।

বেশিরভাগ 2 ডি এপিআই-তে 2x3 ম্যাট্রিক্স বা পৃথক স্কেল, অনুবাদ এবং রোটেশন হিসাবেও ভিউ রুপান্তরকে নির্দিষ্ট করার একটি উপায় রয়েছে।

পাইগাম ডকুমেন্টেশনের একটি তাত্ক্ষণিক দৃষ্টিভঙ্গি থেকে বোঝা যায় আপনাকে নিজেই একটি ভিউ ট্রান্সফর্ম ম্যাট্রিক্স প্রয়োগ করতে হবে। আপনাকে কী এটির কার্যকারিতা যুক্ত করতে সক্ষম করার জন্য এটি পৃষ্ঠতলের শ্রেণি থেকে আপনার নিজের শ্রেণি তৈরি করতে দেয়?


আপনার উত্তরটি খুব কার্যকর (+1)। আমি আমার পৃষ্ঠের ক্লাসটি সাবক্লাস করতে পারি, তবে আপনার পোস্টে যা ইঙ্গিত করা হয়েছে তা যদি আমি অর্জন করতে পারি তবে অন্বেষণ করতে আমার আরও সময় প্রয়োজন। আমি সাধারণভাবে গেম প্রোগ্রামিং এবং গ্রাফিক্সে খুব নতুন, এই ম্যাট্রিক্স পদ্ধতির ব্যাখ্যা দেওয়ার জন্য আপনার কাছে কিছু লিঙ্ক আছে (বা এমনকি কোনও পৃষ্ঠকে স্কেল করার জন্য ম্যাট্রিক্স ব্যবহার করে কেবল গণিতও জড়িত?)। ধন্যবাদ!
ম্যাক

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

2

যেহেতু এটি একটি খুব সাধারণ সমস্যা তাই আমি অবাক হয়েছি যে কোনও প্রতিষ্ঠিত প্যাটার্ন রয়েছে যা এই সমস্যাটিকে মার্জিতভাবে সমাধান করে যা আমি খুঁজে পেতে ব্যর্থ হয়েছি।

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

আপনি যদি কোনও 3D এপিআই ব্যবহার করেন তবে আপনি এই কার্যকারিতাটি বিনামূল্যে পেতে পারেন - কেবল ক্যামেরা / ভিউপোর্ট প্যারামিটারগুলি পরিবর্তন করুন।

পাইগেম একটি পুরানো এপিআই এবং দুর্ভাগ্যক্রমে কেবল 2D এর পক্ষে উপযুক্ত। এমনকি যদি আপনি বিভিন্ন জুম স্তরের জন্য পর্যাপ্ত স্কেলিং সিস্টেমগুলি কাজ করতে পারেন তবে পারফরম্যান্স যথেষ্ট ভাল হবে না এবং চেহারাটি অগ্রহণযোগ্যভাবে খারাপ হতে পারে।

আমি পরামর্শ দেব যে আপনি যদি অনেকটা জুম বাড়িয়ে আউট করতে চান তবে আপনি যত তাড়াতাড়ি সম্ভব একটি আধুনিক 3D এপিআইতে যান। আমি পাইগলেট সুপারিশ করব তবে অন্যদেরও সম্ভবত থাকার সম্ভাবনা রয়েছে।


আপনার উত্তর (+1) জন্য আপনাকে ধন্যবাদ। আমি ইতিমধ্যে pyglets3 ডি সিমুলেশনের জন্য অতীতে ব্যবহার করেছি। এটি অবশ্যই তুলনায় আরও সক্ষম pygame, তবে 2 ডি এর জন্য সমর্থনটি একের তুলনায় মোটামুটি নিম্ন-স্তরের pygame। প্রাপ্ত নথিপত্র / উদাহরণগুলিও খুব কম বিশদযুক্ত, যা গেম বিকাশের আমার একজন শিক্ষানবিস হিসাবে আমার পক্ষে বোকা এবং আমার সর্বাধিক সাধারণ সম্পাদিত ক্রিয়াকলাপগুলির ভিত্তি বুঝতে হবে understand :) পিগমের "বয়স" হিসাবে: আপনি ঠিক বলেছেন। একটি আধুনিকীকরণের কাজ চলছে! :)
ম্যাক

যেমন: "এটি দুষ্প্রাপ্য যে আপনার 2 টি ভিন্ন জুম স্তরে চালানোর জন্য কোনও একক রুটিনের প্রয়োজন" ... আমি ভেবেছিলাম উইন্ডোর আকার / পুরো-স্ক্রিনের রেজোলিউশন পরিবর্তন করার সময় এটিই ব্যবহৃত হত। আপনার মন্তব্য থেকে আমি বুঝতে পেরেছি এটি নয়: পরিবর্তে "সাধারণ" কিসের কোনও পয়েন্টার?
ম্যাক

পাইগামের চেয়ে পাইগলেট আরও নিম্ন-স্তরের যেখানে আপনি 2D অপারেশন করছেন? উভয়ই আপনাকে কোডের 1 লাইনের সাথে একটি স্প্রিট আঁকতে দেয়। আপনি যখন 2 ডি গেমের উইন্ডোর আকার পরিবর্তন করেন, তখন পিক্সেল থেকে বিশ্ব-ইউনিটের অনুপাত প্রায় সর্বদা স্থির থাকে। সুতরাং আপনি কেবল আরও স্প্রিট আঁকতে শেষ করেছেন: আপনি এগুলি আলাদাভাবে আঁকেন না।
কাইলোটন

বিষয়গুলির নিম্ন-স্তরের দিকে: আমি দুটি লিবগুলির মধ্যে কোনওটির পক্ষে সত্যই বিশেষজ্ঞ নই, তবে পাইগলেটগুলিতে আমি পাইগামের দ্বারা প্রদত্ত গ্রুপ রেন্ডারিং আচরণগুলি ( pygame.sprite.LayeredUpdatesউদাহরণস্বরূপ) বাক্সের বাইরে প্রতিলিপি করতে পারি না । অপরিবর্তনীয় অনুপাতের জন্য: আপনি যা বলতে চাইছেন তা পেয়েছি। আপনি যে আচরণটি বর্ণনা করেছেন সেটিই আমি প্রতিলিপি করতে চাই না তবে আপনি কী বোঝাতে চেয়েছিলেন তা বুঝতে পেরেছি, স্পষ্টতার জন্য ধন্যবাদ! :)
ম্যাক

পাইগলেটে অর্ডারগ্রুপ অবজেক্টস রয়েছে - আপনি বা অন্য কারও আগ্রহী থাকলে ডক্স এখানে রয়েছে: pyglet.org/doc/pogramming_guide/displaying_images.html#sprites
Kylotan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.