প্রথমত, আমি কেবলমাত্র অল্প সময়ের জন্য নিজের গেমের যুক্তিটি লিখছি, তাই যদি এটিকে সরাসরি সামনে মনে হয় তবে আমি ক্ষমাপ্রার্থী।
আমি কোয়াড ট্রি এবং গ্রিড ভিত্তিক সংঘর্ষ সনাক্তকরণ সম্পর্কে প্রচুর পড়ছি। আমি যুক্তিটি বুঝতে পারি - মূলত বস্তুগুলি মূলত কাছাকাছি না থাকলে মূলত সংঘর্ষের জন্য যাচাই করবেন না। তবে এটি কখনই বাস্তবে এটি কার্যকর করে তা উল্লেখ করা হয়নি।
আমার মাথায় বেশ কয়েকটি সম্ভাব্য পদ্ধতি রয়েছে তবে কোনটি সবচেয়ে ভাল তা নিশ্চিত নই
সাধারণ সংঘর্ষ পরীক্ষা - কোন অপ্টিমাইজেশন
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
প্রতিবেশীদের স্টোর করুন (পদ্ধতি 1) তবে আমরা যদি কেবলমাত্র কাছাকাছি থাকা বস্তুগুলি পরীক্ষা করতে সংঘর্ষগুলি অনুকূল করতে চাই। আমরা কি এখনও সমস্ত বস্তুর মধ্য দিয়ে চলি, বা চেক করার জন্য আমরা কাছের বস্তুগুলির সাথে একটি অ্যারে তৈরি করি?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
সমস্ত বস্তু লুপ করুন তবে কেবল সংঘর্ষের জন্য প্রতিবেশীদের পরীক্ষা করুন (পদ্ধতি 3) অন্যান্য সম্ভাবনা হ'ল আমরা এখনও সমস্ত কিছু লুপ করছি তবে সংঘর্ষের পরীক্ষার আগে বস্তুগুলি কাছে রয়েছে কিনা তা পরীক্ষা করে দেখুন।
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
টাইলের ডেটাগুলিতে অবজেক্টগুলি সঞ্চয় করুন (পদ্ধতি 3) টাইল ভিত্তিক সিমেট ব্যবহার করে অন্য বিকল্পের জন্য অনুমতি দেওয়া; টাইলের ডেটাতেই নির্দিষ্ট টাইলের উপর থাকা অবজেক্টগুলিকে সঞ্চয় করুন। আশেপাশের টাইলগুলিতে কোন টাইলের সাথে টাইলটি পড়তে পারে এমন কোনও বস্তু রয়েছে তা পরীক্ষা করে দেখুন:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
আমি সবসময় উদাহরণ হিসাবে বাস্তব জগতের দিকে দেখার চেষ্টা করি। আমি যদি আইটেমগুলিকে একই রঙের সাথে তুলনা করতে চাইতাম তবে রঙের সাথে না মেলে এমনকি প্রতিটি আইটেমটি পরীক্ষা করা অযৌক্তিক মনে হবে (পদ্ধতি 2, প্রতিটি আইটেম পরীক্ষা করুন)। আমি সম্ভবত একই রঙ (আইটেমগুলি একে অপরের কাছাকাছি) দিয়ে সংগ্রহ করব এবং সমস্ত কিছু যাচাই করার পরিবর্তে সেগুলি (পদ্ধতি 1) পরীক্ষা করব।
সংঘর্ষের চেকিংয়ের আইটেমগুলি ক্রমাগত চলমান থাকে যাতে অর্ডার মিশ্রিত হয় এটি এটিকে অনুমোদনের তুলনা করে না। যা আমাকে বিভ্রান্ত করছে।
প্রতিবেশীদের একটি অ্যারে জেনারেট করে রাখার স্ট্রেনটি সরিয়ে প্রতিটি আইটেম পরীক্ষা করা কি আরও দক্ষ হবে?
অথবা প্রতিবেশীদের যাতে সংঘর্ষটি চেক করার জন্য এতগুলি বস্তুর মধ্য দিয়ে লুপ না করতে হয় তা আরও দক্ষ?
প্রতিটি টাইলের ডেটা পরিবর্তন করা পাশাপাশি খুব নিবিড় বলে মনে হচ্ছে, সুতরাং আমি নিশ্চিত নই যে এটি একটি ভাল ধারণা ..
আমি একটি টাওয়ার প্রতিরক্ষা গেমের কথা ভাবছিলাম যেখানে টাওয়ারটি শ্যুট করার আগে যদি বস্তুগুলি সীমার মধ্যে থাকে তবে টাওয়ারটি সনাক্ত করতে হবে। সমস্ত আইটেমগুলি চেক করা কেবল নির্বোধ বলে মনে হয় যখন কোনও সময়ে কোনও বস্তু একেবারেই কাছে আসবে না।
আমি দীর্ঘ পোস্টের জন্য ক্ষমা চাইছি, নিজেকে বোঝাতে সর্বদা সমস্যা হয়!