सबसे पहले, मैं केवल थोड़ी देर के लिए अपना गेम तर्क लिख रहा हूं, इसलिए मैं माफी मांगता हूं अगर यह सीधे आगे लग सकता है।
मैं ट्रैक्टर पेड़ों और ग्रिड आधारित टक्कर का पता लगाने के बारे में बहुत कुछ पढ़ रहा हूं। मैं तर्क को समझता हूं - जब तक कि वस्तुएं मूल रूप से पास न हों, तब तक टकराव की जांच न करें। लेकिन इसका उल्लेख कभी नहीं किया गया कि वास्तव में यह कैसे क्रियान्वित होता है।
मेरे सिर में कब्ज़ेदार तरीके हैं, लेकिन मुझे यकीन नहीं है कि सबसे अच्छा है
सामान्य टक्कर परीक्षण - कोई अनुकूलन नहीं
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) की जांच करेंगे, बजाय सब कुछ जांचने के।
यह एक तुलनात्मक तुलना नहीं है क्योंकि टकराव की जाँच में आइटम लगातार आगे बढ़ रहे हैं ताकि ऑर्डर मिश्रित हो जाए। वह मुझे भ्रमित कर रहा है।
क्या प्रत्येक आइटम की जांच करना अधिक कुशल होगा, इस प्रकार पड़ोसियों की एक सरणी उत्पन्न करने के तनाव को दूर करना होगा।
या क्या पड़ोसी को खोजने के लिए यह अधिक कुशल है कि टकराव की जांच करने के लिए कई वस्तुओं के माध्यम से लूप न हो?
प्रत्येक टाइल पर डेटा को बदलते रहें बहुत ही गहन अस्वस्थ लगता है, इसलिए मुझे यकीन नहीं है कि अगर यह एक अच्छा विचार है ..
मैं एक टॉवर रक्षा खेल के बारे में सोच रहा हूँ जहाँ टॉवर को वस्तुओं का पता लगाने की आवश्यकता होती है यदि ऑब्जेक्ट उस पर गोली मारने से पहले सीमा में हैं। और यह सिर्फ मूर्खतापूर्ण लगता है कि सभी वस्तुओं की जांच करें जबकि कुछ समय में कोई भी वस्तु बिल्कुल भी पास नहीं होगी।
मैं लंबी पोस्ट के लिए माफी माँगता हूँ, हमेशा खुद को समझाने में परेशानी होती है!