2012-07-26 15 views
7

का उपयोग कर ऑब्जेक्ट्स को हटाएं। मैं विमान बनाने के लिए तीन.जेएस का उपयोग कर रहा हूं और कुछ बक्से डालकर मुझे कभी-कभी सभी बक्से हटाने की ज़रूरत है। तो मैं निम्न कोड के साथ यह करने के लिए कोशिश कर रहा हूँ:तीन.जेएस

for (i = 0; i < scene.children.length; i ++) { 
    var object = scene.children[ i ]; 
    if (object != plane && object != camera) { 
     scene.remove(object); 
    } 
} 

/यह प्रत्येक वस्तु है कि विमान या कैमरा ;-)/

यह कुछ बक्से को हटा देता है नहीं है को मारने, लेकिन नहीं उन सभी को = ( को कैसे नष्ट कर सकते हैं सभी बक्से? अभिवादन, जोस

+0

आपको अपनी विविध वस्तु को कॉल नहीं करना चाहिए। यह वस्तु की वास्तविक परिभाषा के लिए एक आरक्षित कीवर्ड है। – FlavorScape

+0

ऑब्जेक्ट ठीक होना चाहिए, ऑब्जेक्ट आरक्षित है (पूंजी ओ के साथ) – ama2

+0

यह समस्या नहीं है ... = (। @ Ama2 सही –

उत्तर

21

आपको इस तरह की सरणी वस्तुओं को हटाते समय सामने की तरफ वापस नहीं जाना चाहिए।

var obj, i; 
for (i = scene.children.length - 1; i >= 0 ; i --) { 
    obj = scene.children[ i ]; 
    if (obj !== plane && obj !== camera) { 
     scene.remove(obj); 
    } 
} 

क्या हो रहा है जब कोई नोड को हटा देता है, तो सभी इसे स्थानांतरित करने के बाद। आइए मान लें कि आप दृश्य हटाते हैं। बच्चे [0]: बच्चे [1] नया 0 बन जाएगा, 2 1 बन जाएगा,0 से सरणी। लम्बाई तक जाने पर, लूप पहले से ही आगे बढ़ चुका है और 1 नोड छोड़ रहा है हर किसी के लिए आप हटाते हैं।

अतिरिक्त प्लस के रूप में, यह थोड़ा तेज़ होना चाहिए, खासकर अगर आपके पास कई ऑब्जेक्ट्स हैं, क्योंकि scene.children.length केवल प्रत्येक लूप के बजाय, एक बार प्राप्त हुआ है।

+0

आपको मिल गया! धन्यवाद @Crazycatz !!! = D = D = D = D = डी = डी = डी –

+0

धन्यवाद! :) <3 –

1

आप का उपयोग करना चाहिए! == बजाय! = (अपने एक सा तेज)। क्या आप अपने पाश के माध्यम से कदम और दृश्य बच्चों की जांच करने की कोशिश की उसके बाद? हो सकता है कि आपने हवाई जहाज़ के लिए कुछ बक्से जोड़े क्योंकि बच्चे इसे हटाए नहीं जाएंगे पाश।

+0

अच्छा विचार। Thats समस्या नहीं थी, लेकिन श्रीमान @ सेबेस्टियन सैचलेबेन के विचार के लिए धन्यवाद। ग्रीटिंग्स –

2

@Crazycatz जवाब निश्चित रूप से सही है, लेकिन अब हम 2016 में हैं और मैनुअल यात्रा के बजाय हम सिर्फ .slice() फोन और सरणी प्रति अधिक पुनरावृति कर सकते हैं:

scene.children.slice().forEach(obj => scene.remove(obj)) 

या ES6 उपहार के बिना:

scene.children.slice().forEach(function(obj) { scene.remove(obj); }) 
संबंधित मुद्दे